Назад | Перейти на главную страницу

Ubuntu 16.04, время ожидания PHP-FPM при загрузке с модулем libsodium-php

Проблема (изменена: с помощью REPRO STEPS!)

Для воспроизведения разверните новый 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

Вопрос

Теперь, когда я сузил проблему, я действительно ищу:

  1. Способ выяснить Зачем истекает время ожидания (есть ли хороший способ профилировать, к каким ресурсам осуществляется доступ или что делает процесс во время загрузки?)

  2. Способ исправить это (есть ли способ изменить порядок загрузки, чтобы libsodium загружался последней, если это проблема с зависимостью?)

Новые обновления

Я продолжил изучать это и понял, что весь PHP останавливается во время инициализации библиотеки libsodium (вызов sodium_init()). Этот вызов занимает около 3-4 минут, и до этого времени прошел даже звонок php -v терпит неудачу.

В качестве обходного пути я добавил следующее к /lib/systemd/system/php7.0-fpm.service:

TimeoutStartSec=600

Это заставляет мой веб-сервер возвращать код состояния HTTP 502 в течение нескольких минут после перезагрузки, но в конечном итоге он снова начинает работать (лучше, чем вручную войти в систему и исправить это)

Я попытаюсь связаться с разработчиками libsodium и libsodium-php, чтобы найти лучшее решение, однако на данный момент я считаю, что решил это сам:

Решение

  1. Если что-то не работает при запуске, начните расследование с journalctl -u <service>

  2. Если время истекает, попробуйте новую установку - отключите все расширения, модули, плагины, удалите пользовательскую конфигурацию и т. Д. Если новая установка работает, включайте все по очереди, пока не найдете причину.

  3. Если вам абсолютно необходим плагин / расширение / что-то еще, вы можете увеличить время ожидания, изменив *.service файл и добавление TimeoutStartSec=...

Проблема заключается в PHP-расширении libsodium. Я начал разговор с разработчиком libsodium, чтобы поработать над исправлением. На данный момент:

Решение

  1. Если что-то не работает при запуске, начните расследование с journalctl -u <service>

  2. Если время истекает, попробуйте новую установку - отключите все расширения, модули, плагины, удалите пользовательскую конфигурацию и т. Д. Если новая установка работает, включайте все по очереди, пока не найдете причину.

  3. Если вам абсолютно необходим плагин / расширение / что-то еще, вы можете увеличить время ожидания, изменив *.service файл и добавление TimeoutStartSec=...