Nginx reload приводит к segfault

В Ubuntu 20.04.11 заметил баг, который уже исправили в новых версиях системы: nginx reload приводит к segfault.















Описание ошибки




Обнаружил я этот баг при установке Nextcloud + Onlioffice на операционную систему Ubuntu 20.04.11. После установки всё работало, но на следующий день перестало работать, так как произошло падение nginx. Запустил его снова и стал разбираться в проблеме.




Первым делом я полез смотреть логи и в syslog заметил что служба nginx периодически перезапускается (выполняет reload). И всегда после третьего перезапуска падает с ошибкой segfault. Уже не помню, но приложение Onlyoffice или что-то ещё создало таймер который периодически перезапускал nginx. И nginx всегда падал после третьего перезапуска.




Обход ошибки




Дальше стал гуглить и нашёл причину этой ошибки. Сервер документов Onlyoffice для своей работы требует пакет nginx-extras. Этот пакет, в свою очередь, устанавливает различные модули к nginx. Один из модулей — /etc/nginx/modules-enabled/50-mod-http-perl.conf обращается к библиотеке libperl.so версии 5.30.0 и служба nginx падает при третьем reload.




Узнал я всё это благодаря форуму Onlyoffice и ссылке на bug:







Чтобы обойти эту проблему я удалил модуль — 50-mod-http-perl.conf, он для работы не требовался. И служба nginx перестала падать.




Воспроизведение ошибки




Воспроизвести можно на чистой системе Ubuntu 20.04.11. Возможно в старших версиях этот баг пофиксен. Ну а в 22.04 и выше пофиксен точно. Эту проблему решили обновлением libperl до версии 5.34.




Для воспроизведения установим пакет nginx-extras:




# apt install nginx-extras




Теперь запустим службу nginx и проверим её работу:




# systemctl start nginx.service

# systemctl status nginx.service   
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-08-05 10:47:00 UTC; 6s ago




Как видите, служба nginx работает.




Теперь выполняем 3 раза reload службы nginx:




# systemctl reload nginx.service 
# systemctl reload nginx.service 
# systemctl reload nginx.service 
nginx.service is not active, cannot reload.




Как видите после третьего reload служба nginx сообщила что она не активна, при этом в логах syslog будет segfault.




Проверяем статус службы:




# systemctl status nginx.service 
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: failed (Result: signal) since Fri 2022-08-05 10:47:13 UTC; 2s ago




Статус службы подтверждает что служба упала.




Итог




Иногда нам приходится работать со старыми версиями систем или программ, поэтому решил что стоит описать эту проблему в этой заметке. Вдруг кто-то тоже столкнется с такой ситуацией.




Другие статьи связанные с Nginx — здесь.



2023-11-22T14:53:04
Сервера Linux