NGINX:如何拥有最少连接的粘性会话



我正在使用ip_hash(Sticky Session),我有一个场景,我们的门户网站可以通过web访问,我们有支持模块,它也托管在同一个门户网站上,上游有22个节点的负载均衡

  1. 客户使用门户进行粘性会话没有问题。
  2. 从支持中心登录的用户有性能问题,因为粘性会话使上游指向具有相同外部公共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);

这是我目前在多上游环境中使用的会话

最新更新