Как заменить $_SERVER[REMOTE_ADDR] на IP клиента в PHP за двумя Nginx?

6603
11 августа 2017, 00:41

На сервере есть два nginx: внешний, он доступен из интернета, и внутренний, он запущен в контейнере docker.

Внешний nginx проксирует запрос во внутренний, настраивается вручную. Пример конфигурации:

server {
    listen 80;
    server_name test.site.ru;
    location / {
        proxy_pass http://192.168.10.13;
        include proxy_params;
    }
}

Внутренний nginx проксирует запрос в другой docker контейнер с php-fpm. Настраивается автоматически при деплое. Пример конфигурации:

upstream backend {
    server php:9000;
    server spare:9000;
}
server {
    listen 80 default_server;
    server_name test.site.ru;
    location ~ ^/app\.php(/|$) {
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_pass backend;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /srv/web$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT /srv/web;
        internal;
    }
}

В итоге в PHP мы имеем следующее:

$_SERVER['HTTP_X_FORWARDED_PROTO'] => http
$_SERVER['HTTP_X_FORWARDED_FOR'] => тут мой IP
$_SERVER['HTTP_X_REAL_IP'] => тут тоже мой IP
$_SERVER['SERVER_ADDR'] => 192.168.10.13
$_SERVER['REMOTE_ADDR'] => 192.168.10.1

Очень хочется, чтобы и внутренний nginx и php не думали про то, что есть ещё какой внешний nginx, и чтобы nginx в логах имел реальные IP адреса, и чтобы в $_SERVER['REMOTE_ADDR'] был мой IP, а не IP-адрес Gateway из подсети docker. Как это сделать?

Я знаю про существование модуля ngx_http_realip_module для nginx, но на этом мои знания заканчиваются, и я не знаю как его установить внутрь контейнера docker в nginx:alpine. Быть может есть ещё какие-то варианты решения?

READ ALSO
PHP параллельные циклы

PHP параллельные циклы

Здравствуйте! Можно ли используя php запустить несколько разных циклов одновременно?

113
Подсчёт количества строк в mysql таблице

Подсчёт количества строк в mysql таблице

Доброго времени суток, товарищи гуру-программистыСобственно нужно чтоб ЭТО считало количество строк в таблице и выводило их последовательно...

174
PHP regular expression

PHP regular expression

Собрал регулярное выражение [\\\]+[nfvabrt0]{1} для замены некоторых символов (\n, \t, \0 и тд

145
Где в post-запросе передаются параметры?

Где в post-запросе передаются параметры?

В стандарте HTTP есть 3 составляющие: стартовая строка, заголовки и тело

143