我正在使用ip_hash(Sticky Session),我有一个场景,我们的门户网站可以通过web访问,我们有支持模块,它也托管在同一个门户网站上,上游有22个节点的负载均衡
- 客户使用门户进行粘性会话没有问题。
- 从支持中心登录的用户有性能问题,因为粘性会话使上游指向具有相同外部公共IP的所有用户的同一节点。
关于第2点需要帮助。我也想为他们分配负载,因为同时有1000个用户在支持中心工作
My Config look likes
upstream appserver{
ip_hash;
server 192.168.0.x:3811;
server 192.168.0.x:3812;
server 192.168.0.x:3813;
server 192.168.0.x:3814;
server 192.168.0.x:3815;
server 192.168.0.y:3811;
server 192.168.0.y:3812;
server 192.168.0.y:3813;
server 192.168.0.y:3814;
server 192.168.0.y:3815;
...
...
}
server {
location "/support" {
allow ...;
deny all;
alias ...;
index index.html;
}
location / {
proxy_pass http://appserver;
proxy_cookie_path / "/; secure;";
proxy_set_header X-IBanking "127.0.0.1";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Request-Id $txid;
add_header X-Frame-Options "SAMEORIGIN";
add_header Strict-Transport-Security max-age=15552000;
proxy_http_version 1.1;
proxy_redirect off;
}
gzip on;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
gzip_buffers 16 8k;
gzip_vary on;
}
我不认为单独使用nginx是可能的。我使用koa-generic-session与redis。通过这种方式,所有的节点都连接到redis来读写会话值,并且会话跟随用户到任何上游服务器,只要该服务器连接到你的redis服务器。
这个例子取自https://github.com/koajs/generic-session
var session = require('koa-generic-session');
var redisStore = require('koa-redis');
var koa = require('koa');
var app = koa();
app.keys = ['keys', 'keykeys'];
app.use(session({
store: redisStore()
}));
app.use(function *() {
switch (this.path) {
case '/get':
get.call(this);
break;
case '/remove':
remove.call(this);
break;
case '/regenerate':
yield regenerate.call(this);
break;
}
});
function get() {
var session = this.session;
session.count = session.count || 0;
session.count++;
this.body = session.count;
}
function remove() {
this.session = null;
this.body = 0;
}
function *regenerate() {
get.call(this);
yield this.regenerateSession();
get.call(this);
}
app.listen(8080);
这是我目前在多上游环境中使用的会话