Мне нужно изменить LogFormat в Apache, чтобы добавить X-Forwarded-For
заголовок и регистрировать реальные IP-адреса клиентов. Я попытался отредактировать это в httpd.conf файл, но затем я нашел две отдельные части для LogFormat. Поэтому я не уверен, дублируются ли они, следует ли мне удалять какие-либо из них или нет, и я не знаю, какие из них редактировать, или мне следует редактировать их все. Мне нужен совет по этому поводу.
Вот первая часть:
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
</IfModule>
Вторая часть:
<IfModule mod_log_config.c>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log common
</IfModule>
Я не знаю, в чем разница между первой и второй частью. Я вижу, что две строки дублируются в двух частях. Итак, какую часть мне следует отредактировать? Безопасно ли удалить повторяющиеся строки с одной части и оставить другую? Могу ли я объединить недублированные строки в одну деталь? Спасибо.
Директива IfModule должна принимать конфигурацию, только если модуль был загружен. Чтобы проверить, какие модули загружены, вы можете использовать
httpd -M -f path-to-config-file
используя Linuxhttpd -t -D DUMP_MODULES
используя окнапример
[root@apachesrv bin]# httpd -M -f conf/httpd-vserver.conf
Loaded Modules:
core_module (static)
...
log_config_module (shared)
...
proxy_http_module (shared)
schema_module (shared)
Syntax OK
В этом случае вы можете видеть, что я использую log_config_module, поэтому он примет (в моем случае) конфигурацию
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
</IfModule>
Чтобы получить нужную информацию, вам нужно настроить журнал, например:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" combinedcustomized
А затем измените свой журнал доступа на:
CustomLog logs/access.log combinedcustomized
РЕДАКТИРОВАТЬ:
В документе apache у вас есть список доступных параметров для регистрации http://httpd.apache.org/docs/2.4/mod/mod_log_config.html
На моем centos 7.4 у меня есть только
<IfModule log_config_module>
директива в httpd.conf, а модуль log_config_module загружается через файл конфигурации /etc/httpd/conf.modules.d/00-base.conf
Я изменил эту строку только для того, чтобы она работала. (но вы измените формат журнала из-за новой строки для IP-адреса клиента)
LogFormat "%h %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Есть более "элегантный" способ сделать это (заменив ip прокси на ip клиента, если присутствует поле x-forwarded-for), но я не могу заставить его работать (отображается только ip прокси)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combied
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
CustomLog "logs/access_log" combined env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded
В соответствии с документы apache оба раздела эквивалентны:
Description: Logging of the requests made to the server
Status: Base
Module Identifier: log_config_module
Source File: mod_log_config.c
Удалите (или закомментируйте) тот, который, по вашему мнению, вы не будете использовать, иначе у вас будут всевозможные головные боли позже, если по какой-то причине вы измените их порядок (следовательно, приоритет).