NGINXをロードバランサーとして使用してサーバークラスターをセットアップしています。すべてのリクエストはHTTPS経由で行われるため、ロードバランサーは、ストリームを使用してリクエストをクラスターに直接渡します(SSLパススルー)。
ロードバランサーIPではなくクライアントIPを表示するエンドサーバーが必要です。
私のnginx.conf
## Misc other config stuff
stream {
map $ssl_preread_server_name $backend_cluster_map {
site.a cluster_1;
site.b cluster_2;
default cluster_1;
}
upstream cluster_1 {
server 10.0.0.202:443;
server 10.0.0.203:443;
}
upstream cluster_2 {
server 10.0.0.204:443;
server 10.0.0.205:443;
}
server {
listen 443;
proxy_pass $backend_cluster_map;
ssl_preread on;
}
}
サーバーブロックを変更してproxy_set_header
を含めてIPを転送しようとしましたが、proxy_set_header directive is not allowed here
と記載されたnginxテストに合格しませんでした。
server {
listen 443;
proxy_protocol on;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fowarded-Proto https;
proxy_set_header X-Fowarded-For $remote_addr;
proxy_set_header X-Fowarded-Host $remote_addr;
proxy_pass $backend_cluster_map;
ssl_preread on;
}
SSLリクエストを変更できないことと関係があると思います。代替案はありますか?ロードバランサーでSSLを終了しないようにしています。
Steffen Ullrichが私が従ったと言ったことを基に構築されました https://www.nginx.com/resources/admin-guide/proxy-protocol/ 。
追加したエンドサーバー
server {
listen 443 ssl proxy_protocol;
...
set_real_ip_from 10.0.0.201;
real_ip_header proxy_protocol;
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Fowarded-For $proxy_protocol_addr;
...
}
およびロードバランサー
server {
listen 443;
proxy_protocol on; # Make sure this is enabled
proxy_pass $backend_cluster_map;
...
}
また、アプリケーションは、SSLパススルーを使用するロードバランサーではなく、クライアントIPアドレスを認識します。