前面只使用了ngx_http_proxy_module来实现反向代理,但是其缺陷在于在nginx-proxy上定义的每条代理规则都只能转发到后台的某一台服务器上,即后端服务器无法分组。例如当图片服务器压力太大,添加一台服务器想要减轻图片服务器压力,但是仅使用proxy模块无法实现此类负载均衡到多台图片服务器上。
这时需要借助ngx_http_upstream_module模块,该模块用于定义后端服务器池,后端服务器也称为上游服务器(upstream),可以为每一种类型的后端服务器分一个组。然后在结合proxy_pass或其他代理指令将相应的请求转发到池内。
服务器池可以有多台服务器,多台服务器如何实现负载均衡和算法有关,默认是指定权重的加权均衡算法,还可以指定ip_hash算法实现同一个客户端IP发起的请求总是转发到同一台服务器上。还有一些其它算法,如最小连接数算法。最常用的还是加权算法,然后通过session共享的方式实现同一个客户端IP发起的请求转发到同一服务器上。
例如,下图描述的需求。当请求图片服务器时,可以将请求均衡到IP3和IP4两台服务器上,当请求其他静态内容,可以将请求均衡到IP5和IP6两台服务器上。
要实现这样的功能,nginx-proxy上的nginx配置文件内容大致如下:
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # define server pool upstream dynamic_pool { server IP1:80; } upstream pic_pool { server IP3:80 weight=2; server IP4:80 weight=1; } upstream static_pool { server IP5:80 weight=1; server IP6:80 weight=1; } server { listen 80; server_name ; # define how to proxy location ~ \.(php|php5)$ { proxy_pass ; } location ~ \.(png|jpeg|jpg|bmp|gif)$ { proxy_pass ; } location / { proxy_pass ; } } } 1.4 ngx_http_proxy_module模块 1.4.1 指令及其意义该模块默认安装。以下是相关指令的说明。
指令指令意义proxy_pass 定义代理到哪台服务器或哪个upstream池
proxy_set_header 在代理服务器上设置http报头信息。如加上真实客户端地址"proxy_set_header X_Forwarded_For $remote_addr"
proxy_connect_timeout 反向代理连接上游服务器节点的超时时间。发起方是proxy方,即等待握手成功的时间
proxy_send_timeout 上游服务器节点数据传给代理服务器的超时时间。即此时间段内,后端节点需要传完数据给代理服务器
proxy_read_timeout 定义代理服务器何时关闭和后端服务器连接的超时时长,默认为60秒,表示某次后端传输完数据给代理服务器后,如果60秒内代理服务器和后端服务器没有任何传输,则关闭此次连接。目的是避免代理服务器和后端服务器一直保持连接不断开而占用资源
1.4.2 proxy_pass proxy_pass http[s]://{ [IP:PORT/uri/] | upstream_pool };
该指令在前文示例中已经演示过了。此处只说明注意点。
当proxy_pass所在的location中使用了正则匹配时,则proxy_pass(包括fastcgi_pass和memcached_pass)定义的转发路径都不能包含任何URI信息。另外,location中使用了尾随斜线,那么proxy_pass定义的转发路径也必须使用斜线,或者都不加尾随斜线。