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ベースのセッションを有効にするにはどうすればよいですか?
Nginxのドキュメントによると、スティッキーセッションのサポートは、高価なPlusバージョンでのみ利用できます。私は代替案を調査しており、Nginx 1.5+と互換性のないこの古いフォークが近づいています https://github.com/lusis/nginx-sticky-module
私もLUAモジュールを構築しようとしましたが、列挙とブロックのためだけに、ピア選択用のAPIフックはありません。
更新
私は別の素晴らしいモジュールを見つけました、 https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src を参照してください
私のサーバーは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;
}
}