作者:刘大
背景
现在很多用户会使用Nginx对多个iServer搭载负载均衡,WebGL加载三维服务,会发送一个login请求进行是否是iServer服务的验证(该模式会发送1个get+1个post),这两个请求需来自于同一个iServer的验证,而搭载负载均衡的轮询等机制,会导致这两个请求会发送到不同的iServer进行验证,login的post请求报下图的错误,以致于验证不通过无法继续加载三维服务
配置方法
有的可能会想到,使用Nginx的IP_hash策略可以解决这个问题 但是会导致同一个客户端的请求全部发送到其中某一个iServer中,从而并不能完全达到负载均衡的效果
这边可通过以下两种方式对Nginx进行配置
第一种方式:
1.在Nginx.conf里面再增加一个location 去匹配login请求,使其发送到同一个iServer中
location ~*/realspace/login{
proxy_pass http://172.16.14.25:8090;
}
第二种方式:
2.在代理的iserver的location中 增加request_uri判断 如下
location /iserver{
proxy_pass http://test/iserver;
#对请求头过滤匹配‘login’
set $URL $scheme://$http_host$request_uri;
if ($URL ~ "/realspace/login" ) {
proxy_pass http://172.16.14.25:8090;
}
proxy_set_header ProxyHost $host:8092;
}
完整配置如下
upstream test {
server 172.16.14.25:8090;
server 172.16.14.25:8091;
}
server {
listen 8092;
server_name localhost;
#第一种,添加两个location
#location ~*/realspace/login{
#proxy_pass http://172.16.14.25:8090;
#}
#location /iserver{
#proxy_pass http://test/iserver;
#proxy_set_header Host $host:8092;
#proxy_set_header ProxyHost $host:8092;
#}
#第二种一个location,里面进行过滤
location /iserver{
proxy_pass http://test/iserver;
#对请求头过滤匹配‘login’
set $URL $scheme://$http_host$request_uri;
if ($URL ~ "/realspace/login" ) {
proxy_pass http://172.16.14.25:8090;
}
proxy_set_header ProxyHost $host:8092;
}
}
注意:
做负载均衡的多个iServer上都应该发布你所要请求的服务,不然请求分发过去,会出现找不到请求404的情况