Ubuntu
Ubuntu 16.04,PHP-FPM 在啟動時使用 libsodium-php 模組超時
問題(修改:使用 REPRO STEPS!)
要重現,請使用 Ubuntu 16.04 啟動一個新的 VPS(可能適用於任何 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
這會導致我的 Web 伺服器在重新啟動後的幾分鐘內返回 HTTP 狀態程式碼 502,但最終它會再次開始工作(比手動登錄並修復它要好)
我將嘗試與 libsodium 和 libsodium-php 的開發人員聯繫以找到更好的解決方案,但是現在我相信我自己已經解決了這個問題:
解決方案
- 當某些東西在啟動時沒有執行時,開始調查
journalctl -u <service>
- 如果超時,請嘗試全新安裝——禁用所有擴展、模組、外掛、刪除自定義配置等。如果全新安裝有效,請一次啟用一項,直到找到原因
- 如果您絕對需要外掛/副檔名/任何東西,那麼您可以通過修改
*.service
文件並添加來增加超時TimeoutStartSec=...
問題在於 libsodium PHP 擴展。我已經開始與 libsodium 的開發人員進行對話以進行修復。目前:
解決方案
- 當某些東西在啟動時沒有執行時,開始調查
journalctl -u <service>
- 如果超時,請嘗試全新安裝——禁用所有擴展、模組、外掛、刪除自定義配置等。如果全新安裝有效,請一次啟用一項,直到找到原因
- 如果您絕對需要外掛/副檔名/任何東西,那麼您可以通過修改
*.service
文件並添加來增加超時TimeoutStartSec=...