Nginx服务管理与配置

Nginx服务管理与配置

前言: 我这里讲解nginx服务的安装以及配置和管理

nginx和httpd的区别是什么?

nginx不但跟httpd一样可以作为web服务,还有负载均衡的作用,处理请求上它是异步非堵塞型的,而httpd是堵塞型的。

相对httpd来说nginx是轻量级的,在高并发下 nginx 能保持低资源低消耗高性能,处理静态文件,性能比httpd高得多,它支持7层负载均衡,它还是个优秀的反向代理服务

一、nginx安装

nginx下载地址:http://nginx.org/download/

源码安装

1.安装依赖工具和包

#更新epel源和安装编译工具
 yum install -y epel-release
yum clean all && yum makecache
yum -y install gcc gcc-g++ make
#安装依赖包
yum -y install openssl openssl-devel pcre-devel curl-devel freetype-devel

2.编译安装nginx

#添加apache用户和用户组
groupadd nginx && useradd -M -s /sbin/nologin nginx -g nginx
tar zxf nginx-1.21.6.tar.gz && cd nginx-1.21.6
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install

启动服务:

/usr/local/nginx/sbin/nginx

yum/apt安装

centos系统使用的是yum,ubuntu和debian使用的是apt

1.yum安装

yum -y install nginx

2.apt安装

apt -y install nginx

二、nginx服务配置

配置文件

注意:个人喜好我安装在/usr/local/nginx这个目录下,根据个人安装而定

大家可以通过配置来配置httpd服务的运行设置
配置文件路径:/usr/local/nginx/conf/nginx.conf
yum和apt安装的话一般配置文件在:/etc/nginx/nginx.conf

注意:如果是yum或者apt安装的话一定要看是否加载启用了其他子配置文件,以免修改出错不容易找到问题

nginx的配置文件主要分为5个块(全局块、evebts块、http块、server块、location块)
1、全局块:一般配置nginx用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx与用户的网络连接。有每个进程的最大连接数,事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:可以嵌套多个location,配置虚拟站点的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况,一个server中可以有多个location。

nginx配置文件的结构分布:

              #全局配置
events {
     #events块配置
}
http {
     #http块配置
    server {
        #server块配置
        location / {
              #location块配置
        }
        location /web/ {
              #location块配置
        }
    }
    server {
             #server块配置
        location / {
             #location块配置
        }
    }
}

全局配置项目

user  nginx;  #程序用户
group nginx;  #程序用户组
worker_processes  1;  #进程数量,建议和cpu核心数一致
#指定错误日志的存放位置和级别[ debug | info | notice | warn | error | crit ]
error_log  logs/error.log;   #错误日志位置
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid      logs/nginx.pid;   #nginx进程pid存放文件位置
include  conf/conf.d/*.conf  #支持像下面配置一样的全局包含的方法

events块

events
{
use epoll;
#使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定
#补充说明:与apache相类,nginx针对不同的操作系统,有不同的事件模型
#A)标准事件模型
#Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
#B)高效事件模型
#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃
#Epoll:使用于Linux内核2.6版本及以后的系统。
#/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+
#Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁
worker_connections 1024;   #每个工作进程的最大连接数量
keepalive_timeout 60;  #keepalive超时时间
client_header_buffer_size 4k;  #客户端请求头部的缓冲区大小
open_file_cache max=65535 inactive=60s; #这个是指多长时间检查一次缓存的有效信息,使用字段:http, server, location
open_file_cache_valid 80s;   #open_file_cache指令中的inactive参数时间内文件的最少使用次数
#这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,
#如果使用更大的值,文件描述符在cache中总是打开状态
open_file_cache_min_uses 1; 
open_file_cache_errors on;   #是否在搜索一个文件是记录cache错误.
}

http块

http
{
include mime.types;   #设定mime类型,类型由mime.type文件定义
access_log  logs/host.access.log  main;  #指令指定日志文件的存放路径
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
#日志格式设置
$remote_addr$http_x_forwarded_for     #记录客户端的ip地址
$remote_user         #记录客户端用户名称
$time_local          #记录访问时间与时区
$request             #记录请求的url与http协议
$status              #记录请求状态;成功是200
$body_bytes_sent     #记录发送给客户端文件主体内容大小
$http_referer        #记录从那个页面链接访问过来的
$http_user_agent     #记录客户浏览器的相关信息;
#通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了
#通过$remote_add拿到的IP地址是反向代理服务器的iP地址
#反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息
#用以记录原有客户端的IP地址和原来客户端的请求的服务器地址

server_names_hash_bucket_size 128;
#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的

client_header_buffer_size 4k;
#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,
#一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k

large_client_header_buffers 8 128k;
#客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值
#如果header过大,它会使用large_client_header_buffers来读取
 
open_file_cache max=102400 inactive=20s;
这个指令指定缓存是否启用。
例: open_file_cache max=1000 inactive=20s;
 
open_file_cache_valid 30s;
#使用字段:http, server, location 指定何时需要检查open_file_cache中缓存项目的有效信息
 
open_file_cache_min_uses 2;
#使用字段:http, server, location 
#指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数
#如果使用更大的值,文件描述符在cache中总是打开状态
 
open_file_cache_errors on;
#使用字段:http, server, location 指定是否在搜索一个文件是记录cache错误

client_max_body_size 300m;  #设定通过nginx上传文件的大小
sendfile on;
#指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on
#如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime

tcp_nodelay on;
tcp_nopush on;
#此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB

keepalive_timeout 120;    #keepalive超时时间

client_body_buffer_size 512k;
如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常
#如果注释该指令,使用默认的client_body_buffer_size设置,
#也就是操作系统页面大小的两倍,<br>8k或者16k,问题就出现了
#无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误

#gzip 模块
gzip on;     #gzip模块是否开启
gzip_static on;  #静态页面压缩
gzip_min_length 1k;       #设置允许压缩的页面最小字节数,默认值20
gzip_buffers 4 16k;        #设置系统获取几个单位的buffer用于存储gzip的压缩结果数据流
gzip_http_version 1.1;     #用于识别 http 协议的版本
gzip_comp_level 6;       #gzip压缩比
gzip_types mime-type ... ;     #匹配mime类型进行压缩
gzip_proxied any;          #Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩

#upstream 模块
#加权轮询
upstream back_openaccess {
            server 192.168.0.101:80 weight=2 max_fails=3 fail_timeout=10s;
            server 192.168.0.102:80 weight=2 max_fails=3 fail_timeout=10s;
        }
#ip_hash
upstream back_openadmin {
            ip_hash;
            server 192.168.0.101:80;
            server 192.168.0.102:80;
        }
加权轮询配置参数:
  down     #表示单前的server暂时不参与负载.
  weight   #默认为1.weight越大,负载的权重就越大。
  max_fails  #允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
  fail_timeout   #max_fails次失败后,暂停的时间。
  backup         #其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
  max_conns      #限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。
               #注意:1.5.9之后的版本才有这个配置
}

server块

server
{
listen 80  #监听端口
server_name   #服务器域名
root       #设定响应的根目录
include    #引入其他的配置文件。  
underscores_in_headers      #支持读取非nginx标准的用户自定义header的,但是需要在http或者server下开启header
proxy_redirect default [ default|off|redirect replacement ]    #修改被代理服务器返回的响应头
}

location块

location /
{
server_name   #服务器域名
root       #设定响应的根目录,server块下配置了的话建议先注释
proxy_pass 127.0.0.1:80;    #转发的代理路径
}

多站点配置

你需要配置几个站点就添加几个server块就行了,可以通过修改每个站点的域名或者端口来进行划分不同站点的区别

比如:下面不同域名指向不同的响应的根目录

server {
     listen       80;
     server_name  www.aaa.com;
     location / {
        root   /var/www/html/aaa;
        index  index.html index.php;
     }
}
server {
     listen       80;
     server_name  www.bbb.com;
     location / {
        root   /var/www/html/bbb;
        index  index.html index.php;
     }
}

三、nginx服务管理

日志管理

Nginx没有类似apache的cronlog日志分割处理能力,所以我这里自己写的脚本来进行切割

#!/bin/bash
#定义各种变量
date=`date +%Y-%m-%d`
logname="/usr/local/nginx/logs/access.log"
logpath="/usr/local/nginx/logs"
#移动日志到存放目录并清空原来日志
cat $logname > ${logpath}/access-$date.log
echo > $logname
#定期删除多余的日志文件(删除30天之前的)
find $logpath -mtime +30 | xargs rm -rf

访问控制

nginx跟apache一样可以通过地址和用户验证实现访问控制

地址限制访问

修改配置文件location块
加入deny和allow项实现

server {
     listen       80;
     server_name  www.aaa.com;
     location / {
        root   /var/www/html/aaa;
        index  index.html index.php;
		deny 192.168.0.100;
        allow all;
     }
}

以上就是不允许192.168.0.100访问,deny和allow也可以更改顺序实现先后条件交换

用户密码限制访问

跟apache一样的使用工具:htpasswd

#下载工具
yum install -y  httpd-tools
#生成用户密码认证文件
htpasswd -c /usr/local/nginx/conf/.nginxpasswd webadmin
#修改.nginxpasswd的权限为400
chmod 400 /usr/local/nginx/conf/.nginxpasswd

修改配置文件,在需要限制的location加入

auth_basic "secret";
auth_basic_user_file  /usr/local/nginx/conf/.nginxpasswd;

就可以了

nginx优化管理

隐藏版本号

nginx默认是没有隐藏版本号的,可以通过curl -I 地址的方式查看版本
我们这里可以有两种方式
1.编译安装前
在http里添加server_tokens off;配置项就可以隐藏版本
2.安装后
编译之前修改安装包里src/core目录下的nginx.h文件
注释下面两个参数

#define NGINX_VERSION      "1.21.6"
#define NGINX_VER          "nginx/" NGINX_VERSION

连接超时和进程优化

1.设置连接超时
为了避免一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
修改nginx.conf配置文件:

Keepalive_timeout 65 180 ;  #默认时间65 超时时间180

2.进程优化
优化nginx进程数量,修改 Nginx 的配置文件的 worker_processes 参数,一般设为 CPU 的个数或者核数,
在高并发的情况下可设置为 CPU 个数或者核数的 2 倍,可以查看 CPU 的核数以确定参数
查看进程:

cat /proc/cpuinfo | grep -c "physical"

默认情况,nginx的多个进程可能更多的跑在一个CPU上
可以分配不同的进程给不同的CPU处理充分利用硬件多核多CPU
在一台 4 核 CPU 服务器上,可以设置每个进程分别由不同的CPU核心处理,达到 CPU 的性能最大化
修改nginx.conf配置文件:

worker_processes 4;     #开启进程数
worker_cpu_affinity 0001 0010 0100 1000  #逻辑CPU

注意:1.16版本可以设置自动
work_processes auto;

防盗链

Nginx 的防盗链原理是加入 location 项,用正则表达式过滤图片类型文件,对于信任的 网址可以正常使用,不信任的网址返回相应的错误图片
修改nginx.conf配置文件:

location ~*\.(png|jpg|gif|swf)$ {
            valid_referers none blocked *.bbb.com bbb.com;
            if ($invalid_referer) {
                   rewrite ^/http://192.168.0.100/error.jpg;
            }   
        }