反向代理
反向代理(reverse proxy) 方式是指用代理服务器来接受Internet上的连接请求, 然后将请求转发给内部网络中的上游服务器, 并将从上游服务器上得到的结果返回给Internet上请求连接的客户端, 此时代理服务器对外的表现就是一个Web服务器。 充当反向代理服务器也是Nginx的一种常见用法(反向代理服务器必须能够处理大量并发请求)。
Nginx一般会作为前端服务器提供静态文件服务和反向代理服务器。而一些复杂的、动态web业务交给Apache和Tomcat进行处理。
Nginx处理请求是将用户的请求完整的接收到Nginx所在服务器的磁盘或内存中,然后向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。
其他的代理服务器(如:squid)则是一边处理客户端请求,一边将请求转发到上游服务器。
Nginx的缺点:
(1)延长了一个请求的处理时间
(2)增加了缓存请求内容的内存和磁盘空间
优点:减小上游服务器的压力,将负载全部放在了Nginx服务器上。
负载均衡配置
upstream块
语法: upstream name{...} 配置块: http
upstream块定义了一个上游服务器的集群, 便于反向代理中的proxy_pass使用
upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { location / { proxy_pass http://backend; } }
server
语法: server name[parameters];
配置块: upstream
server配置项指定了上游服务器,可以是域名、IP地址+端口等,后面可以跟以下参数:
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配置项时它是无效的。 它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。
配置实例
upstream backend { server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; }
ip_hash
语法: ip_hash; 配置块: upstream
将同一用户的请求始终分发到固定的一台上游服务器,也就是session保持。ip_hash将客户端的IP计算出一个key,然后将key按upstream集群中上游服务器数量进行取模,把取模后的结果转发到对应的上游服务器。
ip_hash与weight(权重) 配置不可同时使用。 如果upstream集群中有一台上游服务器暂时不可用, 不能直接删除该配置, 而是要down参数标识, 确保转发策略的一致性
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com down; server backend4.example.com; }
记录负载均衡的日志
要将负载均衡的信息记录到access_log中,需要在定义日志时使用upstream模块提供的变量。如
变量名 | 意义 |
$upstream_addr | 处理请求的上游服务器地址 |
$upstream_cache_status | 表示是否命中缓存,取值:MISS、EXPIRED、UPDATING、STALE、HIT |
$upstream_status | 上游服务器返回的HTTP响应码 |
$upstrem_response_time | 上游服务器的响应时间,单位:毫秒 |
$upstream_http_$HEADER | HTTP的头部,如upstream_http_host |
配置方法:
log_format timing '$remote_addr - $remote_user [$time_local] $request ' 'upstream_response_time $upstream_response_time ' 'msec $msec request_time $request_time'; log_format up_head '$remote_addr - $remote_user [$time_local] $request ' 'upstream_http_content_type $upstream_http_content_type';
反向代理配置
proxy_pass
语法: proxy_pass URL; 配置块: location、if
此配置项将当前请求反向代理到URL参数指定的服务器上, URL可以是主机名或IP地址加端口的形式
proxy_pass http://localhost:8000/uri/ ;
也可以直接使用upstream模块,如
upstream backend { … } server { location / { proxy_pass http://backend; } }
proxy_method
语法: proxy_method method; 配置块: http、 server、 location
定义转发时的方法名,客户端发来的GET请求在转发时方法名也会改为POST
例如:
proxy_method POST;
proxy_hide_header
语法: proxy_hide_header the_header; 配置块: http、 server、 location
Nginx会将上游服务器的响应转发给客户端, 但默认不会转发以下HTTP头部字段:Date、 Server、 X-Pad和X-Accel-*。 使用proxy_hide_header后可以任意地指定哪些HTTP头部不能转发。如
proxy_hide_header Cache-Control; proxy_hide_header MicrosoftOfficeWebServer;
proxy_pass_header
语法: proxy_pass_header the_header; 配置块: http、 server、 location
与proxy_hide_header功能相反, proxy_pass_header会将原来禁止转发的header设置为允许 转发
proxy_pass_header X-Accel-Redirect;
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字段。 例如, 如果上游服务器发出的响应是302重定向请求, location字段的URI是http://localhost:8000/two/some/uri/ , 那么在下面的配置情况下, 实际转发给客户端的location是http://frontendonesome/uri/ 。
proxy_redirect http://localhost:8000/two/ http://frontendone;
使用off参数时, 将使location或者refresh字段维持不变。 例如:
proxy_redirect off;
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
此配置项表示当向一台上游服务器转发请求出现错误时, 继续换一台上游服务器处理这个请求。 前面已经说过, 上游服务器一旦开始发送应答, Nginx反向代理服务器会立刻把应答包转发给客户端。 因此, 一旦Nginx开始向客户端发送响应包, 之后的过程中若出现错误也是不允许换下一台上游服务器继续处理的。 这很好理解, 这样才可以更好地保证客户端只收到来自一个上游服务器的应答。
proxy_next_upstream的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求。
- 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功能—出错就选择另一台上游服务器再次转发