Nginx的反向代理功能和缓存功能(4)

down:将此后端服务器定义为离线状态。此功能不同于直接在配置文件中删除此服务器配置或注释它。常用于ip_hash均衡算法。当使用ip_hash算法时,如果某台服务器坏了需要将其从服务器组中排除,直接从配置文件中直接删除该服务器将会导致此前分配到此后端服务器的客户端重新计算IP_HASH值,而使用down则不会。

backup:指定当其他非backup的server都联系不上时,将返回backup所定义的服务器内容。常用于显示sorry page。

当server指定后端服务器时使用的是主机名的方式时,需要在代理服务器上添加域名解析记录,如放到/etc/hosts中。

以下是一个配置示例。只定义了一个upstream组,所有请求都代理,权重为2比1,当192.168.100.28和192.168.100.30都断开联系时,将返回代理服务器本身配置的sorrypage。

http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream web_group { server 192.168.100.28 weight=2 max_fails=2 fail_timeout=2s; server 192.168.100.30 weight=1 max_fails=2 fail_timeout=2s; server 127.0.0.1:80 backup; } server { listen 127.0.0.1:80; root /www/longshuai/; index index.html; } server { listen 80; server_name ; location / { proxy_pass ; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

然后在反向代理服务器上创建/www/longshuai/目录,并向目录下的index.html文件中写入"sorry...."。

mkdir -p /www/longshuai/ echo "<h1>sorry pages...</h1>" >/www/longshuai/index.html

重载代理服务器。在浏览器上输入并不断刷新,结果应该是2:1的返回权重。再依次测试停掉某一台后端服务器和两台后端都停掉的情况。

1.6 反向代理的各种情况

反向代理时,可以根据uri的后缀来代理,也可以根据uri中的目录来代理,还可以根据客户端浏览器类型来代理。例如手机访问网站时转发到某个后端服务器组,IE浏览器访问的转发到某一个后端服务器组等。

# uri后缀代理。 location ~ \.(jpeg|jpg|png|bmp|gif)$ { proxy_pass ... } # 目录代理。 location ~ /forum/ { proxy_pass ... } # 浏览器类型代理。 location / { if ($http_user_agent ~ "MSIE") { proxy_pass... } if ($http_user_agent ~ "Chrome") { proxy_pass... } } 1.7 nginx代理memcached

该模块可以从将请求代理至memcached server上,并立即从server上获取响应数据。例如:

location / { set $memcached_key "$uri?$args"; memcached_pass 127.0.0.1:11211; }

nginx代理memcached时,需要以变量$memcached_key作为key去访问memcached server上的数据。例如此处将$uri$args变量赋值给$memcached_key变量作为key去访问memcached服务器上对应的数据。

但这样的代理显然不符合真正的需求:没有实现memcached的分布式功能。当memcached server宕机时,nginx将无法从中获取任何数据。所以应该使用上游服务器组。例如:

upstream memcached { server 127.0.0.1:11211; server 127.0.0.1:11212; server 127.0.0.1:11213; server 127.0.0.1:11214; } server { listen 80; server_name dev.hwtrip.com; location ^~ /cache/ { set $memcached_key "$uri$args"; memcached_pass memcached;

但这也不适合,因为memcached是基于一致性哈希算法的,而upstream模块默认并不支持一致性哈希算法。可以通过upstream模块的指令或者另外使用一个第三方模块ngx_http_upstream_consistent_hash

如果使用的是upstream模块的hash指令,配置如下:

upstream memcached { hash "$uri$args" consistent; server 127.0.0.1:11211; server 127.0.0.1:11212; server 127.0.0.1:11213; server 127.0.0.1:11214; }

这样,各上游主机就通过hash一致性的算法进行负载均衡。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e0bce531785e8b24b05bf72bb8c65255.html