反向代理负载均衡集群配置详解
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时站在服务器角度来看,代理服务器对外就表现为一个反向代理服务器。
对反向代理服务器的攻击并不会使得后端内网Web服务器上网页信息遭到破坏,增强了Web服务器的安全性。
ngx _ http _ proxy _ module模块:http/https协议反向代理
1、proxy_pass URL; :定义反向代理到的路径
适用范围:location, if in location, limit_except上下文中;URL为完整的路径 注意: 匹配location后传递给后端请求路径情况解析( REMOTE-IP:后端主机IP地址): 1) proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机; server { ... server_name HOSTNAME; location /uri/ { proxy http://REMOTE-IP[:port]; } ... } 此时传递给后端的请求路径为:http://REMOTE-IP/uri/,直接补充在REMOTE-IP之后; http://HOSTNAME/uri --> http://REMOTE-IP/uri 2)proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri; server { ... server_name HOSTNAME; location /uri/ { proxy http://REMOTE-IP/new_uri/; } ... } 此时客户端请求被location的/uri/匹配到,跳转到后端请求路径将由/new uri/替换/uri/; http://HOSTNAME/uri/ --> http://REMOTE-IP/new_uri/ 3)如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri; server { ... server_name HOSTNAME; location ~|~* /uri/ { proxy http://REMOTE-IP; } ... } 此时客户端请求时传递的uri将直接附加代理到的服务的之后; http://HOSTNAME/uri/ --> http://host/REMOTE-IP/
2、proxysetheader field value;用于proxy server向后端服务主机发请求报文时,将某请求首部重新赋值,或在原有值后面添加一个新的值; 也可以添加自定义首部;用于http, server, location配置段中
示例: proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部;
3、缓存相关的选项(缓存需要要先定义,再调用)
1)proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] 定义缓存,可用上下文为http; (与fastcgi的缓存定义相似) 2)proxy_cache zone | off; 指明要调用的缓存,或关闭缓存机制;用于http, server, location 上下文 3)proxy_cache_key string; 缓存中用于“键”的内容;默认值为:proxy_cache_key $scheme$proxy_host$request_uri; 4)proxy_cache_valid [code ...] time; 定义对特定响应码的响应内容的缓存时长; 缓存定义示例: (定义在http上下文) proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g; 调用缓存定义示例: 定义在需要调用缓存功能的配置段,例如server{...}; proxy_cache pxycache; proxy_cache_key $request_uri; proxy_cache_valid 200 302 301 1h; proxy_cache_valid any 1m; 5)proxy_cache_use_stale 定义当代理服务器与后端主机通信出现故障时在哪种情况下,可以向客户端直接用缓存中缓存项响应给客户端;如下; proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...; 6)proxy_cache_methods GET | HEAD | POST ...; 定义为哪种请求方法使用缓存;默认GET|HEAD 其他的不建议使用 7)proxy_buffering on | off; 是否启用代理服务器对后端服务器的发送缓冲和接收缓冲 默认proxy_buffering on; 8)proxy_buffers number size; 定义启用代理服务器对后端服务器的发送缓冲和接收缓冲的buffer的数量和每个buffer的类型 默认proxy_buffers 8 4k|8k; 用于http,server,locaton上下文 9)proxy_buffer_size size; 定义代理服务器对后端服务器的发送缓冲和接收缓冲的每个buffer的大小 默认proxy_buffer_size 4k|8k;
4、proxy _ hide _ header field;
指明要隐藏响应给客户端header,默认情况下nginx是不传递header的
5、proxy _ connect _ timeout time;
定义代理服务器与后方服务器建立连接时的超时时长;默认是60s,最大不能超过75s
6、 连接相关的选项
当客户端请求,而后端服务器过于繁忙会返回给客户端502(BadGateway)服务器端错误,在例如此类情况下,肯能需要调整服务器端关于连接时长相关的选项
1)proxy_connect_timeout time; 定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s; 2)proxy_send_timeout time; 把请求发送给后端服务器的超时时长(定义两次请求报文之间时间间隔);默认为60s; 3)proxy_read_timeout time; 等待后端服务器发送响应报文的超时时长;默认为60s;可以稍微长点.
ngx _ http _ headers _ module模块:管理header功能的模块
向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值; 用于http,server,location,if in location上下文
1、add_header name value [always];
添加自定义首部; 示例: add_header X-Via $server_addr; add_header X-Accel $server_name;
2、expires [modified] time;用于定义Expire或Cache-Control首部的值;
expires epoch | max | off;允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值; 注释: Cache-Control:缓存控制机制 Expires:用于改变原始服务器定义的响应报文的缓存时长
ngx _ http _ upstream _ module模块;用于把后端服务器定义成服务器组,实现负载均衡功能
1、upstream NAME { … }NAME为组名称
定义后端服务器组,会引入一个新的上下文;用于http上下文 upstream httpdsrvs { server ... server... ... }
2、server address [parameters];在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE:只限用于本地通信 IP[:PORT] HOSTNAME[:PORT]
常用参数(PARAMETERS):
weight=number:定义服务器权重,默认为1 max_fails=number:失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用; fail_timeout=time:设置将服务器标记为不可用状态的超时时长;默认为10s,这是一个累计时长,而不是单次时长。 max_conns:当前的服务器的最大并发连接数; backup:将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用; down:标记为“不可用”;不再处理任何用户请求 示例: 第一步:在http上下文中定义upstream服务器组 upstream websrvs { server 192.168.25.129 weight=2 max_fails=2 fail_timeout=6s; server 192.168.25.130 weight=1 max_fails=2 down; server 192.168.25.130:8080 backup } 第二步:在反向代理http段中(proxy_pass,fastcgi_pass, ...)进行调用; server { listen 80; server_name www.ali.com; root /data/www; location / { proxy_pass http://websrvs/; } }
3、least _ conn;
最少连接调度算法,当server拥有不同的权重时其为wlc;(当各server权重不同时,即为加权最少连接);最少连接算法通常只适用与那些长连接的协议。
4、ip _ hash;
源地址hash调度方法;把来自同一个ip地址的请求始终发往同一个backendserver,除非此backend server不可用;
5、hash key [consistent];基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;
作用:将请求分类,同一类请求将发往同一个upstream server; 示例: hash $request_uri consistent; hash $remote_addr; hash $remote_addr相当于ip_hash; 常用的hash key: 1) $cookie_name: 将一个用户的请求始终发往同一个backendserver,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username; 2) $request_uri: 将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;
6、match NAME { … };此项配置只适用于nginxplus
对backendserver做健康状态检测时,定义其结果判断机制;只能用于http上下文; 常用的参数: status code[code ...]:期望的响应状态码; header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较; body:期望响应报文的主体部分应该有的内容;
7、health _ check [PARAMETERS];此项配置只适用于nginxplus
健康状态检测机制;只能用于location上下文; 常用参数: interval=#:检测的频率,默认为5秒; fails=#:判定服务器不可用的失败检测次数;默认为1次; passes=#:判定服务器可用的失败检测次数;默认为1次; uri=uri:做健康状态检测测试的目标uri;默认为/; match=NAME:健康状态检测的结果评估调用此处指定的match配置块;
8、keepalive connections;
为每个worker进程保留的空闲的长连接数量;
ngx _ stream _ core _ module模块;用于非http协议请求的分发功能。此功能在1.9以后的版本中才有
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器;
1、stream { … }
定义stream相关的服务;Context:main stream { upstream sshsrvs { server 192.168.22.2:22; server 192.168.22.3:22; least_conn; } server { listen 10.1.0.6:22022; proxy_pass sshsrvs; } }
2、listen:结合与stream配置段中的监听地址
listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/58145