線上不出點問題, 彷佛今天就不是週五了.php
忽然報警羣裏出現了某一條數據, 反饋沒有上報成功, 中間流程執行完, 後面沒再執行了(細思極恐)html
無語。。。nginx
想了想剛纔有發版, 可是不是這個引發的還不肯定 (咱們目前沒有灰度發佈-_-)緩存
首先我得肯定下這條數據的到達時間, error日誌查, 查看業務日誌是否有太重要的打點信息, 經過從access日誌裏面, 定位到這條問題數據請求時間爲 10:22:42bash
經過查看聊天記錄,10點多有個上線操做, 而且別的項目以前一上線就抱怨說可能就會有502出現, 由此我想咱們發佈服務中間可能操做了什麼出現的問題服務器
嗯。。萬事不求人, 看下php-fpm的日誌就知道啥時候上過線了(咱們構建項目會重啓fpm).socket
發現php-fpm.log文件內容:php-fpm
[19-Apr-2019 10:22:42] NOTICE: Reloading in progress ...
[19-Apr-2019 10:22:42] NOTICE: reloading: execvp("/usr/local/php-fpm_9000/sbin/php-fpm", {"/usr/local/php-fp m_9000/sbin/php-fpm", "--daemonize", "--fpm-config", "/usr/local/php-fpm_9000/etc/php-fpm.conf", "--pid", "/ usr/local/php-fpm_9000/var/run/php-fpm.pid"})
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
[19-Apr-2019 10:22:42] NOTICE: using inherited socket fd=8, "127.0.0.1:9000"
[19-Apr-2019 10:22:42] NOTICE: using inherited socket fd=8, "127.0.0.1:9000"
[19-Apr-2019 10:22:42] NOTICE: fpm is running, pid 23324
[19-Apr-2019 10:22:42] NOTICE: ready to handle connections
複製代碼
nginx錯誤:oop
[error] 66#0: *10 recv() failed (104: Connection reset by peer) while reading response header from upstream
複製代碼
這個錯誤很熟悉吧,以前文章已經介紹過了.優化
發佈服務重啓php-fpm, 致使的代碼流程執行中斷.
首先思考中斷可能的緣由:
這些問題應該不會, 這個被中斷的服務 沒有依賴的服務請求, 也沒有複雜的業務邏輯.(不要問爲啥沒問題,由於這是我寫的+_+)
藉助着搜索引擎的力量, 找問題就變得傻瓜起來
記 php-fpm 重啓致使的 程序執行中斷問題 yq.aliyun.com/articles/22…
重啓php-fpm時請求發生502錯誤的緣由及解決:process_control_timeout www.04007.cn/article/439…
PHP-FPM參數 www.jianshu.com/p/795a1a181…
Graceful Restart (USR2) isn't very graceful bugs.php.net/bug.php?id=…
最後詳細的讀了下最後一篇向官方反饋的bug, php-fpm的平滑重啓不平滑
其中目前建議:
[2013-02-13 15:57 UTC] phpbugs at oops dot mooo dot com
Try setting process_control_timeout to something higher than 0.
複製代碼
參數含義是 設置子進程接受主進程複用信號的超時時間. 控制子進程處理來自master的信號的時間,默認爲0.若是正在處理請求, 極可能會收到錯誤報警。建議將此參數設置爲相同的值 request_terminate_timeout,以便worker有時間完成處理請求。
<?php
echo 1;
sleep(10);
echo 3;
複製代碼
訪問中, 進行 kill -USR2 10 報錯:
將 php-fpm.conf 的 process_control_timeout 配置爲20
進行 kill -USR2 11
正常輸出結果.
後續是否有反作用還須要在生產環境驗證
服務發佈優化也不只於此
爲何要每次重啓fpm
好比能不能用其餘方式使緩存失效呢?
更多有趣的計算機技術關注 呆呆熊一點通 :