В 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:
- https://forum.onlyoffice.com/t/onlyoffice-doc-community-server-stopped-every-day/805/2
- https://bugs.launchpad.net/ubuntu/+source/perl/+bug/1897561
Чтобы обойти эту проблему я удалил модуль — 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 — здесь.