NginX и X-Forwarded-Proto:HTTPS за балансировщиком нагрузки


Быстрая заметка о https трафике за кривыми балансировщиками нагрузки. Мы имеем Nginx+php-fast-cgi за балансировщиком нагрузки. Балансировщик, как женщина, которую никто так не понимает, как она сама себя не понимает.

Тоесть балансировщик нагрузки (он же БН, он же 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 и видим, что все рабоает:
nginx-x-forwarded-proto

Подобная картина ломает шаблон.

Share Button
(Visited 841 times, 1 visits today)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *