Даже если уже принят принятый ответ, решение кажется недействительным.
nginx имеет директиву log_format , которая имеет контекст http . Это означает, что log_format может быть (допустимо) установлен только в секции http {} файла конфигурации, а НЕ в секциях сервера!
С другой стороны, у нас есть директива if , которая имеет контекст сервера и местоположения .
Таким образом, мы НЕ можем использовать «if» и «log_format» в разделе сервера (что делается в рамках принятого решения)
Так что , если здесь не поможет, также , если это зло (http://wiki.nginx.org/IfIsEvil)! Нам нужно что-то, что работает в http context , потому что только там log_format может быть определен корректно, и это единственное место вне контекста сервера, где определены наши виртуальные хосты…
К счастью, в nginx есть функция карта ! map переопределяет некоторые значения в новые значения (доступны в переменных, которые могут использоваться в директиве log_format). И хорошее сообщение: это также работает с регулярными выражениями.
Итак, давайте сопоставим наши адреса IPv4 и IPv6 с анонимными адресами. Это нужно сделать за 3 шага, поскольку map не может накапливать возвращаемые значения, она может возвращать только строки или переменные, а не их комбинацию.
Итак, сначала мы берем часть IP, которую мы хотим иметь в лог-файлах, вторая карта возвращает часть, которая символизирует анонимизированную часть, а правило 3-й карты отображает их снова вместе.
Вот правила, которые входят в контекст http {}:
map $remote_addr $ip_anonym1 {
default 0.0.0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip;
"~(?P<ip>[^:]+:[^:]+):" $ip;
}
map $remote_addr $ip_anonym2 {
default .0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0;
"~(?P<ip>[^:]+:[^:]+):" ::;
}
map $ip_anonym1$ip_anonym2 $ip_anonymized {
default 0.0.0.0;
"~(?P<ip>.*)" $ip;
}
log_format anonymized '$ip_anonymized - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log anonymized;
После добавления этого в файл конфигурации nginx.conf не забудьте перезагрузить nginx. Ваши файлы журналов теперь должны содержать анонимные IP-адреса, если вы используете «анонимный» формат журнала (это параметр формата директивы access_log).