Ubuntu — Rsyslog server, nginx acces log collector
Надоело мне смотреть логи nginx на разных серверах кластера путём переключения консолей, а захотелось видеть всё в одном потоке. Такое умеет стандартный менеджер логов в поставке Ubuntu (и не только) - rsyslog, его и будем использовать.
Для начала настроим клиенты, те машины что логи будут отправлять:
$ModLoad imfile
# Указываем какой файл будем экспортировать
$InputFileName /var/log/nginx/access.log
# Назначаем тэг, который будет дописываться на сервере получателе, чтобы можно было понять с какой машины пришла запись
$InputFileTag hostX-access:
# Временный файл, в который rsyslog будет записывать текущую позицию
$InputFileStateFile access
# Источник сообщения
$InputFileFacility local0
# Уровень серьёзности сообщения
$InputFileSeverity info
# Запускаем мониторинг изменений в файле
$InputRunFileMonitor
# Отправлять накопленные данные будем каждую секунду
$InputFilePollInterval 1
# Указываем куда будем отправлять, в данном случае все сообщения local0 будут отправляться по UDP со сжатием gzip 7 на сервер 192.168.1.1
local0.* @(z7)192.168.1.1:514
Такой конфиг нужно будет сделать на каждом сервере (hostX можно пронумеровать по каждому серверу или назначить более понятные вам теги).
Также нужно проверить что rsyslog сможет прочитать логи и сохранить файлы состояний:
chmod 0750 /var/spool/rsyslog && \
chmod 0755 /var/log/nginx/ && \
chmod 0644 /var/log/nginx/access.log
Если у вас работает logrotate то нужно поправить конфиг чтобы новые файлы логов nginx создавались с правами 0644:
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0644 www-data adm # поправлено
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Конфиг сервера, в /etc/rsyslog.conf добавить настройку приёма логов по UDP:
$UDPServerRun 514 # Порт нужно будет открыть на фаерволе
# Не забываем установить ограничения от кого можно принимать логи, IP перечисляются через запятую
$AllowedSender UDP, 192.168.1.0/24
В конфиге по-умолчанию, если логи с серверов не нужны в syslog сервера нужно добавить указание куда их собирать
local0.* -/var/log/group.access.log
service rsyslog restart и можно наблюдать полную картину:
Отладка
Если что-то не будет работать, можно запустить rsyslog в режиме отладки, например так:
На сервере можно слушать порт таким образом:
Nginx — Как убрать вопрос «?» в строке адреса
Бывает необходимо сделать из адреса /index.php? просто /index.php (без ненужного вопроса). Для чего? Ну например для
Помню что где-то видел решение, но где забыл, а заодно и забыл как это было сделано 🙁
Пришлось сделать своё, метод далеко не нов, но лучше я его запишу:
...
set $rr 0;
if ($request_uri ~ ^/index.php\?$) {
set $rr 1;
}
if ($request_method = POST) {
set $rr 0;
}
if ($rr) {
rewrite .* /index.php permanent;
}
...
}
Очень просто.