深入Nginx之配置文件详解

  • 2019-08-28 16:03:28
  • Sun Xiaozhi
  • 109

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强。

在工作中,我们与 Nginx 打交道更多的是通过其配置文件来进行。那么掌握这些配置项各自的作用就很有必要了。

nginx.conf 的内容通常是这样的:

#核心摸块
...
...        

#事件模块
events {        
   ...
}

# http 模块
http {
    # server块
    server {      
        # location块
        location [PATTERN] {  
            ...
        }

        location [PATTERN] {
            ...
        }
    }

    server {
      ...
    }
}

# mail 模块
mail {     
     # server块
     server {
          ...
    }
}

核心模块

#用户
user nginx ; 

#工作进程,根据硬件调整,大于等于cpu核数
worker_processes 8;

#错误日志
error_log logs/nginx_error.log crit;

#pid放置的位置
pid logs/nginx.pid;

#指定进程可以打开的最大描述符,这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 204800;

事件模块

events
{
    #使用epoll的I/O 模型
    #补充说明:
    #与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. 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
    use epoll;

    #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行,每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections
    worker_connections 204800;

    #keepalive超时时间。
    keepalive_timeout 60;

    #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
    #分页大小可以用命令getconf PAGESIZE取得。
    #[root@web001 ~]# getconf PAGESIZE 
    #[root@web001 ~]# 4096
    #但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
    client_header_buffer_size 4k;

    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=65535 inactive=60s;

    #这个是指多长时间检查一次缓存的有效信息。
    open_file_cache_valid 80s;

    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
    open_file_cache_min_uses 1;
}

HTTP模块

{
    include mime.types; #设定mime类型,类型由mime.type文件定义

    default_type application/octet-stream;

    log_format main '$remote_addr $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status';

    log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

    server{
         listen 80;

         servername 127.0.0.1;

         index index.html index.htm index.php;

         root your_path;  #根目录

         location ~ [^/]\.php(/|$) {
             try_files $uri =404;
             fastcgi_pass  unix:/tmp/php-cgi.sock;
             fastcgi_index index.php;
             include fastcgi.conf;
         }

         #设定查看Nginx状态的地址
         location /NginxStatus {
             stub_status on;
             access_log on;
             auth_basic "NginxStatus";
             auth_basic_user_file conf/htpasswd;
         }

         #禁止访问.htxxx文件
         location ~ /\.ht {
             deny all;
         }
    }
}

负载均衡

负载均衡配置

Nginx 的负载均衡需要用到 upstream 模块,可通过以下配置来实现:

upstream test-upstream {
    # 使用 ip_hash 算法分配
    ip_hash;

    # 要分配的 ip
    server 192.168.1.1;
    server 192.168.1.2;
}

server {
    location / {
        proxy_pass http://test-upstream;
    }
}

其他

location 查找规则

location = / { 
    # 精确匹配 / ,主机名后面不能带任何字符串
    [ config A ]
}

location / {
    # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
    # 但是正则和最长字符串会优先匹配
    [ config B ]
}

location /documents/ {
    # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
    # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
    [ config C ]
}

location ~ /documents/Abc {
    # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
    # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
    [ config CC ]
}

location ^~ /images/ {
    # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
    [ config D ]
}

location ~* .(gif|jpg|jpeg)$ {
    # 匹配所有以 gif,jpg或jpeg 结尾的请求  
    # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
    [ config E ]
}

location /images/ {
    # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
    [ config F ]
}

location /images/abc {
    # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
    # F与G的放置顺序是没有关系的
    [ config G ]
}

location ~ /images/abc/ {
    # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ config H ]
}

正则查找优先级从高到低依次如下:

“ = ” 开头表示精确匹配,如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。

“ ^~ ” 开头表示uri以某个常规字符串开头,不是正则匹配。

“ ~ ” 开头表示区分大小写的正则匹配。

“ ~* ”开头表示不区分大小写的正则匹配。

“ / ” 通用匹配, 如果没有其它匹配,任何请求都会匹配到。

变量

$args此变量与请求行中的参数相等
$content_length等于请求行的“Content_Length”的值。
$content_type等同与请求头部的”Content_Type”的值
$document_root等同于当前请求的root指令指定的值
$document_uri与$uri一样
$host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样
$limit_rate允许限制的连接速率
$request_method等同于request的method,通常是“GET”或“POST”
$remote_addr客户端ip
$remote_port客户端port
$remote_user等同于用户名,由ngx_http_auth_basic_module认证
$request_filename当前请求的文件的路径名,由root或alias和URI request组合而成
$request_body_file
$request_uri含有参数的完整的初始URI
$query_string与$args一样
$sheeme http模式(http,https)尽在要求是评估例如
Rewrite ^(.+)$ $sheme://example.com$; Redirect;
$server_protocol等同于request的协议,使用“HTTP/或“HTTP/
$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。
$server_name请求到达的服务器名
$server_port请求到达的服务器的端口号
$uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index