美文网首页
Nginx 配置文件详解

Nginx 配置文件详解

作者: 陈小陌丿 | 来源:发表于2017-02-08 10:13 被阅读0次

    配置文件详解

    #定义Nginx运行的用户和用户组
    user www www;
     
    #nginx进程数,建议设置为等于CPU总核心数。
    worker_processes 8;
     
    #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
    error_log ar/loginx/error.log info;
     
    #进程文件
    pid ar/runinx.pid;
     
    #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
    worker_rlimit_nofile 65535;
     
    #工作模式与连接数上限
    events
    {
        #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
        use epoll;
        
        #单个进程最大连接数(最大连接数=连接数*进程数)
        worker_connections 65535;
    }
     
    #设定http服务器
    http
    {
        include mime.types; #文件扩展名与文件类型映射表
        
        default_type application/octet-stream; #默认文件类型
        
        #charset utf-8; #默认编码
        
        server_names_hash_bucket_size 128; #服务器名字的hash表大小
        
        client_header_buffer_size 32k; #上传文件大小限制
        
        large_client_header_buffers 4 64k; #设定请求缓
        
        client_max_body_size 8m; #设定请求缓
        
        sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
        
        autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
        
        tcp_nopush on; #防止网络阻塞
        
        tcp_nodelay on; #防止网络阻塞
        
        keepalive_timeout 120; #长连接超时时间,单位是秒
        
         
        #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 128k;
         
        #gzip模块设置
        gzip on; #开启gzip压缩输出
        gzip_min_length 1k; #最小压缩文件大小
        gzip_buffers 4 16k; #压缩缓冲区
        gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
        gzip_comp_level 2; #压缩等级
        gzip_types text/plain application/x-javascript text/css application/xml;
        #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
        
        gzip_vary on;
        
        #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
         
        upstream blog.ha97.com {
            #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
            server 192.168.80.121:80 weight=3;
            server 192.168.80.122:80 weight=2;
            server 192.168.80.123:80 weight=3;
        }
         
        #虚拟主机的配置
        server
        {
            #监听端口
            listen 80;
            #域名可以有多个,用空格隔开
            server_name www.ha97.com ha97.com;
            
            index index.html index.htm index.php;
            
            root /data/www/ha97;
            
            location ~ .*.(php|php5)?$
            {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
            }
            
            #图片缓存时间设置
            location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
            {
                expires 10d;
            }
            
            #JS和CSS缓存时间设置
            location ~ .*.(js|css)?$
            {
                expires 1h;
            }
            
            #日志格式设定
            log_format access '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $http_x_forwarded_for';
            
            
            #定义本虚拟主机的访问日志
            access_log ar/loginx/ha97access.log access;
         
            #对 "/" 启用反向代理
            location / {
                
                proxy_pass http://127.0.0.1:88;
                
                proxy_redirect off;
                
                proxy_set_header X-Real-IP $remote_addr;
                
                #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                
                #以下是一些反向代理的配置,可选。
                proxy_set_header Host $host;
                client_max_body_size 10m; #允许客户端请求的最大单文件字节数
                client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
                proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
                proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
                proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
                proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
                proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
                proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
                proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            }
         
            #设定查看Nginx状态的地址
            location /NginxStatus {
                stub_status on;
                
                access_log on;
                
                auth_basic "NginxStatus";
                
                auth_basic_user_file confpasswd;
                #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
            }
         
            #本地动静分离反向代理配置
            #所有jsp的页面均交由tomcat或resin处理
            location ~ .(jsp|jspx|do)?$ {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://127.0.0.1:8080;
            }
            
            #所有静态文件由nginx直接读取不经过tomcat或resin
            location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
            { 
                expires 15d; 
            }
            
            location ~ .*.(js|css)?$
            { 
                expires 1h;
            }
        }
    }
    

    upstream 配置详解

    轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

    weight

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    例如:

    upstream bakend {
        server 192.168.159.10 weight=10;
        server 192.168.159.11 weight=10;
    }
    

    ip_hash

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    例如:

    upstream resinserver{
        ip_hash;
        server 192.168.159.10:8080;
        server 192.168.159.11:8080;
    }
    

    4、fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    upstream resinserver{
        server server1;
        server server2;
        fair;
    }
    

    5、url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

    例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    upstream resinserver{
        server squid1:3128;
        server squid2:3128;
        hash $request_uri;
        hash_method crc32;
    }
    

    定义负载均衡设备的Ip及设备状态

    upstream resinserver{
        ip_hash;
        server 127.0.0.1:8000 down;
        server 127.0.0.1:8080 weight=2;
        server 127.0.0.1:6801;
        server 127.0.0.1:6802 backup;
    }
    

    每个设备的状态设置为:

    1. down 表示单前的server暂时不参与负载
    2. weight 默认为1.weight越大,负载的权重就越大。
    3. max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
    4. fail_timeout:max_fails次失败后,暂停的时间。
    5. backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
    


    location 配置详解

    语法规则: location [=||*|^~] /uri/ { … }

    = 开头表示精确匹配
    
    ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
    
    ~ 开头表示区分大小写的正则匹配
    
    ~* 开头表示不区分大小写的正则匹配
    
    !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
    
    / 通用匹配,任何请求都会匹配到。
    
    多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
    
    首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
    

    例子,有如下匹配规则:

    location = / {
       #规则A
    }
    location = /login {
       #规则B
    }
    location ^~ /static/ {
       #规则C
    }
    location ~ \.(gif|jpg|png|js|css)$ {
       #规则D
    }
    location ~* \.png$ {
       #规则E
    }
    location !~ \.xhtml$ {
       #规则F
    }
    location !~* \.xhtml$ {
       #规则G
    }
    location / {
       #规则H
    }
    

    那么产生的效果如下:

    访问根目录/, 比如http://localhost/ 将匹配规则A   
    
    访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H   
    
    访问 http://localhost/static/a.html 将匹配规则C   
    
    访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C   
    
    访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。   
    
    访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。    
    
    访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。    
    

    所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

    #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
    #这里是直接转发给后端应用服务器了,也可以是一个静态首页
    # 第一个必选规则
    location = / {
        proxy_pass http://tomcat:8080/index
    }
    
    # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
    # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
    location ^~ /static/ {
        root /webroot/static/;
    }
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }
    
    #第三个规则就是通用规则,用来转发动态请求到后端应用服务器
    #非静态文件请求就默认是动态请求,自己根据实际把握
    #毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
    
    location / {
        proxy_pass http://tomcat:8080/
    }
    

    三、ReWrite语法

    last – 基本上都用这个Flag。
    break – 中止Rewirte,不在继续匹配
    redirect – 返回临时重定向的HTTP状态302
    permanent – 返回永久重定向的HTTP状态301

    1、下面是可以用来判断的表达式:

    -f和!-f用来判断是否存在文件
    -d和!-d用来判断是否存在目录
    -e和!-e用来判断是否存在文件或目录
    -x和!-x用来判断文件是否可执行
    

    2、下面是可以用作判断的全局变量

    例:http://localhost:88/test1/test2/test.php

    $host:localhost
    $server_port:88
    $request_uri:http://localhost:88/test1/test2/test.php
    $document_uri:/test1/test2/test.php
    $document_root:D:\nginx/html
    $request_filename:D:\nginx/html/test1/test2/test.php
    

    四、Redirect语法

    server {
        listen 80;
        server_name start.igrow.cn;
        index index.html index.php;
        root html;
        if ($http_host !~ "^star\.igrow\.cn$" {
            rewrite ^(.*) http://star.igrow.cn$1 redirect;
        }
    }
    

    五、防盗链

    location ~* \.(gif|jpg|swf)$ {
        valid_referers none blocked start.igrow.cn sta.igrow.cn;
        if ($invalid_referer) {
            rewrite ^/ http://$host/logo.png;
        }
    }
    

    六、根据文件类型设置过期时间

    location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
        if (-f $request_filename) {
            expires 1h;
            break;
        }
    }
    

    七、禁止访问某个目录

    location ~* \.(txt|doc)${
        root /data/www/wwwroot/linuxtone/test;
        deny all;
    }
    

    八、一些可用的全局变量

    $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一样
    $server_protocol 等同于request的协议,使用“HTTP/1.0”或“HTTP/1.1”
    $server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。
    $server_name 请求到达的服务器名
    $server_port 请求到达的服务器的端口号
    $uri 等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index
    

    相关文章

      网友评论

          本文标题:Nginx 配置文件详解

          本文链接:https://www.haomeiwen.com/subject/pvjvittx.html