NginX и X-Forwarded-Proto:HTTPS за балансировщиком нагрузки
Быстрая заметка о https трафике за кривыми балансировщиками нагрузки. Мы имеем Настройка Nginx + php-fcgi за балансировщиком нагрузки. Балансировщик, как женщина, которую никто так не понимает, как она сама себя не понимает.
Тоесть балансировщик нагрузки (он же БН, он же LB) обрабатывает либо https
, либо http
трафик. SSL Termination
можно настроить на LB, но к серверам он обращается все-равно в 80-й порт. В таком случае сайт не получает заголовок https
со значением on
. В случае с разными валидациями безопасных сесий, будет выходить безконечное перенаправление и ошибка в результате.
Но LB отправляет протокол связи с помощью заголовка X-Forwarded-Proto
. Его-то и будем ловить.
Для того, что бы NginX начал преобразовывать заголовок X-Forwarded-Proto: HTTPS
в HTTPS: on
нужно подредактировать главный конфигурационный файл /etc/nginx/nginx.conf
.
В секцию http, которая выглядит так:
http {
...
}
Вставить следующий код:
map $http_x_forwarded_proto $fastcgi_https {
default off;
https on;
}
Если его добавить в любое другое место - получите следующую ошибку при перезапуске nginx:
nginx: [emerg] `map` directive is not allowed here
Если прописать просто $https
вместо $fastcgi_https
- получите следующую ошибку:
nginx: [emerg] the duplicate `https` variable in /etc/nginx/nginx.conf
Дело в том, что начиная с какой-то бородатой версии NginX имеет встроеную переменную $https, поэтому ее повторно заюзать не получится.
Редактируем /etc/nginx/fastcgi_params
:
Коментируем/удаляем:
fastcgi_param HTTPS $https if_not_empty;
Добавляем:
fastcgi_param HTTPS $fastcgi_https if_not_empty;
fastcgi_param SERVER_PORT $http_x_forwarded_port;
Перезапускаем nginx что бы изменения вступили в силу.
Проверяем с помощью phpinfo и видим, что все рабоает:
Подобная картина ломает шаблон.