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
原文地址:https://www.cnblogs.com/gudanaimei/p/13031701.html