Отладка#
Если у вас возникла техническая проблема, но нужное решение не удалось найти в других разделах, задайте нам вопрос на форуме сообщества или в Telegram-канале.
Техническая поддержка для клиентов:
Отладочный лог#
Отладочный лог следует включать перед самостоятельной диагностикой или по рекомендации технической поддержки.
Для этого запустите Angie, используя исполняемый файл с поддержкой отладки:
В готовых пакетах для Linux
файл angie-debug собран с поддержкой отладки:
$ ls -l /usr/sbin/ | grep angie
lrwxrwxrwx 1 root root 13 Sep 21 18:58 angie -> angie-nodebug
-rwxr-xr-x 1 root root 1561224 Sep 21 18:58 angie-debug
-rwxr-xr-x 1 root root 1426056 Sep 21 18:58 angie-nodebug
Настройте запуск angie-debug:
$ sudo ln -fs angie-debug /usr/sbin/angie
$ sudo angie -t && sudo service angie upgrade
Запустится обновление исполняемого файла на лету.
Чтобы вернуться к обычному исполняемому файлу после окончания отладки:
$ sudo ln -fs angie-nodebug /usr/sbin/angie
$ sudo angie -t && sudo service angie upgrade
В готовых пакетах для FreeBSD
файл angie-debug собран с поддержкой отладки:
$ ls -l /usr/local/sbin/ | grep angie
lrwxrwxrwx 1 root root 13 Sep 21 18:58 angie -> angie-nodebug
-rwxr-xr-x 1 root root 1561224 Sep 21 18:58 angie-debug
-rwxr-xr-x 1 root root 1426056 Sep 21 18:58 angie-nodebug
Настройте запуск angie-debug:
$ sudo ln -fs angie-debug /usr/local/sbin/angie
$ sudo angie -t && sudo service angie upgrade
Запустится обновление исполняемого файла на лету.
Чтобы вернуться к обычному исполняемому файлу после окончания отладки:
$ sudo ln -fs angie-nodebug /usr/local/sbin/angie
$ sudo angie -t && sudo service angie upgrade
В шаблонных Docker-образах
можно переключиться на исполняемый файл с поддержкой отладки,
переопределив переменную окружения ANGIE_BINARY:
$ docker run -it --rm -e ANGIE_BINARY="angie-debug" \
docker.angie.software/angie:templated
При самостоятельной сборке Angie нужно включить отладку перед компиляцией, а затем собрать и установить Angie, как описано в разделе Сборка Angie из исходников:
$ ./configure --with-debug ...
$ make
$ sudo make install
После установки убедитесь, что исполняемый файл собран с поддержкой отладки:
запустите его с ключом -V и найдите в выводе --with-debug.
Если параметры --prefix и --sbin-path не заданы,
путь к исполняемому файлу — /usr/local/angie/sbin/angie:
$ sudo /usr/local/angie/sbin/angie -V
...
configure arguments: --with-debug ...
Затем перезапустите Angie, чтобы перейти на новый исполняемый файл: при перезагрузке конфигурации продолжает работать уже запущенный исполняемый файл. Прежде чем запускать новый, дождитесь завершения старого главного процесса: завершаясь, он удаляет PID-файл. Если Angie не запущен, выполните только последнюю команду:
$ sudo /usr/local/angie/sbin/angie -s quit
$ while [ -e /usr/local/angie/logs/angie.pid ]; do sleep 1; done
$ sudo /usr/local/angie/sbin/angie
Чтобы перейти на новый исполняемый файл без перерыва в обслуживании, вместо этого выполните обновление исполняемого файла на лету.
Примечание
Использование исполняемого файла с поддержкой отладки может незначительно снизить производительность; включение же отладочного лога может заметно снизить ее, а также увеличить расход места на диске.
Чтобы включить отладочный лог,
задайте в конфигурации уровень debug
с помощью директивы error_log
(в шаблонных Docker-образах вместо этого используется переменная окружения,
см. вкладку Docker ниже):
error_log /path/to/log debug;
Затем примените изменения:
$ sudo angie -t && sudo service angie reload
$ sudo angie -t && sudo service angie reload
В шаблонных Docker-образах
вместо правки error_log задайте уровень
с помощью переменной окружения ANGIE_ERROR_LOG_SEVERITY;
переменная задает уровень основного лога ошибок.
Передайте ее вместе с ANGIE_BINARY при запуске контейнера:
$ docker run -it --rm -e ANGIE_BINARY="angie-debug" \
-e ANGIE_ERROR_LOG_SEVERITY="debug" \
docker.angie.software/angie:templated
Проверьте конфигурацию и отправьте сигнал перезагрузки
с помощью параметров командной строки самого исполняемого файла;
если параметры --prefix и --sbin-path не заданы,
это /usr/local/angie/sbin/angie:
$ sudo /usr/local/angie/sbin/angie -t && sudo /usr/local/angie/sbin/angie -s reload
Если вернуться на исполняемый файл без поддержки отладки,
но оставить уровень Расположение директивы error_log
влияет на полноту собираемой отладочной информации. Директива, указанная на более низком уровне конфигурации
(например, внутри блока Отладочный лог отключен для конкретного сервера Если глобально включен отладочный лог,
но для отдельного сервера error_log указан без уровня Сохранение отладочного лога на уровне сервера Чтобы для конкретного сервера по-прежнему собиралась отладочная информация,
уберите в нем переопределение error_log;
чтобы направить эту информацию в другой файл,
укажите в переопределении также уровень Можно включить отладочный лог только для
указанных клиентских адресов: Отладочный лог можно записывать в кольцевой буфер в памяти: Запись в буфер в памяти на уровне debug в директиве error_log,
Angie будет добавлять записи в лог на уровне info.Расположение директивы#
server или location),
заменяет настройки логирования, заданные на более высоком уровне
(например, на основном уровне конфигурации или внутри блока http).debug,
то для этого сервера отладочная информация собираться не будет.error_log /var/log/angie/error.log debug; # Глобальный отладочный лог
http {
server {
listen 80;
server_name example.com;
error_log /var/log/angie/example.com.error.log;
# Отладочный лог для example.com отключен, в файле - уровень error
# ...
}
server {
listen 80;
server_name another.com;
# Для этого сервера будет использоваться глобальный отладочный лог
# ...
}
}
debug:error_log /var/log/angie/error.log debug; # Глобальный отладочный лог
http {
server {
listen 80;
server_name example.com;
error_log /var/log/angie/example.com.error.log debug;
# Отладочный лог для example.com включен, но пишется в отдельный файл
# ...
}
}
Лог для отдельных адресов#
error_log /path/to/log;
events {
debug_connection 192.168.1.1;
debug_connection 192.168.10.0/24;
}
Кольцевой буфер в памяти#
error_log memory:32m debug;
debug
не будет существенно влиять на производительность даже при высоких нагрузках.
В этом случае лог можно извлечь при помощи GDB-скрипта, например:set $log = ngx_cycle->log
while $log->writer != ngx_log_memory_writer
set $log = $log->next
end
set $buf = (ngx_log_memory_buf_t *) $log->wdata
dump binary memory debug_log.txt $buf->start $buf->end
Аварийные дампы памяти#
Аварийные дампы памяти помогают в расследовании сбоев.
Прикладывайте их при обращении в поддержку.
Для сборок из наших репозиториев
мы поддерживаем отладочные символы в специальных пакетах.
Они имеют те же имена, что и оригинальные пакеты,
с добавлением суффикса -dbg, например angie-dbg.
Примечание
В этом разделе предполагается,
что вы запускаете Angie от имени пользователя root (рекомендуется).
Linux: systemd#
Чтобы включить сохранение аварийных дампов при запуске Angie как службы systemd
(например, при установке из пакетов),
измените настройки службы
в файле /lib/systemd/system/angie.service:
[Service]
...
LimitCORE=infinity
LimitNOFILE=65535
Либо обновите глобальные настройки
в файле /etc/systemd/system.conf:
[Manager]
...
DefaultLimitCORE=infinity
DefaultLimitNOFILE=65535
Затем перезагрузите конфигурацию службы и перезапустите Angie, чтобы воспроизвести условия сбоя:
$ sudo systemctl daemon-reload
$ sudo systemctl restart angie.service
После сбоя найдите файл аварийного дампа:
$ sudo coredumpctl -1 # опционально
TIME PID UID GID SIG COREFILE EXE
--- 2026-10-16 11:05:40 GMT 1157 0 0 11 present /usr/sbin/angie
$ sudo ls -al /var/lib/systemd/coredump/ # по умолчанию, см. также /etc/systemd/coredump.conf и /etc/systemd/coredump.conf.d/*.conf
...
-rw-r----- 1 root root 177662 Jul 27 11:05 core.angie.0.6135489c850b4fb4a74795ebbc1e382a.1157.1590577472000000.lz4
Linux: ручная настройка#
Этот раздел описывает Angie, запущенный без systemd,
например собранный из исходников,
и предполагает, что Angie из этой установки уже работает;
в командах используются пути такой сборки по умолчанию в /usr/local/angie.
Куда ядро записывает файл аварийного дампа, зависит от /proc/sys/kernel/core_pattern.
Если шаблон начинается с |,
ядро передает дамп программе, указанной после этого символа, например systemd-coredump,
даже если Angie запущен без systemd;
в этом случае найдите файл аварийного дампа, как описано в разделе Linux: systemd,
и пропустите шаги ниже, связанные с рабочим каталогом.
Если шаблон — простое имя, например core,
ядро записывает файл аварийного дампа в рабочий каталог аварийно завершившегося процесса;
для рабочих процессов это по умолчанию каталог, из которого запущен Angie.
Рабочие процессы выполняются от имени учетной записи, которую задает директива user
(nobody в сборке из исходников по умолчанию);
если эта учетная запись не может писать в рабочий каталог, аварийный дамп при сбое не сохранится,
поэтому создайте каталог для аварийных дампов:
$ sudo mkdir -p /var/tmp/angie-cores
$ sudo chown nobody /var/tmp/angie-cores
Укажите его директивой working_directory
в контексте main файла /usr/local/angie/conf/angie.conf:
working_directory /var/tmp/angie-cores;
Затем увеличьте лимит размера аварийного дампа.
Чтобы увеличить его только для рабочих процессов и обойтись без перезапуска,
добавьте также директиву worker_rlimit_core,
которая принимает размер, а не unlimited,
и перезагрузите конфигурацию:
worker_rlimit_core 1g;
$ sudo /usr/local/angie/sbin/angie -s reload
Чтобы увеличить лимит и для главного процесса, вместо этого перезапустите Angie. По умолчанию sudo запускает команды с нулевым лимитом размера аварийного дампа, а команда ulimit меняет лимит только для оболочки, в которой выполнена, и запущенных из нее команд. Остановите работающий Angie, дождитесь завершения его главного процесса, а затем увеличьте лимит и запустите Angie в одной оболочке с правами root:
$ sudo /usr/local/angie/sbin/angie -s quit
$ while [ -e /usr/local/angie/logs/angie.pid ]; do sleep 1; done
$ sudo sh -c 'ulimit -c unlimited && exec /usr/local/angie/sbin/angie'
В сборке из исходников, сконфигурированной с --with-debug,
поддержка отладки есть в самом /usr/local/angie/sbin/angie;
отдельного исполняемого файла angie-debug в ней нет.
Проверьте лимит рабочего процесса:
после перезапуска оба значения равны unlimited,
а с worker_rlimit_core они показывают заданный размер в байтах:
$ grep 'core file' /proc/$(pgrep -n -f 'angie: worker process')/limits
Max core file size unlimited unlimited bytes
Затем воспроизведите сбой.
Если аварийный дамп сохранился, в логе ошибок
(по умолчанию /usr/local/angie/logs/error.log) появится сообщение
worker process PID exited on signal номер (core dumped);
то же сообщение без (core dumped) означает,
что дамп не сохранился из-за лимита или рабочего каталога.
Найдите файл аварийного дампа:
$ sudo ls -al /var/tmp/angie-cores
...
-rw------- 1 nobody nogroup 177662 Jul 27 11:05 core.1157
FreeBSD#
Проверьте настройки аварийных дампов
в файле /etc/sysctl.conf, при необходимости измените их:
kern.coredump=1 # должно быть равно 1
kern.corefile=/path/to/core/files/%N.core # нужен корректный путь
Либо обновите настройки во время выполнения:
$ sudo sysctl kern.coredump=1
$ sudo sysctl kern.corefile=/path/to/core/files/%N.core
В любом случае учетная запись, которую задает директива user,
должна иметь право записи в каталог из kern.corefile:
от ее имени выполняются рабочие процессы, и туда они записывают аварийные дампы.
Затем перезапустите Angie, чтобы воспроизвести условия сбоя. Если Angie установлен как служба:
$ sudo service angie restart
Если Angie установлен вручную, остановите его, дождитесь завершения его главного процесса, а затем увеличьте лимит размера аварийного дампа и запустите Angie в одной оболочке с правами root, как в Linux:
$ sudo <путь к установочному каталогу Angie>/sbin/angie -s quit
$ while [ -e <путь к установочному каталогу Angie>/logs/angie.pid ]; do sleep 1; done
$ sudo sh -c 'ulimit -c unlimited && exec <путь к установочному каталогу Angie>/sbin/angie'
После сбоя найдите файл аварийного дампа:
$ sudo ls -al <путь к файлам аварийных дампов>
...
-rw------- 1 nobody nobody 9912320 Jul 27 11:05 angie.core