將PHP從5.3.28升級(jí)到5.3.29時(shí)Nginx出現(xiàn)502錯(cuò)誤
今天將PHP從5.3.28升級(jí)到5.3.29,發(fā)現(xiàn)網(wǎng)站打不開了,提示”502 bad gateway”,訪問(wèn)靜態(tài)資源可以,但訪問(wèn)任何PHP文件都會(huì)502。
其實(shí)之前也發(fā)現(xiàn)這個(gè)問(wèn)題,只是一直沒找到解決辦法,所以我一直將PHP保持在5.3.28版本。
按照我以前的脾氣,我什么軟件都得要最新的穩(wěn)定版,但PHP之類的軟件是例外,因?yàn)榘姹靖吡耍瑫?huì)導(dǎo)致很多程序不兼容,相對(duì)來(lái)說(shuō)5.3兼容性算是最好的版本之一,當(dāng)然5.2也可以。
強(qiáng)迫癥實(shí)在受不了,官方說(shuō)5.3.29是5.3的最后一個(gè)版本,最后一個(gè)版本出現(xiàn)這種問(wèn)題又一直沒解決讓我很難受。
網(wǎng)上搜索了一下,沒人出現(xiàn)我這種問(wèn)題,所有的編譯過(guò)程,配置過(guò)程,都是照舊,之前從5.3.25一直到5.3.28都是用的我寫的同一個(gè)升級(jí)腳本,按道理同一個(gè)子版本系列,一樣的編譯和配置過(guò)程,不應(yīng)該出現(xiàn)問(wèn)題的。
為何5.3.25一直到5.3.28都沒問(wèn)題,到了5.3.29就沒問(wèn)題了呢?
今天終于把問(wèn)題的根源找到了,我也是醉了……
由于我不想占用額外的端口,所以Nginx和PHP-FPM之間一直使用的Unix socket,而且據(jù)說(shuō)這種方式效率也高一些。
PHP升級(jí)到5.3.29以后,出現(xiàn)502錯(cuò)誤,而且是一打開網(wǎng)頁(yè)就報(bào)錯(cuò)了,不像是由于PHP執(zhí)行超時(shí)導(dǎo)致的Nginx提示502,更像是PHP-FPM異常終止了,或者是Ngxin根本沒有連接上fastcgi。
使用PHP-FPM的日志也是郁悶,我明明開啟了日志,還設(shè)置了日志路徑,但還是沒有生成日志。
好吧,根據(jù)前面的思路推測(cè)出來(lái)的原因找問(wèn)題:
1.PHP-FPM一開始工作就異常終止了;
2.Ngxin根本沒有連接上fastcgi。
第一種可能直接就排除了,因?yàn)槌霈F(xiàn)502錯(cuò)誤的時(shí)候,后臺(tái)的PHP-FPM進(jìn)程并沒有退出,還存活得好好的。
那么很可能是第二種可能了,我把Nginx和PHP-FPM的配置文件修改了一下,改成了傳統(tǒng)的“地址:端口”的形式
PHP-FPM配置文件中:
listen = 127.0.0.1:1234
Nginx配置文件中:
fastcgi_pass 127.0.0.1:1234
重啟服務(wù),網(wǎng)站竟然順利打開了。
看來(lái)就是Nginx沒有連接上PHP-FPM了,那么問(wèn)題出在哪里呢?難道5.3.29去掉了Unix socket的連接方式?我覺得不大可能,查閱更新日志,也沒有看到有關(guān)的項(xiàng)目啊。
我將Nginx和PHP-FPM的配置文件改回去。
PHP-FPM配置文件中:
listen = /tmp/php-cgi.sock
Nginx配置文件中:
fastcgi_pass unix:/tmp/php-cgi.sock;
重啟服務(wù),立馬又502了。
首先想到了檢查權(quán)限,反正是測(cè)試,所以我二話不說(shuō)直接把那個(gè)PHP-FPM的sock文件權(quán)限改為777。
chmod 777 /tmp/php-cgi.sock
直接打開網(wǎng)頁(yè),能打開!
好吧,就是權(quán)限問(wèn)題了,重啟服務(wù),查看php-cgi.sock 的權(quán)限
-rwx------. 1 root root 663 9月 18 00:16 php-cgi.sock
這。。。原因已經(jīng)很明了了,怪不得Nginx連不上PHP-FPM,php-cgi.sock的權(quán)限竟然是700,
但問(wèn)題來(lái)了,為什么同樣的編譯和配置過(guò)程,5.3.28之前的版本就沒問(wèn)題呢?我查看另一臺(tái)沒有升級(jí)5.3.29的服務(wù)器:
srw-rw-rw- 1 root root 0 9月 16 21:11 php-cgi.sock
發(fā)現(xiàn)其權(quán)限是666,這……無(wú)法理解了……為什么5.3.28的默認(rèn)權(quán)限配置是666,到了5.3.29就變成700了呢?
查閱PHP文檔,找到解決辦法
將PHP-FPM里的配置文件加入,前兩項(xiàng)是指定php-cgi.sock的擁有者和用戶組,后一項(xiàng)是指定文件權(quán)限。
listen.owner = www
listen.group = www
listen.mode = 0666
重啟服務(wù),問(wèn)題解決。
相關(guān)文章
php實(shí)現(xiàn)mysql連接池效果實(shí)現(xiàn)代碼
這篇文章主要介紹了php代碼實(shí)現(xiàn)mysql連接池效果,需要的朋友可以參考下2018-01-01一些php項(xiàng)目中比較通用的php自建函數(shù)的詳解
本篇文章是對(duì)一些php項(xiàng)目中比較通用的php自建函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php批量刪除cookie的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了php批量刪除cookie的簡(jiǎn)單實(shí)現(xiàn)方法,實(shí)例分析了刪除單個(gè)cookie及數(shù)組遍歷的方式批量刪除cookie的技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-01-01NOD32 v2.70.32 簡(jiǎn)體中文封裝版 提供下載了
NOD32 v2.70.32 簡(jiǎn)體中文封裝版 提供下載了...2007-02-02解決form中action屬性后面?傳遞參數(shù) 獲取不到的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決form中action屬性后面?傳遞參數(shù) 獲取不到的問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07用php實(shí)現(xiàn)像JSP,ASP里Application那樣的全局變量
用php實(shí)現(xiàn)像JSP,ASP里Application那樣的全局變量...2007-01-01PHP流Streams、包裝器wrapper概念與用法實(shí)例詳解
這篇文章主要介紹了PHP流Streams、包裝器wrapper概念與用法,結(jié)合實(shí)例形式分析了php中流Streams與包裝器wrapper的基本概念及使用方法,需要的朋友可以參考下2017-11-11