nginx的反向代理模块 参数proxy_pass,proxy_method,proxy_hide_

nginx的反向代理模块有很多种配置,下面介绍一些常用的配置实例:

1.proxy_pass


语法: proxy_pass URL
配置块: location,if
详解:此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或者IP地址加端口的形式。例如:
view plain print ?
  1. // nginx.conf配置文件  
  2. // 配置URL地址  
  3. proxy_pass http://www.54rd.net/html/webserver/;  
  4.   
  5. // 也可以配置unix句柄  
  6. proxy_pass http://unix:/path/to/backend.sock:/webserver/;  
  7.   
  8. // 也可以把HTTP转换成更安全的HTTPS  
  9. proxy_pass https://192.168.0.1;  

默认情况下反向代理是不会转发请求中的Host头部。如果需要转发,那么必须加上set_header配置:
view plain print ?
  1. proxy_set_header Host $host;  

2.proxy_method


语法:proxy_method method;
配置块:http,server,location
详解:此配置项表示转发时的协议方法名,例如:
view plain print ?
  1. // 配置后客户端发来的GET请求在转发时方法名也会改为POST  
  2. proxy_method POST;  

3.proxy_hide_header


语法:proxy_hide_header the_header;
配置块:http,server,location
详解:nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date,Server,X-Pad和X-Accel-*。使用proxy_hide_header后可以任意指定哪些HTTP头部字段不能被转发。例如:
view plain print ?
  1. // 例如不转发缓存控制  
  2. proxy_hide_header Cache-Control;  

4.proxy_pass_header


语法:proxy_pass_header the_header;
配置块:http,server,location
详解:于proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置成允许转发。例如:
view plain print ?
  1. // 允许重定向  
  2. proxy_pass_header X-Accel-Redirect;  

5.proxy_pass_request_body


语法:proxy_pass_request_body on|off;
默认:proxy_pass_request_body on;
配置块:http,server,location
详解:作用为确定是否向上游服务器发送HTTP包体部分。

6.proxy_pass_request_headers


语法:proxy_pass_request_headers on|off;
默认:proxy_pass_request_headers on;
配置块:http,server,location
详解:作用为确定是否转发HTTP头部。

7.proxy_redirect


语法:proxy_redirect [default|off|redirect replacement];
默认:proxy_redirect default;
配置块:http,server,location
详解:当上游服务器返回的响应时重定向或者刷新请求(如HTTP响应码是302或者301)时,proxy_redirect可以重设HTTP头部的location或refresh字段,例如:
view plain print ?
  1. // 如果上游服务器发出的响应码是302,location字段的URL是http://www.54rd.net/html/webserver/,那么实际会转发到http://www.54rd.net/html/php/  
  2. proxy_redirect http://www.54rd.net/html/webserver/ http://www.54rd.net/html/php/;  
  3.   
  4. // 还可以使用ngx-http-core-module提供的变量来设置  
  5. proxy_redirect http://www.54rd.net/html/webserver/ http://$host:$server_port/;  
  6.   
  7. // 也可以省略repalcement参数中的主机部分,这时会用虚拟主机名称来填充  
  8. proxy_redirect http://www.54rd.net/html/webserver/ /html/php/;  

======================

在使用nginx的反向代理功能时,有时会出现重定向的url不是我想要的url,例如下面的例子:前端的Nginx负责把http: www 54rd net yum Server 开头的url反向代理到后端的http: 192 168 1 1 Server 上。对于有完整
在使用nginx的反向代理功能时,有时会出现重定向的url不是我想要的url,例如下面的例子:

前端的Nginx负责把http://www.54rd.net/yum/Server/开头的url反向代理到后端的http://192.168.1.1/Server/上。

对于有完整的路径,如http://www.54rd.net/yum/Server/的代理没有问题,Server对应后台服务器的一个目录。

但当访问 http://www.54rd.net/yum/Server时,后端Nginx会发送一个301到/上,于是返回到前端后URL变成了 http://www.54rd.net/Server/,这个url显然不是我们想要的。

在Apache中有个ProxyPassReverse的参数,用来调整反向代理服务器发送的http应答头的url,可以解决这个问题。

查了Nginx的手册后,终于发现了proxy_redirect这个参数,它实现的功能和ProxyPassReverse类似,例如增加如下配置:

view plain print ?
  1. location ^~ /yum  
  2. {  
  3.   
  4.             proxy_pass http://192.168.1.1/;  
  5.   
  6.             proxy_redirect http://www.54rd.net/ /yum/;  
  7.   
  8. }  

这样,当访问http://www.54rd.net/yum/Server后,就会301到http://www.54rd.net/yum/Server/上了。

====================


8.proxy_next_upstream


语法: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
详解:此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求,这样可以更好的保证客户端只收到来自一个上游服务器的应答。proxy_next_upstream的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求:
  1. error:当向上游服务器发起连接,发送请求,读取响应时出错时。
  2. timeout:发送请求或者读取响应发生超时时。
  3. invalid_header:上游服务器发送的响应时不合法时。
  4. http_500:上游服务器返回的HTTP响应码是500时。
  5. http_502:上游服务器返回的HTTP响应码是502时。
  6. http_503:上游服务器返回的HTTP响应码是503时。
  7. http_504:上游服务器返回的HTTP响应码是504时。
  8. http_404:上游服务器返回的HTTP响应码是404时。
  9. off:关闭proxy_next_upstream 功能一出错就选择另一台上游服务器再次转发。

小结:nginx的反向代理使用起来还是很方便的,适当的修改配置即可。

你可能感兴趣的:(nginx的反向代理模块 参数proxy_pass,proxy_method,proxy_hide_)