nginx proxy模块相关重要指令

简介:

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_sizeproxy_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_sizeproxy_buffers的一块缓存区大小中的最大值,小于proxy_buffers总容量减去一块缓冲区的大小










本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/1420095,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
应用服务中间件 nginx
Nginx安装nginx-rtmp-module模块
【2月更文挑战第4天】 nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展。 nginx要安装其它模块必须同时拿到nginx源代码和模块源代码,然后手动编译,将模块打到nginx中,最终生成一个名为nginx的可执行文件。
74 6
|
3月前
|
应用服务中间件 nginx
百度搜索:蓝易云【利用nginx内置ngx_http_mirror_module模块实现流量复制及流量放大】
以上就是使用Nginx内置 `ngx_http_mirror_module`模块实现流量复制和流量放大的简要示例。通过合理配置和利用该模块,可以实现更复杂的流量控制和调试需求。
58 1
|
7月前
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
80 0
|
27天前
|
应用服务中间件 Linux PHP
Linux下安装php环境并且配置Nginx支持php-fpm模块
Linux下安装php环境并且配置Nginx支持php-fpm模块
28 0
|
2月前
|
消息中间件 关系型数据库 MySQL
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
61 0
|
3月前
|
存储 应用服务中间件 nginx
Nginx模块开发:handler模块实现
Nginx模块开发:handler模块实现
28 0
|
3月前
|
存储 应用服务中间件 nginx
Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现
Nginx模块开发:模块结构的源码阅读以及过滤器(Filter)模块的实现
65 0
|
3月前
|
存储 应用服务中间件 nginx
Nginx:过滤模块的实现
Nginx:过滤模块的实现
|
3月前
|
存储 负载均衡 网络协议
Nginx: handler 模块的实现
Nginx: handler 模块的实现
|
3月前
|
前端开发 应用服务中间件 nginx
nginx过滤器模块
nginx过滤器模块