Для воспроизведения разверните новый VPS с Ubuntu 16.04 (возможно, работает с любым дистрибутивом Debian, но не протестирован) и следуйте этим инструкциям:
Экспериментируя, я свел инструкции к минимуму, необходимому для воспроизведения
apt-get install php7.0 php7.0-dev php-pear
apt-get install libsodium-dev
pecl install libsodium
echo "extension=libsodium.so" >> /etc/php/7.0/fpm/php.ini
shutdown -r 0
Когда перезагружаю сервер (shutdown -r 0
) PHP-FPM мертв (подтвердите через service php7.0-fpm status
)
Если я сбегу service php7.0-fpm start
, он запускается в считанные миллисекунды без проблем.
Я создал проблему с трекером libsodium-php в надежде, что кто-то найдет там решение: https://github.com/jedisct1/libsodium-php/issues/94
Теперь, когда я сузил проблему, я действительно ищу:
Способ выяснить Зачем истекает время ожидания (есть ли хороший способ профилировать, к каким ресурсам осуществляется доступ или что делает процесс во время загрузки?)
Способ исправить это (есть ли способ изменить порядок загрузки, чтобы libsodium загружался последней, если это проблема с зависимостью?)
Я продолжил изучать это и понял, что весь PHP останавливается во время инициализации библиотеки libsodium (вызов sodium_init()
). Этот вызов занимает около 3-4 минут, и до этого времени прошел даже звонок php -v
терпит неудачу.
В качестве обходного пути я добавил следующее к /lib/systemd/system/php7.0-fpm.service
:
TimeoutStartSec=600
Это заставляет мой веб-сервер возвращать код состояния HTTP 502 в течение нескольких минут после перезагрузки, но в конечном итоге он снова начинает работать (лучше, чем вручную войти в систему и исправить это)
Я попытаюсь связаться с разработчиками libsodium и libsodium-php, чтобы найти лучшее решение, однако на данный момент я считаю, что решил это сам:
Если что-то не работает при запуске, начните расследование с journalctl -u <service>
Если время истекает, попробуйте новую установку - отключите все расширения, модули, плагины, удалите пользовательскую конфигурацию и т. Д. Если новая установка работает, включайте все по очереди, пока не найдете причину.
Если вам абсолютно необходим плагин / расширение / что-то еще, вы можете увеличить время ожидания, изменив *.service
файл и добавление TimeoutStartSec=...
Проблема заключается в PHP-расширении libsodium. Я начал разговор с разработчиком libsodium, чтобы поработать над исправлением. На данный момент:
Если что-то не работает при запуске, начните расследование с journalctl -u <service>
Если время истекает, попробуйте новую установку - отключите все расширения, модули, плагины, удалите пользовательскую конфигурацию и т. Д. Если новая установка работает, включайте все по очереди, пока не найдете причину.
Если вам абсолютно необходим плагин / расширение / что-то еще, вы можете увеличить время ожидания, изменив *.service
файл и добавление TimeoutStartSec=...