Во время работы Nginx могут возникать ошибки, приводящие к экстренному прерыванию выполнения запросов, вследствие чего Nemesida WAF не может корректно обработать запрос. Для отслеживания и исправления ошибок в коде применяется анализ записи образа памяти процесса (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. Активируйте запись сообщений в системе:

# echo "/var/log/nginx/core.%e.%p" | tee /proc/sys/kernel/core_pattern
# sysctl -w 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)