Я настраиваю кластер серверов с 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, но он не прошел тест nginx, заявив proxy_set_header directive is not allowed here
.
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 на балансировщике нагрузки.
Построил то, что сказал Штеффен Ульрих, за которым я следил 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;
...
}
И теперь приложение видит IP-адрес клиента, а не балансировщика нагрузки с сквозной передачей SSL.