У меня есть балансировщик нагрузки AWS TCP в пуле автомасштабирования. За ним стоит несколько доменов, поэтому я не могу выполнить завершение SSL на балансировщике нагрузки, следовательно, TCP.
Я обновил свой формат ведения журнала, чтобы регистрировать X-Forwarded-For, и это хорошо работает для HTTP, но не для HTTPS.
Форумы не указывают, что это невозможно сделать, поскольку речь идет о HTTP (S), однако я не могу заставить его работать. Это может работать?
Вот мои данные регистрации:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" combined env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded
Сбрасывая все атрибуты в PHP, я вижу заголовок для HTTP-запросов, но не для HTTPS, поэтому я не думаю, что это проблема конфигурации.
ELB не имеет возможности добавить этот заголовок, поскольку этот заголовок является функцией HTTP, а это балансировщик нагрузки TCP. Все, что он знает, это то, что он передает некоторый поток TCP и не более того. Если вам нужен ELB для добавления этого заголовка, вам необходимо завершить HTTPS на балансировщике нагрузки. Оттуда он может связываться с вашими внутренними экземплярами через HTTP или HTTPS по мере необходимости.
Хотя я очень сомневаюсь, что X-Forwarded-For может работать, когда завершение SSL не выполняется на балансировщике нагрузки, я не нашел окончательного отказа. Однако есть решение, которое я сделал с помощью CloudFront.
Поскольку у вас может быть несколько дистрибутивов, указывающих на один балансировщик нагрузки, а AWS предоставляет сертификаты для SSL, вы можете завершить SSL в пограничном местоположении. CloudFront добавит заголовок и перенаправит запрос (при необходимости) в балансировщик нагрузки. Оттуда заголовок попадет на ваш сервер.