Thank you for reading this post, don't forget to subscribe!
Если у Вас на сервере установлен Varnish + NginX
, то в логах NginX
все посетители будут с одним ip адресом - 127.0.0.1
. Есть два варианта:
- Изменить формат ведения логов
- Заставить NginX сразу обрабатывать правильный ip адрес
1 Для того что бы использовать значение X-Forwarded-For
вместо $remote_addr
в логах, внесите следующие изменения в файл /etc/nginx/nginx.conf
:
[codesyntax lang="php"]
1 2 3 |
log_format forwarded '"$http_x_forwarded_for" - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; |
[/codesyntax]
Дальше укажите формат для стандартного лог-файла доступа:
1 |
access_log /var/log/nginx/access.log forwarded<span class="p">;</span> |
2. Для начала нужно заставить Varnish
отправлять этот ip адрес бэкэнду. Для этого добавьте следующие строки в секцию vcl_recv
:
[codesyntax lang="php"]
1 2 3 4 5 6 7 |
if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } |
[/codesyntax]
На самом деле можно ограничиться только:
1 2 |
<span class="nb">set </span>req.http.X-Forwarded-For <span class="o">=</span> client.ip<span class="p">;</span> |
Теперь удостовертесь, что realip включен в вашем NginX:
1 2 |
nginx <span class="nt">-V</span> 2>&1 |grep realip |
Если все ОК, добавьте следующие строки в файл настройки NginX (/etc/nginx/nginx.conf
) в секцию http:
1 2 3 |
set_real_ip_from 127.0.0.1<span class="p">;</span> real_ip_header X-Forwarded-For<span class="p">;</span> |
Проверяем конфиг:
1 2 |
nginx <span class="nt">-t</span> |
Перезапускаем Varnish и NginX:
1 |
/etc/init.d/varnish restart <span class="o">&&</span> /etc/init.d/nginx restart |