-------------------
[warn] conflicting server name "192.168.1.86" on 0.0.0.0:80, ignored
[warn]: conflicting server name “abc.com” on 0.0.0.0:80, ignored
出現(xiàn)這個(gè)錯(cuò)誤一般是由于技術(shù)員的粗心造成的,原因是相同的域名abc.com出現(xiàn)兩次甚至是多次
一般在把配置文件分離出來寫時(shí)候會(huì)容易犯。技術(shù)員經(jīng)常復(fù)制配置文件,然后忘記修改里面的內(nèi)容
解決方法就是把所有配置文件查一遍看是否有重復(fù)出現(xiàn)的。
或者查詢哪個(gè)配置文件中有abc.com
WINDOW下用搜索
LINUX下用grep "abc.com"
-------------------nginx_error.log
2011/05/27 21:36:14 [error] 6921#0: *21138 upstream timed out (110: Connection timed out) while connecting to upstream, client: 183.39.194.179, server: www.***.com, request: "GET /ajax/userinit?1306503433302 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.***.com", referrer: "http://www.***.com/view/200000"
從日志的表示來看應(yīng)該不是nginx的問題,而是 fast-cgi 執(zhí)行超時(shí)沒有及時(shí)返回?cái)?shù)據(jù)到ngnix的問題. 可web和數(shù)據(jù)庫(kù)負(fù)載都不高,不應(yīng)該是
程序超時(shí)的問題. 查資料也沒有找到原因,網(wǎng)上于幾個(gè)人說遇到同樣問題,也沒有好的解決方案. 后來仔細(xì)分析日志,發(fā)現(xiàn)出現(xiàn)錯(cuò)誤的日志的時(shí)間都是大于當(dāng)前時(shí)間
,這點(diǎn)很奇怪,難道是系統(tǒng)時(shí)間的問題? 后來再仔細(xì)查資料,才找到原因. 原來是 centos 的一個(gè)內(nèi)核bug, 調(diào)用gettimeofday()這個(gè)函數(shù)的時(shí)候會(huì)比當(dāng)前時(shí)間快4398秒
. 具體原因是因?yàn)槎嗪薱pu,各核的TSC不一樣造成的. 看來 fast-cgi 應(yīng)該是調(diào)用了這個(gè)函數(shù)的.
解決方案是升級(jí)內(nèi)核.. 相信很多和我一樣不是專業(yè)sa的兄弟對(duì)升級(jí)內(nèi)核之類的事情還是比較犯怵的,不過不用擔(dān)心有一個(gè)不用升級(jí)內(nèi)核的解決方案. 在不升級(jí)kernel的情況下,可以考慮修改time source,來解決。修改kernel option。
vi /boot/grub/grub.conf 增加如下紅色的參數(shù), 重啟后問題解決
kernel **** ro root=***** rhgb quiet clock=pit
============================= NGINX 啟動(dòng)時(shí)報(bào)錯(cuò)“[warn]: conflicting server name “xxx.com” on 0.0.0.0:80, ignored”
include vhost/*.conf;
一般是由于技術(shù)人員配置時(shí)使用Include 語句,使用了nginx.conf之外的配置文件,如果兩個(gè)配置文件重復(fù)配置了xxx.com就會(huì)出現(xiàn)這個(gè)錯(cuò)誤。
=======================今天PHP的導(dǎo)出EXCEL里面突然出現(xiàn)超時(shí)
雖然我在PHP腳本里面寫了set_time_limit(0);
但是他還是出現(xiàn)那種50x錯(cuò)誤
查看日志文件后發(fā)現(xiàn)里面寫著:
upstream timed out (110: Connection timed out) while reading response
header from upstream
解決辦法如下:
編輯ngnix對(duì)應(yīng)的虛擬主機(jī)配置文件
fastcgi_read_timeout 后面的時(shí)間可以根據(jù)自己的情況設(shè)置,默認(rèn)是60秒
location ~ .+\.php?$
{
fastcgi_pass 127.0.0.1:1025;
# fastcgi_pass unix:/usr/local/webserver/fastcgi/sock/fastcgi.sock;
fastcgi_index index.php;
# For Time out 這句是注釋,可以不寫
fastcgi_read_timeout 500;
include fastcgi_params;
}
=======================nginx502 Bad Gateway
Nginx 502 Bad Gateway的含義是請(qǐng)求的PHP-CGI已經(jīng)執(zhí)行,但是由于某種原因(一般是讀取資源的問題)
沒有執(zhí)行完畢而導(dǎo)致PHP-CGI進(jìn)程終止。
Nginx 502錯(cuò)誤的原因比較多,是因?yàn)樵诖砟J较潞蠖朔?wù)器出現(xiàn)問題引起的。
這些錯(cuò)誤一般都不是nginx本身的問題,一定要從后端找原因!
php-cgi進(jìn)程數(shù)不夠用、php執(zhí)行時(shí)間長(zhǎng)、或者是php-cgi進(jìn)程死掉,都會(huì)出現(xiàn)502錯(cuò)誤
502錯(cuò)誤最通常的出現(xiàn)情況就是后端主機(jī)當(dāng)機(jī)
vim /usr/local/webserver/php/etc/php-fpm.conf
一般來說Nginx 502 Bad Gateway和php-fpm.conf的設(shè)置有關(guān),
php-fpm.conf有兩個(gè)至關(guān)重要的參數(shù),一個(gè)是”max_children”,另一個(gè)是”request_terminate_timeout” ,但是這個(gè)值不是通用的,而是需要自己計(jì)算的。
計(jì)算的方式如下:
如果你的服務(wù)器性能足夠好,且寬帶資源足夠充足,PHP腳本沒有系循環(huán)或BUG的話你可以直接將”request_terminate_timeout”設(shè)置成0s。0s的含義是讓PHP-CGI一直執(zhí)行下去而沒有時(shí)間限制。而如果你做不到這一點(diǎn),也就是說你的PHP-CGI可能出現(xiàn)某個(gè)BUG,或者你的寬帶不夠充足或者其他的原因?qū)е履愕腜HP-CGI能夠假死那么就建議你給”request_terminate_timeout”賦一個(gè)值,這個(gè)值可以根據(jù)你服務(wù)器的性能進(jìn)行設(shè)定。一般來說性能越好你可以設(shè)置越高,20分鐘 -30分鐘都可以。由于我的服務(wù)器PHP腳本需要長(zhǎng)時(shí)間運(yùn)行,有的可能會(huì)超過10分鐘因此我設(shè)置了900秒,這樣不會(huì)導(dǎo)致PHP-CGI死掉而出現(xiàn)502 Bad gateway這個(gè)錯(cuò)誤。
而”max_children”這個(gè)值又是怎么計(jì)算出來的呢?這個(gè)值原則上是越大越好,php-cgi的進(jìn)程多了就會(huì)處理的很快,排隊(duì)的請(qǐng)求就會(huì)很少。設(shè)置”max_children”也需要根據(jù)服務(wù)器的性能進(jìn)行設(shè)定,一般來說一臺(tái)服務(wù)器正常情況下每一個(gè)php-cgi所耗費(fèi)的內(nèi)存在20M左右,因此我的”max_children”我設(shè)置成40個(gè),20M*40=800M也就是說在峰值的時(shí)候所有PHP-CGI所耗內(nèi)存在800M以內(nèi),低于我的有效內(nèi)存1Gb。而如果我的”max_children”設(shè)置的較小,比如5-10個(gè),那么 php-cgi就會(huì)“很累”,處理速度也很慢,等待的時(shí)間也較長(zhǎng)。如果長(zhǎng)時(shí)間沒有得到處理的請(qǐng)求就會(huì)出現(xiàn)504 Gateway Time-out這個(gè)錯(cuò)誤,而正在處理的很累的那幾個(gè)php-cgi如果遇到了問題就會(huì)出現(xiàn)502 Bad gateway這個(gè)錯(cuò)誤。
----------------一般解決辦法
遇到502問題,可以優(yōu)先考慮按照以下兩個(gè)步驟去解決。
1、查看當(dāng)前的PHP FastCGI進(jìn)程數(shù)是否夠用:
netstat -anpo | grep "php-cgi" | wc -l
如果實(shí)際使用的“FastCGI進(jìn)程數(shù)”接近預(yù)設(shè)的“FastCGI進(jìn)程數(shù)”,那么,說明“FastCGI進(jìn)程數(shù)”不夠用,需要增大。
# ps aux | grep php-cgi |wc -l
130
# netstat -anpo | grep "php-cgi" | wc -l
450
# netstat -anpo | grep "php-cgi" |more
tcp 0 0 192.168.12.201:52719 192.168.12.203:13002 ESTABLISHED 27687/php-cgi off (0.00/0/0)
tcp 0 0 192.168.12.201:52713 192.168.12.203:13002 ESTABLISHED 27685/php-cgi off (0.00/0/0)
tcp 0 0 192.168.12.201:52694 192.168.12.203:13002 ESTABLISHED 27682/php-cgi off (0.00/0/0)
tcp 0 0 192.168.12.201:52688 192.168.12.203:13002 ESTABLISHED 27681/php-cgi off (0.00/0/0)
tcp 0 0 192.168.12.201:52701 192.168.12.203:13002 ESTABLISHED 27683/php-cgi off (0.00/0/0)
重啟后# netstat -anpo | grep "php-cgi" | wc -l
46
[root@jushanweb1 ~]# netstat -anpo | grep "nginx" | wc -l
17
[root@jushanweb1 ~]# ps aux | grep nginx |wc -l
10
2、部分PHP程序的執(zhí)行時(shí)間超過了Nginx的等待時(shí)間,可以適當(dāng)增加nginx.conf配置文件中FastCGI的timeout時(shí)間,例如:
...... http { ...... fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; ...... } ......
php.ini中memory_limit設(shè)低了會(huì)出錯(cuò),修改了php.ini的memory_limit為128M,重啟nginx,發(fā)現(xiàn)好了,原來是PHP的內(nèi)存不足了。
---------------臨時(shí)解決辦法:
綜上所述,Nginx提示502和504錯(cuò)誤的臨時(shí)解決辦法是:
1、調(diào)整php-fpm.conf的相關(guān)設(shè)置:
<value name=”max_children”>32</value>
<value name=”request_terminate_timeout”>30s</value> fast-cgi的執(zhí)行腳本時(shí)間
--------------------------終級(jí)解決方案:
標(biāo)題3中所示的解決方案只能臨時(shí)解決問題,而如果網(wǎng)站的訪問量確實(shí)非常非常大,而Nginx+FastCGI只能對(duì)處理瞬間或短時(shí)間內(nèi)的高并發(fā)有很好的效果,所以目前唯一的終極解決方案是:定時(shí)平滑重啟php-cgi。
具體配置如下:
1、寫一個(gè)非常簡(jiǎn)單的腳本:
#vi /home/www/scripts/php-fpm.sh
內(nèi)容如下:
#!/bin/bash
# This script run at */1
/usr/local/php/sbin/php-fpm reload
2、將腳本添加至計(jì)劃任務(wù):
#crontab -e
內(nèi)容如下:
*/1 * * * * /home/www/scripts/php-fpm.sh
注:為了省事起見,也可以不寫腳本,直接在crontab里寫入php-fpm的平滑重啟命令。
-----------------
Nginx 502錯(cuò)誤情況1:
網(wǎng)站的訪問量大,而php-cgi的進(jìn)程數(shù)偏少。
針對(duì)這種情況的502錯(cuò)誤,只需增加php-cgi的進(jìn)程數(shù)。具體就是修改/usr/local/php/etc/php-fpm.conf 文件,將其中的max_children值適當(dāng)增加。這個(gè)數(shù)據(jù)要依據(jù)你的VPS或獨(dú)立服務(wù)器的配置進(jìn)行設(shè)置。一般一個(gè)php-cgi進(jìn)程占20M內(nèi)存,你可以自己計(jì)算下,適量增多。
/usr/local/php/sbin/php-fpm restart 然后重啟一下.
Nginx 502錯(cuò)誤情況2:
CPU占用率、內(nèi)存占用率非常高,遭到CC攻擊.
解決方法請(qǐng)參考:LinuxVPS簡(jiǎn)單解決CC攻擊
Nginx 502錯(cuò)誤情況3:
CPU占用率不高,內(nèi)存溢出。
檢查一下網(wǎng)站程序有沒有問題?一般小偷站點(diǎn)常常會(huì)出現(xiàn)內(nèi)存溢出。
檢查一下/var/log/目錄下的日志,看看是不是有人爆破SSH和FTP端口?
SSH、FTP遭到窮舉也會(huì)占用大量?jī)?nèi)存。是的話改掉SSH端口和FTP端口即可。
=======================nginx 504 time out
Nginx 504 Gateway Time-out的含義是所請(qǐng)求的網(wǎng)關(guān)沒有請(qǐng)求到,
簡(jiǎn)單來說就是沒有請(qǐng)求到可以執(zhí)行的PHP-CGI。
Nginx 504 Gateway Time-out則是與nginx.conf的設(shè)置有關(guān)。
504 Gateway Time-out問題常見于使用nginx作為web server的服務(wù)器的網(wǎng)站
一般看來, 這種情況可能是由于nginx默認(rèn)的fastcgi進(jìn)程響應(yīng)的緩沖區(qū)太小造成的,
這將導(dǎo)致fastcgi進(jìn)程被掛起, 如果你的fastcgi服務(wù)對(duì)這個(gè)掛起處理的不好,
那么最后就極有可能導(dǎo)致504 Gateway Time-out
現(xiàn)在的網(wǎng)站, 尤其某些論壇有大量的回復(fù)和很多內(nèi)容的, 一個(gè)頁(yè)面甚至有幾百K
默認(rèn)的fastcgi進(jìn)程響應(yīng)的緩沖區(qū)是8K, 我們可以設(shè)置大點(diǎn)
在nginx.conf里, 加入:
fastcgi_buffers 8 128k
這表示設(shè)置fastcgi緩沖區(qū)為8×128k
當(dāng)然如果您在進(jìn)行某一項(xiàng)即時(shí)的操作, 可能需要nginx的超時(shí)參數(shù)調(diào)大點(diǎn), 例如設(shè)置成60秒:
send_timeout 60;
我只是調(diào)整了這兩個(gè)參數(shù), 結(jié)果就是沒有再顯示那個(gè)超時(shí), 可以說效果不錯(cuò), 但是也可能是由于其他的原因, 目前關(guān)于nginx的資料不是很多, 很多事情都需要長(zhǎng)期的經(jīng)驗(yàn)累計(jì)才有結(jié)果, 期待您的發(fā)現(xiàn)哈!
---------------解決辦法:
調(diào)整nginx.conf的相關(guān)設(shè)置:
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
|