Nginx负载均衡和反向代理的配置
这是一篇关于Nginx负载均衡和反向代理配置的Blog
反向代理的含义
- 定义
- 反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给Internet上请求连接的客户端。
- Nginx适用范围
- 由于Nginx具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户端提供静态文件服务。但也有一些复杂、多变的业务不适合放到Nginx服务器上,这时会用Apache、Tomcat等服务器来处理。于是,Nginx通常会被配置为既是静态Web服务器也是反向代理服务器,不适合Nginx处理的请求就会直接转发到上游服务器中处理。
- Nginx反向代理的特点
- 当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。而Squid等代理服务器则采用一边接收客户端请求,一边转发到上游服务器的方式。
- 优点和缺点
- 缺点是延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间。而优点则是降低了上游服务器的负载,尽量把压力放在Nginx服务器上。
负载均衡的基本配置
- upstream块
- 语法:upstream name{…}
- 配置块:http
- upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用。
- server
- 语法:server name[parameters];
- 配置块:upstream
- server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX句柄等,在其后还可以跟一些参数。例如:
- weight=number:设置向这台上游服务器转发的权重,默认为1。
- max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游服务器不可用。max_fails默认为1,如果设置为0,则表示不检查失败次数。
- fail_timeout=time:fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的响应超时时间等完全无关。fail_timeout默认为10秒。
- down:表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用。
- backup:在使用ip_hash配置项时它是无效的。它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。
- ip_hash
- 语法:ip_hash;
- 配置块:upstream
- 在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器中。ip_hash就是用以解决上述问题的,它首先根据客户端的IP地址计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发到指定的上游服务器中。
- ip_hash与weight(权重)配置不可同时使用。如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要down参数标识,确保转发策略的一贯性。
反向代理的基本配置
- proxy_pass
- 语法:proxy_pass URL;
- 配置块:location、if
- 此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式,也可以是UNIX句柄,还可以如上节负载均衡中所示,直接使用upstream块。
- proxy_method
- 语法:proxy_method method;
- 配置块:http、server、location
- 此配置项表示转发时的协议方法名。
- proxy_hide_header
- 语法:proxy_hide_header the_header;
- 配置块:http、server、location
- Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP头部字段不能被转发。
- proxy_pass_header
- 语法:proxy_pass_header the_header;
- 配置块:http、server、location
- 与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发。
- proxy_pass_request_body
- 语法:proxy_pass_request_body on | off;
- 默认:proxy_pass_request_body on;
- 配置块:http、server、location
- 作用为确定是否向上游服务器发送HTTP包体部分。
- proxy_pass_request_headers
- 语法:proxy_pass_request_headers on | off;
- 默认:proxy_pass_request_headers on;
- 配置块:http、server、location
- 作用为确定是否转发HTTP头部。
- proxy_redirect
- 语法:proxy_redirect[default | off | redirect replacement];
- 默认:proxy_redirect default;
- 配置块:http、server、location
- 当上游服务器返回的响应是重定向或刷新请求(如HTTP响应码是301或者302)时,proxy_redirect可以重设HTTP头部的location或refresh字段。还可以使用ngx-http-core-module提供的变量来设置新的location字段。也可以省略replacement参数中的主机名部分,这时会用虚拟主机名称来填充。使用off参数时,将使location或者refresh字段维持不变。使用默认的default参数时,会按照proxy_pass配置项和所属的location配置项重组发往客户端的location头部。
- 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
- 此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。
- error:当向上游服务器发起连接、发送请求、读取响应时出错。
- timeout:发送请求或读取响应时发生超时。
- invalid_header:上游服务器发送的响应是不合法的。
- http_500:上游服务器返回的HTTP响应码是500。
- http_502:上游服务器返回的HTTP响应码是502。
- http_503:上游服务器返回的HTTP响应码是503。
- http_504:上游服务器返回的HTTP响应码是504。
- http_404:上游服务器返回的HTTP响应码是404。
- off:关闭proxy_next_upstream功能—出错就选择另一台上游服务器再次转发。
结束语
以上是Nginx反向代理的最基本的配置,Nginx的反向代理模块还提供了很多种配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。这些配置可以通过阅读ngx_http_proxy_module模块的说明了解,只有深入地理解,才能实现一个高性能的反向代理服务器。