nginx proxy模块相关重要指令作用
proxy_intercept_errors on;
proxy_redirect off;
proxy_next_upstream error timeout invalid_header http_500;
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_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
#代理缓冲相关
proxy_buffering off;
proxy_buffer_size 128k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
1)proxy_intercept_errors on;
语法: proxy_intercept_errors on | off;
默认值: proxy_intercept_errors off;
上下文: http, server, location
当后端服务器的响应状态码大于等于400时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理。当为on时,nginx会拦截error_page指令明确指定的错误状态码。如果来自被代理服务器的应答状态码不匹配error_page指令,应答会照常发送到客户端。
2) proxy_connect_timeout 60;
语法: proxy_connect_timeout time;
默认值:
proxy_connect_timeout 60s;
上下文: http, server, location
该指令用于设置跟后端服务器连接的超时时间。该时间不是服务器返回页面的时间,而是发起握手等待响应的超时时间。
3) proxy_send_timeout 60;
语法: proxy_send_timeout time;
默认值:
proxy_send_timeout 60s;
上下文: http, server, location
定义向后端服务器传输请求的超时时间。如果后端服务器在超时时间段内没有接收到nginx转发的任何数据,连接将被关闭。
4) proxy_read_timeout 60;
语法: proxy_read_timeout time;
默认值:
proxy_read_timeout 60s;
上下文: http, server, location
定义从后端服务器读取响应的超时。如果后端服务器在超时时间段内没有传输任何数据到nginx,连接将被nginx关闭。
5)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_set_header field value;
默认值:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
上下文: http, server, location
允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
如果不想改变请求头“Host”的值,可以这样来设置:
proxy_set_header Host $http_host;
但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 这种情况下,更好的方式是使用$host变量——它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:
proxy_set_header Host $host;
此外,服务器名可以和后端服务器的端口一起传送:
proxy_set_header Host $host:$proxy_port;
如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_header Accept-Encoding "";
6)proxy_redirect off;
语法: proxy_redirect default;
proxy_redirect off;
proxy_redirect redirect replacement;
默认值: proxy_redirect default;
上下文: http, server, location
修改后端服务器response header中Location和Refresh。
###########################################################
注:
location的解释:当nginx使用重定向时,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request。有的时候,我们并不希望把新的url返回给client去request,因为新的url可能是内网ip,client是请求不到的。
例如nginx的2个虚拟主机的配置:
server {
server_name www.sohu.com;
listen 80;
location /yum/ {
proxy_pass http://10.13.82.231:8091/;
}
}
和
server {
server_name 10.13.82.231;
listen 8091;
location ~ /server {
#opt目录中有server目录
root /opt/;
}
}
当访问:http://10.13.82.231/yum/server/时正常,http 返回码是200。(/server/全路径能匹配到opt的server目录)
当访问:http://10.13.82.231/yum/server 时,返回码是302,url直接跳转。(/server非路径则是直接跳转,外网的client是请求不到内部ip的,就会导致访问出错)
curl信息如下:
[@zw-81-90 ~]# curl -I http://10.13.82.231/yum/server
HTTP/1.1 301 Moved Permanently
Server: nginx/1.0.9
Date: Fri, 30 May 2014 09:11:48 GMT
Content-Type: text/html
Connection: keep-alive
Content-Length: 184
Location: http://10.13.82.231:8091/server/
解决办法:
server {
server_name www.sohu.com;
listen 80;
location /yum/ {
proxy_pass http://10.13.82.231:8091/;
proxy_redirect http://www.sohu.com/ /yum/;
}
}
#####################################################
指令详解:
假设后端服务器返回的响应头是 “Location: http://localhost:8000/two/some/uri/”,那么指令
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将把字符串改写为 “Location: http://frontend/one/some/uri/”。
replacement字符串可以省略服务器名:
proxy_redirect http://localhost:8000/two/ /;
此时将使用代理服务器的主域名和端口号来替换。如果端口是80,可以不加。
用default参数指定的默认替换使用了location和proxy_pass指令的参数。因此,下面两例配置等价:
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect default;
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
而且因为同样的原因,proxy_pass指令使用变量时,不允许本指令使用default参数。
replacement字符串可以包含变量:
proxy_redirect http://localhost:8000/ http://$host:$server_port/;
而redirect字符串从1.1.11版本开始也可以包含变量:
proxy_redirect http://$proxy_host:8000/ /;
同时,从1.1.11版本开始,指令支持正则表达式。使用正则表达式的话,如果是大小写敏感的匹配,redirect以“~”作为开始,如果是大小写不敏感的匹配,redirect以“~*”作为开始。而且redirect的正则表达式中可以包含命名匹配组和位置匹配组,而在replacement中可以引用这些匹配组的值:
proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
proxy_redirect ~*/user/([^/]+)/(.+)$ http://$1.example.com/$2;
除此以外,可以同时定义多个proxy_redirect指令:
proxy_redirect default;
proxy_redirect http://localhost:8000/ /;
proxy_redirect http://www.example.com/ /;
另外,off参数可以使所有相同配置级别的proxy_redirect指令无效:
proxy_redirect off;
proxy_redirect default;
proxy_redirect http://localhost:8000/ /;
proxy_redirect http://www.example.com/ /;
最后,使用这条指令也可以为地址为相对地址的重定向添加域名:
proxy_redirect / /;
7)proxy_next_upstream error timeout invalid_header http_500;
语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ...;
默认值:
proxy_next_upstream error timeout;
上下文: http, server, location
指定在何种情况下一个失败的请求应该被发送到下一台后端服务器:
error
和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误;
timeout
和后端服务器建立连接时(proxy_connect_timeout),或者向后端服务器发送请求时(proxy_send_timeout),或者从后端服务器接收响应头时(proxy_read_timeout),出现超时;
invalid_header
后端服务器返回空响应或者非法响应头;
http_500
后端服务器返回的响应状态码为500;
http_502
后端服务器返回的响应状态码为502;
http_503
后端服务器返回的响应状态码为503;
http_504
后端服务器返回的响应状态码为504;
http_404
后端服务器返回的响应状态码为404;
off
停止将请求发送给下一台后端服务器。
需要理解一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。
8)代理buffer相关
proxy_buffering off;
做代理的时候,开启或关闭缓冲后端服务器的响应。
当开启缓冲时,nginx尽可能快地从被代理的服务器接收响应,再将它存入proxy_buffer_size和proxy_buffers指令设置的缓冲区中。如果响应无法整个纳入内存,那么其中一部分将存入磁盘上的临时文件。proxy_max_temp_file_size和proxy_temp_file_write_size指令可以控制临时文件的写入。
当关闭缓冲时,收到响应后,nginx立即将其同步传给客户端。nginx不会尝试从被代理的服务器读取整个请求,而是将proxy_buffer_size指令设定的大小作为一次读取的最大长度。
proxy_buffer_size 128k;
设置缓冲区的大小为。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分缓冲区通常只包含着一个小小的响应头,即response header。无论proxy_buffering是on或者off,这个指令都会起作用。如果太小会出现如下报错:
upstream sent too big header while reading response header from upstream
proxy_buffers 4 64k;
每个连接设置缓冲区的数量为number
,每块缓冲区的大小为size
。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。
proxy_busy_buffers_size 128k;
当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小
时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。 同时,剩余的缓冲区仍然再接收响应,相当于边收边发,如果需要,一部分内容将缓冲到临时文件。该大小
默认不设置的话是proxy_buffer_size和proxy_buffers指令设置单块缓冲大小的两倍。nginx对此值的要求为:
"proxy_busy_buffers_size" must be equal to or greater than the maximum of the value of "proxy_buffer_size" and one of the "proxy_buffers"
"proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer
即大于等于proxy_buffer_size和proxy_buffers的一块缓存区大小中的最大值,小于proxy_buffers总容量减去一块缓冲区的大小
转载于:https://blog.51cto.com/leejia/1420095