nginx反向代理(proxy)与负载均衡(upstream)以及健康状态监测。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx反向代理(proxy)与负载均衡(upstream)以及健康状态监测。相关的知识,希望对你有一定的参考价值。
j**ngx_http_proxy_module模块配置(http或https协议)**
proxy_pass uri;应用上下文:location,if in location,limit_except
location / { proxy_set_header Host $http_host; proxy_pass #将所有请求都反向代理至本地的http协议的8080端口 index index.html index.htm; }
注:如果location定义其uri时使用正则表达式进行模式匹配的话,proxy_pass后的路径不能使用uri;
location ~* \.(jsp|do)$ { #将jsp和do结尾的请求都反代至后端 proxy_set_header Host $http_host; proxy_pass #此时proxy_pass后不能跟任何uri index index.html index.htm; }
proxy_set_header field value; 用于proxy server向backend server发请求报文时,将某些请求首部重新赋值,活在原有值后面添加一个新的值;也可以添加自定义首部;
nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。
Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。
同理,X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
proxy_connect_timeout time;定义与后端服务器建立连接的超时时长,默认为60s;
proxy_send_timeout time;把请求发送给后端服务器的超时时长,默认为60s
proxy_read_timeout time;等待服务器发送响应报文的超时时长;
**缓存相关的选项(缓存要先定义,后调用)**
proxy_cache_path path[levels=levels][use_temp_path=on|off] keys_zone=name:size [inactive=time][max_size=size]; 定义缓存;应用上下文:http
proxy_cache zone|off;调用缓存,可用上下文:http,server,location;
proxy_cache_key string;定义缓存键;、
proxy_cache_valid [code] time;对不同响应码的响应报文设定其可缓存时长;
proxy_cache_path /var/cache/proxy levels=1:1 keys_zone=proxycache:10m inactive=2m max_size=2g; location ~* \.(jsp|do)$ { proxy_set_header Host $http_host; proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache proxycache; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 2d; proxy_cache_key $scheme$host$uri expires 30d; }
**ngx_http_headers_module模块配置**
add_header Name value; 向响应报文添加自定义首部,并为其赋值;
expires [modified] time; 允许或禁止响应报文的Cache-control或Expires首部添加新值或修改其值;
**ngx_http_upstream_module模块配置**
用于将多个服务器定义为服务器组,而由proxy_pass,fastcgi_pass等指令进行引用;
upstream name{...};定义一个后端服务器组,name为组名称;仅能用于http上下文;
server address [parameters];在uupstream中定义一哥服务器组极其相关参数,仅能
用于upstream上下文;
常用参数:
weight=number:定义服务器权重,默认为1;
max_fails=number;最大失败连接尝试次数,失败连接超时时长由fails_timeout参数指定;
fails_timeout=time;等待目标服务器发送响应的总超时时长;
backup:备用服务器,所有主服务器均故障时才启用此主机;
down:手动标记其不再处理任何用户请求;
upstream tcsrvs { #定义一个服务组 server 172.16.61.7:80 weight=2 max_fails=2 fail_timeout=6s; server 172.16.61.4:80 weight=1 max_fails=2 fail_timeout=6s; } location ~* \.(jsp|do)$ { proxy_set_header Host $http_host; proxy_pass #此处调用服务器组即可 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache proxycache; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 2d; proxy_cache_key $scheme$host$uri; expires 30d; }
调度算法:(默认为轮询)定义在upstream模块中(较老版本不支持)
ip_hash:源地址hash,把来自同一ip地址的请求始终发往同一个backend server,除非此backend server不可用;
least_conn;最少连接;当各server权重不同时,即为加权最少连接;
hash key;指明基于hash方式进行调度时,其hash key,hash $remote_addr相当于ip_hash;
常用的hash_key:
cookie_name:讲一个用户的请求始终发往同一个backend server,能实现会话绑定的功能;此处的name为cookie某些参数名称,此处常用的有cookie_username;
$request_uri:将对同一个uri的请求始终发往同一个backend server,应用于后端为缓存服务器时。
upstream tcsrvs { server 172.16.61.7:80 weight=2 max_fails=2 fail_timeout=6s; server 172.16.61.4:80 weight=1 max_fails=2 fail_timeout=6s; ip_hash; }
**nginx的健康状态监测机制**(较老版本默认不支持)
health_check [parameters];只能用于location上下文中;
常用参数:
interval=time:监测的频率,默认为5s;
fails=number:判断后端server不可用的监测次数,默认为1次;
passes=number:判断服务器可用的失败监测次数,默认为1此;
uri=uri;做健康状态监测时的目标uri,默认为/;
match=NAME:健康状态监测的结果评估调用此处指定的match配置块;
match name {...}:对backend server做健康状态监测时,定义其结果判断机制,只能用于http上下文;
常用参数:
status code..:期望响应的状态码;
header HEADER[operator value]:期望存在响应首部,也可以对期望的响应首部的值基于比较操作符和值进行比较;
body:期望响应报文的主体部分应该有的内容;
match welcome { #定义match status 200; header Content-Type = text/html; body ~ "Welcome to nginx!"; } location ~* \.(jsp|do)$ { proxy_set_header Host $http_host; proxy_pass http://tcsrvs; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache proxycache; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 2d; proxy_cache_key $scheme$host$uri; expires 30d; health_check match=welcome; #进行健康状态监测,并引用定义的match }
以上是关于nginx反向代理(proxy)与负载均衡(upstream)以及健康状态监测。的主要内容,如果未能解决你的问题,请参考以下文章