В настоящее время у меня есть балансировщик нагрузки HAProxy, без завершения SSL, который направляет трафик на пару веб-серверов. На веб-сервере nginx завершает работу SSL и теоретически обеспечивает перенаправление http на https. Однако при запросе http в браузере он не перенаправляет, а вместо этого выдает ошибку 400 Bad Request, в которой говорится, что простой HTTP-запрос был отправлен на порт https. Есть идеи, что я здесь делаю не так?
Пример файла конфигурации nginx:
server {
listen private.ip:80;
allow lb.ip;
allow secondary_lb.ip;
deny all;
server_name qa.example.com;
return 301 https://$host$request_uri;
}
server {
listen private.ip:443 ssl;
allow lb.ip;
allow secondary_lb.ip;
deny all;
server_name qa.example.com;
# rest of config
}
Я считаю, что соответствующие разделы конфигурации HAProxy следующие (присутствуют некоторые доступные переменные, но вы поняли идею) ...
frontend http
bind my_ip:80
bind my_ip:443
option tcplog
mode tcp
default_backend app_pool
backend app_pool
mode tcp
balance roundrobin
option ssl-hello-chk
{% for server in backend_webservers %}
server {{ server.name }} {{ server.ip }}:443 check
{% endfor %}
Учитывая вашу конфигурацию, HAProxy направляет запрос на порт 443, даже если это HTTP. трафик получен через порт 80.
Лучший способ справиться с этим - настроить перенаправление http на https на HAProxy, а не на серверной части. Таким образом, вам нужно будет добавить в интерфейс HAProxy следующее:
схема перенаправления https-код 301 if! {Ssl_fc}