1. ip_hash(不推荐)
1 2 3 4 5 |
ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用: 1. nginx不是最前端的服务器,ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。 2. nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session |
2. hash $cookie_jsessionid;
基于Cookie的会话保持
1 2 3 4 5 6 7 8 9 |
我们已经知道了如果使用Servlet Session的话,Web容器会自动的在用户浏览器上建立名为jsessionid的cookie,并且值就是服务器端的SessionID。另一方面,新版的NGINX不光可以通过IP的hash来分发流量,也可以通过url的hash,cookie的hash,header的hash等等进行链接的固定分配。由于用户登陆成功以后名为jsessionid的cookie就有了一个短期固定的值,而且每个用户都不一样,那么我们就可以根据这个sessionid的hash值为它分配一个服务器。在当前sessionID起作用的时候那么分配的服务器也是同一个,并且不需要安装第三方的插件,方法如下: #hash $cookie_jsessionid; upstream backend { ... hash $cookie_jsessionid; } |
3. hash $http_x_forwarded_for;
使用Http Header区分不同用户
1 2 3 4 5 |
有些情况下无法使用cookie,比如客户端浏览器禁用的cookie,Android,IOS等移动端调用的HTTP API接口等。现在比较常用的做法是把SessionID,有的也喜欢叫做token,放在请求的URL或者请求参数中 那么没有cookie如何区分用户呢,这种情况下虽然不能使用cookie,但是header是可以使用的,我们可以把token或者sessionID放到header中,然后对该header的值进行hash,并固定分配一个服务器。配置文件的写法如下 hash $http_你设置的header名称; |
1 2 3 |
大多数的反向代理软件都会把它收到的请求源的IP记录在x_forwarded_for这个header中,所以一个客户总是拥有一个唯一的x_forwarded_for头不会变化,所以我们也可以对这个Header进行hash,效果就是根据IP地址进行分流是一样的。 hash $http_x_forwarded_for; |
1 |
如果你的上级也是NGINX,那么应该按照如下配置 |
1 2 3 4 5 6 7 8 9 10 11 |
location / { proxy_pass http://localhost:8000; proxy_set_header X-Real-IP $remote_addr; # needed for HTTPS # proxy_set_header X_FORWARDED_PROTO https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } |
- 本文固定链接: https://www.yoyoask.com/?p=6250
- 转载请注明: shooter 于 SHOOTER 发表