web-dev-qa-db-ja.com

Nginxプロキシを使用したスティッキーセッション

2つの異なるAWSインスタンスで実行されているアプリケーションがあり、IPに基づいて「スティッキー」または「永続的」セッションを有効にして、特定の方法でWebソケットテクノロジーを利用できるようにしたいと考えています。

2つの異なるセットアップがあり、どちらもip_hashを使用してこれらのスティッキーセッションを有効にします。

最初のセットアップでは、アプリプロセスはNginx構成と同じインスタンスで実行されています。これはworkingであり、セッションは期待どおりに永続的です。

upstream my_app {
    ip_hash;
    # local servers
    server 127.0.0.1:3001 weight=100 max_fails=5 fail_timeout=300;
    server 127.0.0.1:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

2番目のセットアップでは、外部インスタンスをポイントして、同じ効果を達成しようとしています。この設定は動作していませんです。つまり、セッションはまだ負荷分散されています。

upstream my_app {
    ip_hash;
    # external servers
    server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
    server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

ip_hashを正しく使用していますか? 外部サーバーに対して「スティッキー」なIPベースのセッションを有効にするにはどうすればよいですか?

10
Himmel

Nginxのドキュメントによると、スティッキーセッションのサポートは、高価なPlusバージョンでのみ利用できます。私は代替案を調査しており、Nginx 1.5+と互換性のないこの古いフォークが近づいています https://github.com/lusis/nginx-sticky-module

私もLUAモジュールを構築しようとしましたが、列挙とブロックのためだけに、ピア選択用のAPIフックはありません。

Nginx Plus Load Balancing

更新

私は別の素晴らしいモジュールを見つけました、 https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src を参照してください

7
Mr. bug

私のサーバーはAWSロードバランシングの背後にあったため、常にクライアントIPを反映するように、正しいヘッダーをアップストリームに渡す必要がありました。次の構成で問題が解決しました(コメント行を参照):

upstream my_app {
    ip_hash;
    server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
    server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

server {
    server_name my-app.com;

    location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_Host;
        proxy_set_header X-NginX-Proxy true;

        # This is necessary to pass the correct IP to be hashed
        real_ip_header X-Real-IP;

        proxy_pass http://my_app/;
        proxy_redirect off;
    }
}
6
Himmel