nginx 配置文件介绍


1、nginx.conf 的文件结构

# 全局块
...
# events 块
events{
     ...
}
# http块
http{
    #http全局块
    ...
    #server 块
    server{
        #server全局块
        ...
        #location块
        location{
            ...
        }
        location{
            ...
        }
    }
}
  • 全局快: 通常包含nginx服务器的用户(组)、允许生成的worker process数,nginx进程pid存放路径、日志存放路径和类型
    # 例如:
    user nobody nobody; # 这个也是配置文件默认的
    worker process 8; # 通常用cpu核数来定,如果不清楚也可以用auto来设置,worker process auto;
    pid /var/run/nginx.pid; #  也支持相对路径如:pid sbin/nginx.pid;
    error_log /var/log/nginx/error.log error; # error_log 日志文件 日志类型。日志类型可以为debug、info、notice、warn、error、crit、alert、emerg等
    
  • events 块: 通常包含是否开启对多worker process 下的网络连接进行序列化、是否允许同时接收多个网络连接、选取那种驱动模型处理连接请求、每个worker process 可以同时支持的最大连接数等。 这一部分对nginx服务器的性能影响比较大。

    events {
      accept_mutex on; # 默认为on 状态,表示将会对多个ngiinx进程接收进行序列化,防止多个进程对连接进行争抢。
      multi_accept on; #默认为off,off 表示每个worker process 一次只能接收一个新到的网络连接
      use epoll; #其他驱动模型还包含:select、poll、kqueue、rtsig、/dev/poll、eventport。
      worker_connections 512; # 默认为512,主要用来设置允许每个worker process同时开启的最大连接数。数值不能超过操作系统支持打开的最大文件句柄数。
    }
    
  • http 块: http 块是最重要的块,nginx的所有功能都在这个块体现 http的全局块:包括文件引入如:include vhosts/*.conf; 、MIME-Type 定义、日志定义、是否使用sendfile传输文件、连接超时时间、连接请求数上限等

2、配置经验分享

  • 解决惊群问题 所谓惊群问题就是当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时唤醒,但是只有一个进程获得连接。如果每次唤醒的进程数目太多,无形中就会影响一部分系统性能。 若要解决惊群问题可以在events块中配置如下:
    accept_mutex on; # 默认为on 状态,表示将会对多个ngiinx进程接收进行序列化,防止多个进程对连接进行争抢。
    
  • 设置是否允许同时接收多个网络连接
    multi_accept on; #默认为off,off 表示每个worker process 一次只能接收一个新到的网络连接
    # 此配置只能在events块中
    
  • 事件驱动模型的选择
    use epoll; #其他驱动模型还包含:select、poll、kqueue、rtsig、/dev/poll、eventport。
    # 此配置只能在events块中
    
  • 最大连接数
    worker_connections 512; # 默认为512,主要用来设置允许每个worker process同时开启的最大连接数。数值不能超过操作系统支持打开的最大文件句柄数。
    # 此配置只能在evnets块中
    
  • 自定义服务日志
    access_log  /var/log/nginx/access.log access; #后面的access 是log_format 中指定的名字 ,
    #access_log 指令可以在http块,server块,location块中设置
    log_format access "$http_x_forwarded_for | $http_host | $time_local | $request| $status | $body_bytes_sent | "
                   "$request_body | $content_length | $http_referer| $http_user_agent |"
                   "$remote_addr | $hostname | $upstream_addr | $upstream_response_time | $request_time";
    # log_format 指令只能在http块设置
    #默认的格式是 log_format combined  '$remote_addr - $remote_user  [$time_local]  '
                                     ' "$request"  $status  $body_bytes_sent  '
                                     ' "$http_referer"  "$http_user_agent" ';
    
  • 配置允许sendfile 方式传输文件
    sendfile on;默认是off的。
    sendfile_max_chunk 128k;如果设置0k表示不限制,这个指令指的是每个worker process 每次调用sendfile()传输的数据最大不能超过这个值。
    #这个指令可以在http块,server块,location块中设置
    
  • 配置连接超时时间
    keepalive_timeout 120s 100s;# 120s表示服务器端保持连接的时间,100s表示发给哭护短的应答报文头部中Keep-Alive 的超时时间。
    #这个指令可以在http块,server块,location快中设置
    
  • 虚拟主机的配置
    # 通配符
    server_name *.mysqlserver.com www.myserver.*;
    # 正则
    server_name ~^www\d+\.myserver\.com$; # 以~开头作为正则表达式字符串的开始标志。. 号在正则中有特殊意义,所以要用\进行转移。
    #  正则中用()括起来的值可以传递到$1 $2 $3 ... 中,最为后面调用。
    server_name ~^www\.(.+)\.com$; # www.myserver.com 进来的请求,myserver 就会被记录在$1中。
    # 主机优先级:
    # 准确匹配-->通配符在前面-->通配符在最后-->正则表达式匹配
    
  • 配置location块
    location [ = | ~ | ~* | ^~ ] uri  { ... }
    
    [] 表示可选,就是里面的部分是可选的
    = 表示精确匹配,后面跟着标准uri(相对于正则uri,如\.php$),要求字符串与uri严格匹配
    ~ 用于表示uri包含正则表达式,并且区分大小写
    ~* 用于表示uri包含正则表达式,并且不区分大小写
    (如果uri包含正则表达式,就必须使用~ 或者 ~* 进行标示)
    ^~ 用于标准uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求而不再使用location块中的正则uri和请求字符串做匹配
    
  • 配置请求的根目录
    location /data/
    {
      root /var/html;
    }
    # 当location 块接收到 “/data/index.html” 的请求时,就会在/var/html/data/ 目录下找到index.html 响应请求。
    
  • 更改location的URI
    location ~ ^/data/(.+\.(htm|html))$
    {
      alias /var/html/other/$1;
    }
    # 当location块接收到“/data/index.htm”的请求时,匹配成功,之后根据alias指令,nginx将到/var/html/other 目录下找index.htm.