用HTTP proxy module配置一个反向代理服务器
反向代理方式是指用代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外的表现就是一个Web服务器。
Nginx具有强悍的高并发高负载能力,因此一般会作为前端的服务器直接向客户端提供静态文件服务。但也有一些复杂多变的业务需要由上游服务器处理。因此,Nginx通常会被配置为既是静态Web服务器也是反向代理服务器。
与Squid等其他反向代理服务器相比,Nginx有自己的特点。当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。
Nginx的这种方式,很明显的缺点就是延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间;而优点则是降低了上游服务器的负载,尽量把压力放在Nginx服务器上。
通常,客户端与代理服务器之间的网络环境比较复杂,多半是走公网。而代理服务器与上游服务器之间一般是走内网。Nginx在接收到完整的客户端请求之后才会与上游服务器建立连接进行请求转发,由于网络较快,所以这个转发过程会执行得很快。这样,一个客户端请求占用上游服务器的连接时间就会明显缩短。
1 负载均衡的基本配置
(1) upstream块
语法:upstream name {...}
配置块:http
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com
}
server {
location / {
proxy_pass http://backend;
}
}
(2) server 块
语法:server name [parameters];
配置块:upstream
支持的参数parameters如下:
- weight=number,权重,默认为1;
- max_fails=number,与fail_timeout配合使用,指在fail_timeout时间段内,如果向当前的上游服务器转发次数超过number,则认为在当前fail_timeout时间段内这台上游服务器不可也用。默认为1,如果设置为0,则表示不检查失败次数;
- fail_timeout=time,默认10;
- down,表示所在的上游服务器永久下线,只有在ip_hash配置时才有用;
- backup,使用ip_hash配置项时无效。它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。
(3) ip_hash块
语法:ip_hash;
配置块:upstream
某些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器中。ip_hash首先根据客户端的ip地址计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中。
ip_hash与weight配置不可同时使用。如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要down参数标识,确保转发策略的一惯性。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com down;
server backend3.example.com
}
2 反向代理的基本配置
(1) proxy_pass
语法:proxy_pass URL;
配置块:location、if
URL可以使主机名或ip地址加端口的形式,也可以是UNIX句柄,还可以直接用负载均衡块。
默认情况下,反向代理是不会转发请求中的头部的,如果需要转发,必须加上配置:
proxy_set_heaer Host $Host;
(2) proxy_method
语法:proxy_method method;
配置块:http、server、location
用于改变请求方法类型。例如 proxy_method POST; 客户端发来的GET请求在转发时方法名会改为POST。
(3) proxy_hide_header
语法:proxy_hide_header the_header;
配置块:http、server、location
(4) proxy_pass_header
语法:proxy_pass_header the_header;
配置块:http、server、location
(5) proxy_pass_request_body
语法:proxy_pass_request_body on | off;
默认:proxy_pass_request_body on;
配置块:http、server、location
(6) proxy_pass_request_headers
语法:proxy_pass_request_headers on | off;
默认:proxy_pass_request_headers on;
配置块:http、server、location
(7) proxy_redirect
语法:proxy_redirect [default|off|redirect replacement];
默认:proxy_redirect default;
配置块:http、server、location
此配置项的作用是:当上游服务器返回的响应是重定向或刷新请求,该配置可以重设HTTP返回头部中的location或refresh字段。
(8) proxy_next_stream
语法:proxy_next_stream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
默认:proxy_next_stream error timeout;
配置块:http、server、location
此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。proxy_next_stream 参数的作用是用来说明在哪些情况下回继续选择下一台上游服务器转发请求。
- error:当向上游服务器发起连接、发送请求、读取响应时出错
- timeout:发送请求或读取响应时发生超时
- invalid_header:上游服务器发送的响应时不合法的
- http_50x:上游服务器返回的HTTP响应码是50x
- off:关闭proxy_next_stream功能
Nginx的反向代理模块还提供了很多种配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。这些配置可以通过阅读ngx_http_proxy_module模块的说明来了解。