nginx通常用作web服务器和反向代理,不同应用场景有一些特殊配置,还有一些公共的基础配置是nginx运行的基础,这些配置默认都在nginx.conf配置文件中定义,也可以使用include指令引入其他配置文件。nginx每个配置指令末尾以“;”结束,不需要的配置或说明使用#符号注释或者直接删除。

nginx.conf配置总共分为几个部分:全局配置块、events配置块、http配置块、server配置块、location配置块、upstream配置块。

一、全局配置块

包含nginx运行的用户组,nginx进程pid文件存放路径,日志存放路径和日志级别,引入其他配置文件(include),允许运行的nginx worker进程数等,这些配置指令一般在配置文件开头定义,不加{}包围,不管nginx用作什么都会影响nginx运行情况,

user nginx;  #设置运行nginx的用户
worker_processes auto; #nginx worker进程数量,自动根据CPU个数拉起worker进程,worker进程需小于等于CPU数
worker_cpu_affinity auto; #nginx进程绑定CPU,自动绑定,其他设置方式:no、0001 0000掩码方式

error_log /usr/local/nginx/logs/error.log error; ##error log的路径并且日志级别设为error
pid /usr/local/var/run/nginx.pid; ##nginx的master 进程id
worker_rlimit_nofile 800000; #nginx worker进程能打开的文件描述符数量上限,可通过ulimit -a查看Linux系统能打开的文件描述符上限

二、events配置块

包含每个nginx worker进程的最大连接数限制,配置处理请求的事件驱动模型(select/poll/epoll),配置一个进程能否同时接受多个网络连接,开启网络连接序列化等。events配置块会影响nginx进程处理用户请求。

events {
    accept_mutex on; #当新连接到达,accept_mutex会使worker串行处理请求,仅每次仅一个worker被唤醒处理新到达的请求,可防止惊群现象发生,关闭则会所有worker被唤醒处理新的请求,默认打开。
    multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
    use epoll; #设置事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections 1024; #每个worker能处理的最大连接数,默认为512
}

三、http配置块

http块内可嵌套多个server块,包含代理配置、缓存、日志定义等绝大多数功能和第三方模块的配置,如mime-type定义、日志自定义、sendfile传输、连接超时时间、单连接请求数等。

http {
    include mime.types;
    default_type text/html;
client_max_body_size 100m; #设置HTTP body消息体的最大值,主要用于对通过HTTP协议上传文件的大小进行限制。
client_body_buffer_size 10m; 
#nginx作为反向代理时,默认开启了与client的keepalive,同时要求client发送HTTP请求keepalive。为了提高QPS,有时需要对HTTP调整keepalive_timeout和keepalive_requests
keepalive_timeout 60; #设置一个请求完成后连接保持多少秒
keepalive_requests 10000; #设置一个keepalive连接中能够处理的请求最大数量,当请求数量到达最大值,关闭连接。默认为100。当QPS比较大时,必须调大keepalive_requests值。keepalive_requests偏小会导致长连接频繁的中断连接后重新建立连接,系统会有大量的TIME_WAIT的socket连接占用端口。
sendfile on; # 是否使用sendfile系统调用传输文件,sendfile系统调用避免了内核空间和用户空间之间的数据拷贝,全部在内核完成,效率高,称为零拷贝技术。Linux2.0之后的一个系统调用,减少kernal mode和user mode之间的切换,减少数据在kernal buffer、user buffer和协议栈之间的拷贝。sendfile和mmap都是典型的零拷贝技术。
tcp_nopush on; # 通过使用Linux tcp_cork,需要传输数据大于一定值后,将数据聚合发送。只有使用sendfile函数时才tcp_nopush生效。
tcp_nodelay on; #设置缓冲区里的数据立即发送出去,好处是request和reply的发送时间提前,整体响应时间缩短了,弊端就是,如果只需要传输 1 Byte数据,在加上40Byte的报头就会导致网络带宽利用率非常低。该选项是禁用Nagle算法的。
server_tokens off; 
more_set_headers "Server:elb";
server {
 ...
}
}

四、server配置块

配置虚拟主机参数,定义一个web服务,server块嵌套在http块中,一个http块中可以配置多个server块。

server {
        keepalive_requests 120; #单连接请求上限次数。
        listen 4545; #监听端口
        server_name 127.0.0.1; #监听的服务域名,可使用正则表达式
        location ~*^.+$ {       
        ...
        } 
}

五、location配置块

配置请求路径,定义该路径的请求处理过程,包括黑名单、白名单、代理配置等,location块嵌套在server块中,一个server块中可以配置多个location块。

        location ~* ^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           root html; #设置匹配该location请求的根目录,
           index index.html; #设置默认页
           proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1; #设置黑名单,拒绝访问的ip
           allow 172.18.5.54; #设置白名单,允许访问的ip           
        } 
       location ~ \.php$ {
           proxy_pass http://192.168.0.10; #反向代理到192.168.0.10
       }

六、upstream配置块

当nginx用于负载均衡时,负载均衡模块会从upstream指令定义的后端服务器中选取一台转发,在upstream块中定义负载均衡调度算法包括轮询、加权轮询、ip_hash等。当某台后端服务器不可用,nginx尝试访问失败后会重新从剩余server中选取一台转发。
weight设置加权轮询时,每个服务器的调度权重。
max_fails设置nginx访问后端服务器失败的尝试次数。fail_timeout设置的时间段内,nginx尝试访问服务器失败的次数达到max_fails,就认为该服务器状态unavailable,并在下一个fail_timeout的时间周期内,nginx不会再尝试访问该服务器。默认max_fails为1,设置为0时就停止统计失败尝试次数,认为服务器一直可用。
fail_timeout设置统计尝试失败次数的周期,在这个周期内,服务器访问失败次数达到设定的失败次数(max_fails)后,服务器就被认为不可用。默认fail_timeout是10秒。
keepalive 设置每个nginx worker进程能缓存的空闲keepalive连接数,当连接数达到上限时,最近最少使用的连接将被关闭(LRU算法)。
例如:

upstream  mysvr {
    server 10.x.x.x:80 max_fails=3 fail_timeout=10s weight=1; 
    server 10.x.x.x:80 max_fails=3 fail_timeout=10s weight=2;
    keepalive 2000;
}