На сервере есть два 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. Быть может есть ещё какие-то варианты решения?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей