• nignx配置文件详解


    一、配置文件详解

    1.配置文件块分类

    全局块
    
    events{ 
        events块   
    }
    
    以下全是http块
    #一个http块可以有多个server块
    http {
        
        http全局块
         
        以下全是server块
        #一个server块可以有多个location块
        server {
            server全局块
          
            location {
                location块
            }
        }
    }

    2.配置文件块详解

    2.1 全局块

    ##nginx worker进程运行的用户及用户组 
    ##语法:user username[groupname], 默认:user nobody nobody
    ##user用于设置master进程启动后,fork出的worker进程运行在那个用户和用户组下。当按照"user username;"设置时,用户组名与用户名相同
    ##若用户在configure命令执行时,使用了参数--user=usergroup 和 --group=groupname,此时nginx.conf将使用参数中指定的用户和用户组
    user  nobody;
    
    ##工作进程数,通常是CPU数量或者CPU数量的2倍 
    ##设置为auto时nginx进程自动检测,根据CPU数量调整
    worker_processes auto; 
     
    ##全局错误日志存放路径和名称,日志记录级别:[debug|info|notice|warn|crit]
    ##此处使用的是相对路径,相对nginx的安装目录 
    ##可以在全局块、http块、server块、以及location块中配置
    error_log logs/error.log    notice; 
    
    ##PID文件位置
    pid  logs/nginx.pid;  
    
    ##一个nginx进程打开的最多文件描述符数目
    ##理论值为最多打开文件数(ulimit -n)与nginx进程数相除,建议与ulimit -n 的值保持一致
    worker_rlimit_nofile 65535;        

    2.2 events块

    ###events块设置###
    event {   
        ##最大连接数
        ##nginx的最大连接数=worker_processes*worker_connections
        worker_connections 1024;     
        
        ##每个工作进程同时接收多个新连接 
        ##默认off,每个工作进程每次只接受一个新连接
        multi_accept on;  
        
        ##use [kqueue|rtsig|epoll|/dev/poll|select|poll]
        ##Linux 2.6以上版本使用epoll,FreeBSD使用kqueue,window不指定
        use epoll;        
    }

    2.3 HTTP块

    2.3.1 HTTP全局块

    http {   
        ##文件扩展名与文件类型映射表 
        include mime.types; 
        ##默认文件类型     
        default_type application/octet-stream;     
    
        ##日志格式设置,main为日志格式的名字,只能在http块配置  
        ##$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址
        ##$remote_user: 用来记录客户端用户名称
        ##$time_local: 用来记录访问时间与时区
        ##$request: 用来记录请求的url与http协议
        ##$status: 用来记录请求状态
        ##$body_bytes_sent: 记录发送给客户端文件主体内容大小
        ##$http_referer: 用来记录从那个页面链接访问过来的
        ##$http_user_agent: 记录客户端浏览器的相关信息
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
            
            
        ##连接日志的路径,main为log_format设置的日志格式名字
        ##与log_format配合使用,可以在http块,server块和location块中配置
        ##推荐在http块设置
        access_log  logs/access.log  main;  
        
        ##默认编码
        charset utf-8;     
        ##服务器名字的hash表大小                 
        server_names_hash_bucket_size 128;   
    
        ##开启高效传输模式,将文件的回写过程交给数据缓冲,而不是放在应用中
        ##可以在http块,server块和location块中配置
        sendfile    on;
        ##一个数据包中发送所有头文件,而不是单独发,防止网络阻塞     
        tcp_nopush    on;  
        ##不缓存数据,而是立即发送数据   
        tcp_nodelay     on;      
        ##隐藏nginx版本号  
        server_tokens   off;
        
        
        ###客户端请求设置###
        ##客户端连接时间,单位是秒(默认75s)
        keepalive_timeout 60;  
        ##设置可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭(默认100)
        keepalive_requests    1000;
        ##指定客户端请求中较大消息头缓存最大数量和大小           
        large_client_header_buffers 4 32k; 
        ##客户端请求单个文件的最大字节数
        client_max_body_size 20m;
        ##来自客户端请求头的hearerbuffer大小
        client_header_buffer_size 32k; 
        ##客户端请求头读取时间
        client_header_timeout 10;   
        ##客户端请求主体读取时间 
        client_body_timeout 10;  
        ##响应客户端时间  
        send_timeout 10;    
        
        
        ###gzip压缩设置###  
        ##开启gzip压缩输出
        gzip on;   
        ##最小压缩文件大小
        gzip_min_length 1k;    
        ##压缩缓冲区   
        gzip_buffers 4 16k;  
        ##压缩版本(默认1.1,前端如果是squid2.5请使用1.0)      
        gzip_http_version 1.1;     
        ##压缩等级1-9
        ##等级越高,压缩效果越好,节约宽带,但CPU消耗大,默认为1   
        gzip_comp_level 2;   
        ##压缩类型,默认包含text/html  
        gzip_types text/plain     application/x-javascript     text/css     application/xml; 
        ##前端缓存服务器缓存经过压缩的页面
        gzip_vary on;      
    
    
        ###代理,缓存设置###
        ##启动代理缓存功能
        proxy_buffering     on;    
        ##nginx跟upstream server端的建立连接超时时间
        proxy_connect_timeout     10;   
        ##nginx发送数据给upstream server端的超时时间
        proxy_send_timeout        60; 
        ##nginx接收upstream server端数据的超时时间    
        proxy_read_timeout        60;    
        ##设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffer_size     128k;  
        ##proxy_buffers缓冲区
        proxy_buffers  1000    128k; 
        ##高负荷下缓冲大小(proxy_buffers*2)    
        proxy_busy_buffers_size    256k;    
        ##设定缓存文件夹大小
        proxy_temp_file_write_size    256k;  
        ##反向代理缓存目录,levels=1:2 设置目录深度,第一层目录是1个字符,第2层是2个字符
        ##keys_zone:设置web缓存名称和内存缓存空间大小
        ##inactive:自动清除缓存文件时间
        ##max_size:硬盘空间最大可使用值
        ##use_temp_path:为 off,则 nginx 会将缓存文件直接写入指定的 cache 文件中,而不使用 proxy_temp_path 指定的临时存储路径
        proxy_cache_path /data/proxy/cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=1g,use_temp_path=on;
        ##指定临时缓存文件的存储路径(必须在同一分区)
        proxy_temp_path /data/proxy/temp;
       
    ###FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度### ##Nginx服务器和后端FastCGI服务器连接的超时时间 fastcgi_connect_timeout 300; ##允许FastCGI服务端返回数据的超时时间 fastcgi_send_timeout 300; ##从FastCGI服务端读取响应信息的超时时间 fastcgi_read_timeout 300; ##从FastCGI服务端收到的第一部分响应信息的缓冲区大小 fastcgi_buffer_size 64k; ##从FastCGI服务端收到的响应信息的缓冲区大小以及缓冲区数量 fastcgi_buffers 4 64k; ##系统很忙时可以使用的fastcgi_buffers大小,大小为fastcgi_buffers *2 fastcgi_busy_buffers_size 128k; ##fastcti临时文件的大小 fastcgi_temp_file_write_size 128k; }

    2.3.2 upstream块

     ###负载均衡服务器池###
     ##里面的被代理的服务器必须为同一功能的服务器
    ##name为负载均衡服务器池的名字
    upstream name { ##调度算法 ##rr:轮询,默认 ##weight:权重方式,按weight指定几率,用于后端服务器性能不均的情况 ##ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题 ##fair:第三方,按后端服务器的响应时间来分配请求,响应时间短的优先分配 ##url_hash:第三方,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效 ip_hash; ##被代理服务器 ##weight:权重,若使用了ip_hash,url_hash,fair等方式,不用设置weight ##max_fails:最大失败连接次数 ##fail_timeout:请求失败重新发起请求的时间 ##backup:其它所有的非backup机器down或者忙的时请求backup机器,此台机器压力最轻 server 被代理服务器1的IP:port weight=1 max_fails=2 fail_timeout=1s; server 被代理服务器2的IP:port weight=1 max_fails=2 fail_timeout=1s; server 被代理服务器3的IP:port backup; ##设置到upstream服务器的空闲keepalive连接的最大数量 ##当这个数量被突破时,最近使用最少的连接将被关闭 keepalive 1000; }

    2.3.3 server全局块

    ###服务器主机配置,一个http中可以配置多个server###
    server {   
        ##监听的本机端口              
        listen        80;
        ##监听的主机名或IP或域名
        ##后面可以跟多个主机名称,处理HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求
        ##有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块
        server_name    localhost;
    
        ##https访问配置##
        ##若服务是https,则需要以下设置,若是http,则不需要
        listen    443  ssl;
        ##证书位置
        ssl_certificate      /etc/pki/tls/certs/server.crt;    
        ##私钥位置  
        ssl_certificate_key  /etc/pki/tls/certs/server.key;      
        ssl_session_timeout  5m;
        ##指定密码为openssl支持的格式
        ssl_protocols  SSLv2 SSLv3 TLSv1.2;  
        ##密码加密方式          
        ssl_ciphers  HIGH:!aNULL:!MD5; 
        ##依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码             
        ssl_prefer_server_ciphers   on;            
    }

    2.3.4 location块

    ##未设置负载均衡的location
    location pattern URL {                  
        ##指定访问根目录时,访问server主机的web目录(可以没有根目录)
        root    html;  
        ##用户访问web网站的格式类型    
        index    index.php index.html index.htm;   
    }
     
     
    ###设置了代理缓存,负载均衡的location###
    location pattern URL  {
        ##根据负载均衡调度算法进入一个web主页
        ##name为upstream模块的名字
        proxy_pass http://name;  
        ##重写报文首部,获取客户端IP添加forward头部
        proxy_set_header Host $host;
        ##获取实际的客户端IP
        proxy_set_header X-Real-IP $remote_addr;  
        ##原请求报文中存在首部,则将client_addr以逗号分隔原有值后,否则则直接添加此首部 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        
        ##设置HTTP协议
        ##HTTP协议中对长连接的支持是从1.1版本之后才有的
        proxy_http_version        1.1;
        ##清理client请求中带有”Connection”的header
        proxy_ser_header Connection    “”;
        
        ##开启反向代理缓存,默认关闭 
        proxy_cache cache;    
        ##对不同的状态码的缓存时间                    
        proxy_cache_valid 200 304 12h;   
        ##设置参数获取缓存文件名
        proxy_cache_key    $host$uri$is_args$args;   
        ##文件过期时间控制   
        expires    1d;           
    }    

    二、 常见配置

    1.四层协议的stream代理

    ##基于TCP/UDP四层协议负载均衡配置##
    ##数据库/ssh等四层协议通信的配置在此模块##
    ##stream段的配置要与http段在同级目录##
    
    
    #有负载均衡
    stream {
    
        upstream name{
            server 被代理服务器1的IP:port max_fails=3 fail_timeout=10s;
            server 被代理服务器2的IP:port max_fails=3 fail_timeout=10s;
        }
     
        server{
            listen 本机port;
            proxy_pass name;
            #连接超时时间
            proxy_connect_timeout 10s;
            #最大无操作时断开的时间
            proxy_timeout 300s;
        }
    }
    
    
    #无负载均衡 
    stream {
     
        server{
            listen 本机port;
            proxy_pass IP:port max_fails=3 fail_timeout=10s;
            proxy_connect_timeout 10s;
            proxy_timeout 300s;
        }
    }

    2.七层协议的反向代理

    2.1 HTTP七层反向负载均衡代理

        ###负载均衡服务器池###
        upstream name {     
            ##调度算法,默认为rr轮询 
            ip_hash;
            ##被代理服务器,weight:权重;max_fails:最大连接次数;fail_timeout:请求失败重新发起请求的时间 
            server  被代理服务器1的IP :port    weight=1 max_fails=2 fail_timeout=1s;
            server  被代理服务器2的IP:port    weight=1 max_fails=2 fail_timeout=1s;
            ##设置到upstream服务器的空闲keepalive连接的最大数量。当这个数量被突破时,最近使用最少的连接将被关闭
            keepalive    1000;    
        }
    
    
        ###服务器主机配置,一个http中可以配置多个server###
        server {   
            ##监听的本机端口              
            listen        80;
            ##监听的主机名或IP或域名
            server_name    localhost;
    
    
            ###对URL进行匹配,可以有多个location###                   
            ###设置了代理缓存,负载均衡的location###
            location pattern URL {
                ##根据负载均衡调度算法进入一个web主页
                ##name为upstream模块的名字
                proxy_pass http://name;  
                ##重写报文首部,获取客户端IP添加forward头部
                proxy_set_header Host $host;
                ##获取实际的客户端IP
                proxy_set_header X-Real-IP $remote_addr;  
                ##原请求报文中存在首部,则将client_addr以逗号分隔原有值后,否则则直接添加此首部 
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
                
                ##设置HTTP协议
                ##HTTP协议中对长连接的支持是从1.1版本之后才有的
                ##若设置了负载均衡,下面两步必须要有
                proxy_http_version        1.1;
                ##清理client请求中带有”Connection”的header
                proxy_ser_header Connection    “”;
                
                ##开启反向代理缓存,默认关闭 
                proxy_cache cache;    
                ##对不同的状态码的缓存时间                    
                proxy_cache_valid 200 304 12h;   
                ##设置参数获取缓存文件名
                proxy_cache_key    $host$uri$is_args$args;   
                ##文件过期时间控制   
                expires    1d;           
            }    
        }    

    2.2 HTTP七层反向代理

     ###服务器主机配置,一个http中可以配置多个server###
        server {   
            ##监听的本机端口              
            listen        80;
            ##监听的主机名或IP或域名
            server_name    localhost;
    
    
            ###对URL进行匹配,可以有多个location###                   
            ###设置了代理缓存,负载均衡的location###
            location pattern URL {
                ##根据负载均衡调度算法进入一个web主页
                ##name为upstream模块的名字
                proxy_pass http://被代理IP:Port;  
                ##重写报文首部,获取客户端IP添加forward头部
                proxy_set_header Host $host;
                ##获取实际的客户端IP
                proxy_set_header X-Real-IP $remote_addr;  
                ##原请求报文中存在首部,则将client_addr以逗号分隔原有值后,否则则直接添加此首部 
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;           
            }    
        }    

    2.3 HTTPS七层反向代理

     ###服务器主机配置,一个http中可以配置多个server###
        server {   
            ##监听的本机端口              
            listen        80;
            ##监听的主机名或IP或域名
            server_name    localhost(或192.168.1.100);
    
            ##https访问配置
            listen    443  ssl;
            ##证书位置
            ssl_certificate      /etc/pki/tls/certs/server.crt;    
            ##私钥位置  
            ssl_certificate_key  /etc/pki/tls/certs/server.key;      
            ssl_session_timeout  5m;
            ##指定密码为openssl支持的格式
            ssl_protocols  SSLv2 SSLv3 TLSv1;  
            ##密码加密方式          
            ssl_ciphers  HIGH:!aNULL:!MD5; 
            ##依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码             
            ssl_prefer_server_ciphers   on;             
    
    
            ###对URL进行匹配,可以有多个location######代理缓存,负载均衡调用###
            location pattern URL {
                ##根据负载均衡调度算法进入一个web主页
                proxy_pass http://被代理IP:Port;  
                ##重写报文首部,获取客户端IP添加forward头部
                proxy_set_header Host $host;
                ##获取实际的客户端IP
                proxy_set_header X-Real-IP $remote_addr;  
                ##原请求报文中存在首部,则将client_addr以逗号分隔原有值后,否则则直    接添加此首部 
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            
            }    
        }        
    }

    三、location 匹配详解

     1. 语法规则

    location [=|~|~*|^~] /url/ { … }
    
    其中
    =表示精确匹配
    ~表示区分大小写的正则匹配
    ~*表示不区分大小的正则匹配
    ^~表示以什么开头的前缀匹配
    普通匹配:没有匹配模式,只有URL
    
    正则匹配:~|~*
    
    
    匹配顺序:
    nginx匹配时首先匹配精确匹配,若匹配到,则执行该location并结束匹配
    再进行普通匹配,若匹配到多个,记住匹配度最高的那个,若其中匹配到带有"^~"的前缀匹配时,则执行该location并停止匹配
    否则,然后按nginx.conf的配置顺序进行正则匹配,如果匹配到,则执行该location并结束匹配
    如果未匹配到或者没有设置正则匹配,则使用普通匹配中匹配度最高的那个
    最后,若所有都未匹配到,则使用通配的URL
    
    注意:
    location 的执行逻辑跟 location 的编辑顺序无关 正则匹配与nginx.conf配置文件的顺序有关,普通匹配则没有顺序 优先级:
    精确匹配(
    =) > 普通匹配 > 前缀匹配(^~) > 正则匹配(~*|~) > 通配(/)

    2.匹配示例

    location  = / {
      #精确匹配 ,匹配以后执行该location并停止匹配 
      [ configuration A ]
    
    }
    
    location  / {
      #所有都没有匹配到,则执行该location
      [ configuration B ]
    
     
    }
    
    location /documents/ {
      #匹配任何以 /documents/ 开头的URL,匹配符合以后,还会继续往下匹配
      #只有后面的正则表达式没有匹配到时,该location才会被执行
      [ configuration C ]
    
    }
    
    
    location ^~ /images/ {
      #匹配任何以 /images/ 开头的URL,匹配符合以后执行该location并停止匹配
      [ configuration D ]
    
    }
    
    location /images/ {
      #匹配到 /images/,继续往下,会发现 ^~ /images/存在 
      [ configuration E ]
    
    }
    
    location /images/abc {
      #匹配到 /images/abc,继续往下,会发现 ^~ /images/存在
      [ configuration F ]
    
    }
    
    location ~ /images/abc/ {
      #只有去掉 /images/才有效
    #先匹配/images/abc/开头的URL,继续往下搜索,匹配到这一条正则时执行该location并停止匹配
    [ configuration G ] } location ~* .(gif|jpg|jpeg)$ { #匹配所有以 gif,jpg或jpeg结尾的请求,但不包含以/images/开头的URL [ configuration H ] } 请求localhost:80/则匹配到A 请求localhots:80/index.html则匹配到B 请求localhost:80/documents/document.html则匹配到C 请求localhost:80/images/都会匹配到D,其中EFG在此配置中无任何意义,匹配到EFG的都会优先匹配D 请求localhost:80/aaa/1.jpg则匹配到H

    四、location反向代理路径详解

    1. proxy_pass配置中url不以/结尾时

    访问地址:本机IP:port/proxy/index.html
    location
    /proxy { proxy_redirect off; 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://192.168.99.10:99; } 实际地址:http://192.168.99.10:99/proxy/index.html location /proxy/ { proxy_redirect off; 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://192.168.99.10:99; } 实际地址:http://192.168.99.10:99/proxy/index.html
    location
    /proxy { proxy_redirect off; 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://192.168.99.10:99/server; } 实际地址:http://192.168.99.10:99/server/index.html
    location
    /proxy/ { proxy_redirect off; 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://192.168.99.10:99/server; } 实际地址:http://192.168.99.10:99/serverindex.html

    2. proxy_pass配置中url以/结尾时

    注意:proxy_pass的url以/结尾时,location 不能带正则

    访问地址:本机IP:port/proxy/index.html
    
    location /proxy {
       proxy_redirect off;
       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://192.168.99.10:99/;
    }
    实际地址:http://192.168.99.10:99//index.html
    
    location
    /proxy/ { proxy_redirect off; 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://192.168.99.10:99/; } 实际地址:http://192.168.99.10:99/index.html
    location
    /proxy { proxy_redirect off; 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://192.168.99.10:99/server/; } 实际地址:http://192.168.99.10:99/server//index.html
    location
    /proxy/ { proxy_redirect off; 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://192.168.99.10:99/server/; } 实际地址:http://192.168.99.10:99/server/index.html
  • 相关阅读:
    八大 IoT 安全关键技术解析
    IoT: 物联网安全测试经验总结
    业务逻辑漏洞挖掘
    从零开始Android逆向教程(二)——什么是Xposed
    Mac terminal commands
    Obj-C 实现 QFileDialog函数
    打开文件所在目录并选择该文件
    Qt样式表使用注意项
    window响应拖拽文件操作
    Window检测网络连接情况
  • 原文地址:https://www.cnblogs.com/gudanaimei/p/13031701.html
Copyright © 2020-2023  润新知