NGINX:如何使用连接最少的粘性会话

时间:2016-11-02 06:25:47

标签: node.js session nginx koa

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

  1. 使用Sticky Session门户的客户没问题。
  2. 从支持中心登录的用户存在性能问题,因为粘性会话正在向上游指向具有相同外部公共IP的所有用户的相同节点。
  3. 关于第2点需要帮助。我也想为他们分配负载,因为有并发1000个用户工作表支持中心

    我的配置看起来像

    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;
    }
    

1 个答案:

答案 0 :(得分:2)

我不认为单独使用nginx是可​​能的。 我正在使用带有redis的koa-generic-session。通过这种方式,所有节点都连接到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);

这是我目前在多个上游环境中用于会话的内容。