Я беру свою настройку с
nginx > apache/php
к
haproxy > nginx > apache/php
(с использованием haproxy 1.5-dev18 с встроенной поддержкой ssl)
И nginx, и haproxy правильно настроены для установки заголовка HTTP_X_FORWARDED_PROTO. Однако, когда nginx получает ssl-трафик от haproxy, он видит соединение как http и устанавливает заголовок таким образом.
Как я могу настроить nginx для пересылки заголовка HTTP_X_FORWARDED_PROTO, если он существует, но в противном случае продолжить его настройку на основе соединения?
Я понял, как это решить. Проблема заключалась в том, что nginx перезаписывал заголовок, установленный haproxy в этой строке моей конфигурации:
proxy_set_header X-Forwarded-Proto $scheme;
Я исправил это, добавив следующее:
map $http_x_forwarded_proto $thescheme {
default $scheme;
https https;
}
и изменив строку proxy_set_header, чтобы использовать новую схему:
proxy_set_header X-Forwarded-Proto $thescheme;
У меня была такая же потребность с AWS ELB
Вот моя решающая линия:
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
Я не могу просто комментировать, поэтому публикую это как ответ: не могли бы вы дать нам часть или всю конфигурацию nginx, чтобы мы могли увидеть, что с ней не так? Возможно, ваша конфигурация HAProxy тоже?
Первая проблема, о которой я могу думать, - это то, что ваш HAProxy выполняет завершение SSL. Подводя итог, можно сказать, что для разгрузки ваших серверных серверов балансировщик нагрузки может быть настроен на выполнение всех функций ssl, а затем связываться с вашими внутренними серверами по HTTP. Как здесь схема: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/
Чтобы дать вам хороший ответ на ваш вопрос, не могли бы вы проверить, что у вас нет проблем с обратной связью в вашей конфигурации http <> https? Возможно, тогда вы могли бы перенаправить http на http, https на https, а затем принудительно перенаправить http на https.
Не могли бы вы также проверить, что вы включили сквозную передачу ssl в вашей конфигурации HAProxy?