一、配置文件详解
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