Во время работы Nginx могут возникать ошибки, приводящие к экстренному прерыванию выполнения запросов, вследствие чего Немезида ВАФ не может корректно обработать запрос. Для отслеживания и исправления ошибок в коде применяется анализ записи образа памяти процесса (core dump
).
Настройка
Для активации функционала отслеживания и записи информации о core dump
необходимо выполнить следующие действия:
1. Создайте директорию для хранения записей о core dump
:
# mkdir /var/log/nginx/core_dumps
# chown root:root /var/log/nginx/core_dumps
# chmod 1777 /var/log/nginx/core_dumps
2. Снимите ограничение на максимальный размер файла с образом памяти процесса:
# ulimit -c unlimited
Если команда завершается с сообщением "Cannot modify limit: operation not permitted"
, выполните команду:
# sh -c "ulimit -c unlimited && exec su $LOGNAME"
3. Активируйте запись сообщений в системе, добавив соответствующие строки в /etc/sysctl.conf
:
kernel.core_pattern = /var/log/nginx/core.%e.%p
fs.suid_dumpable = 2
И примените изменения:
# sysctl -p
4. Активируйте запись сообщений в Nginx:
4.1 В начало файла конфигурации Nginx /etc/nginx/nginx.conf
добавьте:
worker_rlimit_core 2G;
working_directory /var/log/nginx/core_dumps/;
4.2 Сохраните изменения и перезапустите Nginx:
# systemctl restart nginx
Дополнительные возможности
Активируйте запись в файл запросов, находящихся в памяти рабочего процесса на момент возникновения ошибки, связанной с
core dump
, добавив параметр
nwaf_coredump_request_path
в файл конфигурации динамического модуля Nemesida WAF
/etc/nginx/nwaf/conf/global/nwaf.conf
:
nwaf_coredump_request_path /var/log/nginx/coredump_requests;
При использовании параметра, на каждый рабочий процесс Nginx будет выделяться по 25 Мб
памяти для промежуточного хранения запросов. После заполнения 75%
выделенного объема памяти под каждый запрос выделяется по 64 Кб
, обрезая тело запроса.
Активация регистрации записей о core dump
и запросов, находящихся в памяти рабочего процесса, существенно влияют на производительность Nginx и генерируют файлы большого объема, поэтому рекомендуется отключать функции после получения необходимой информации.
Анализ полученных данных
Для просмотра собранных записей о core dump
необходимо воспользоваться отладчиком GDB
, выполнив команду gdb path/to/nginx -c path/to/core_dumps
:
Пример вывода
# gdb /usr/sbin/nginx -c /var/log/nginx/core_dumps/core.XX.YY
...
[New LWP XXXX1]
[New LWP XXXX2]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `nginx: worker process '.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00005600c259077a in ngx_radix32tree_find ()
[Current thread is 1 (Thread 0x7f6ca08e9740 (LWP XXXXX))]
(gdb)
Выполните команду bt
(backtrace
— вывод стека вызова функций до момента наступления ошибки):
Пример вывода
(gdb) bt
#0 0x00005600c259077a in ngx_radix32tree_find ()
#1 0x00005600c25ffd84 in ?? ()
#2 0x00005600c25ce948 in ngx_http_get_indexed_variable ()
#3 0x00005600c25cf7e6 in ngx_http_script_copy_var_len_code ()
#4 0x00005600c25cfa9a in ngx_http_complex_value ()
#5 0x00005600c2603428 in ?? ()
#6 0x00005600c25ce948 in ngx_http_get_indexed_variable ()
#7 0x00005600c25cea47 in ngx_http_get_flushed_variable ()
#8 0x00005600c25d1783 in ngx_http_script_var_code ()
#9 0x00005600c2604956 in ?? ()
#10 0x00005600c25be8ec in ngx_http_core_rewrite_phase ()
#11 0x00005600c25ba0be in ngx_http_core_run_phases ()
#12 0x00005600c25ba163 in ngx_http_handler ()
#13 0x00005600c25c4d08 in ngx_http_process_request ()
#14 0x00005600c25c5284 in ?? ()
#15 0x00005600c25c55c4 in ?? ()
#16 0x00005600c25c576f in ?? ()
#17 0x00005600c25ac12d in ?? ()
#18 0x00005600c25a2996 in ngx_process_events_and_timers ()
#19 0x00005600c25aa5d9 in ?? ()
#20 0x00005600c25a8cd2 in ngx_spawn_process ()
#21 0x00005600c25a9874 in ?? ()
#22 0x00005600c25ab100 in ngx_master_process_cycle ()
#23 0x00005600c2583ae2 in main ()
(gdb)