標籤(空格分隔): php 502 httpphp
最近在開發一個基於php的充值後臺, 一個很簡單的充值回調接口盡然有時候會出現502的錯誤. 奇怪的是在本地都測試至關正常, 部署到服務器以後就會出現502錯誤.html
因爲本地的環境是Windows+Apache+php, 服務器是centos+nginx+php-fpm, 首先想到的是服務器環境配置出錯. 百度上搜索php 502
出現一大堆關於php與nginx配置錯誤致使的文章,好比: http://www.nginx.cn/102.html http://www.cnblogs.com/jackluo/p/3366612.htmllinux
因而, 各類php, nginx, php-fpm, linux 各類配置文件一個一個改, 一次一次重試. 然而這並無什麼用...nginx
觀察 php, nginx 日誌, 這一步應該是出現問題首先應該作的事, 這也是坑踩多了學到的經驗. nginx的日誌: /usr/local/nginx/logs/error.log php-fpm的日誌: /usr/local/php5.6/var/log/php-fpm.logcentos
不一樣的環境可能位置稍有區別api
從日誌中發現了更勁爆的錯誤:服務器
2015/07/15 09:24:04 [error] 10853#0: *6453 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 219.136.34.244, server: 203.20.249.124, request: "POST /api.php/pay/uc/callback HTTP/1.1", upstream: "fastcgi://127.0.0.1:7777", host: "203.20.249.124:81"
curl
這是nginx的錯誤日誌, 意思是沒有收到php-fpm的回覆socket
[15-Jul-2015 18:33:01.523959] WARNING: pid 10421, fpm_request_check_timed_out(), line 281: [pool www] child 10485, script '/aries/paycenter/api.php' (request: "POST /api.php") execution timed out (34.603607 sec), terminating
tcp
[15-Jul-2015 18:33:01.524747] DEBUG: pid 10421, fpm_got_signal(), line 76: received SIGCHLD
[15-Jul-2015 18:33:01.524805] WARNING: pid 10421, fpm_children_bury(), line 252: [pool www] child 10485 exited on signal 15 (SIGTERM) after 26873.226867 seconds from start
[15-Jul-2015 18:33:01.525768] NOTICE: pid 10421, fpm_children_make(), line 421: [pool www] child 21761 started
[15-Jul-2015 18:33:01.525804] DEBUG: pid 10421, fpm_event_loop(), line 419: event module triggered 1 events
這是php-fpm的日誌, 意思是php進程退出
oh my god, php進程都宕了!!! 一個簡單的請求居然致使php進程宕了.
會不會是php-fpm和nginx之間通信不順暢致使php進程宕掉? 因而, 將通訊方式由 ip:port 方式改成 socket 方式. 然而這並無什麼用...
都快崩潰了, 難道是php的bug? 出現php進程退出這種錯誤, 應該是很嚴重的問題吧, 也都不給個提示. 實在是太不人性化了/(ㄒoㄒ)/~~
這是最後的選擇了, 雖然不是很複雜, 非常也有幾百行的, 逐行逐字的註釋調試確實是個體力活!
最後發現是 $responContent = curl_exec($ch);
這個函數執行的時候致使的. curl_exec
這個自帶的函數毫無徵兆地就把php進程搞宕掉了...
解決方法是在這行以前加上一行(超時設置): curl_setopt($ch, CURLOPT_TIMEOUT, 10);
之後學乖點, 每次請求時都加個超時時間設置, 這也是血淚教訓吧...
php程序出現 502 bad gateway
時, 不要急, 不要慌, 這時越要冷靜. 按照下面這個步驟來排查: