完美解决Nginx 504 Gateway time-out
最近用【zuì jìn yòng】dedecms建的一【jiàn de yī】🈵个网站【gè wǎng zhàn】新增了【xīn zēng le】大批内【dà pī nèi】容🦓,有三个栏目的💰内容🦓量都超过🚆了两千篇【piān】🐸,超过两🗯千三百【qiān sān bǎi】篇【piān】🐸的两个栏目在生成栏目列表的时候就出现了504 Gateway time-out 服务器🐰用的是【yòng de shì】nginx,我不是【wǒ bú shì】🎯很懂,服务器🐰维护人【wéi hù rén】员在网上随便找了一篇【piān】🐸文章,修改了nginx的缓存【de huǎn cún】🚏设置,不管用🐼,他就不管了,可是我不能不🥪管啊【guǎn ā】🗄,不能生【bú néng shēng】💳成列表【chéng liè biǎo】页面🛩,那后面的内容🦓不是都不能用【bú néng yòng】了么?
把数据库下载【kù xià zǎi】👍到本地,在本地配置了nginx,试了很🌪多遍【duō biàn】,都不行【dōu bú háng】,又改到🍶Apache下面,更夸张【gèng kuā zhāng】,生成了83个页面🙍就不能【jiù bú néng】继续了,看来还🎐是【shì】nginx更厉害【gèng lì hài】一点🍂,虽然出【suī rán chū】现🎏504 Gateway time-out,但好歹能够全👜部生成。
只好又继续在网上找📔更多的解决办法👑,尝试了【cháng shì le】N多次以【duō cì yǐ】🥊后🐺,终于让我找到了一个有用的🥅方法【fāng fǎ】👑,想想以📃后🐺可能还【kě néng hái】有碰到这样的问题🥦,就把那篇文章复制过【fù zhì guò】来放在【lái fàng zài】😋这里,供以后🐺参考吧【cān kǎo ba】,对有同【duì yǒu tóng】⛴样问题【yàng wèn tí】的朋友也是一【yě shì yī】🔘个帮助。
下面部分是引🍿用部分【yòng bù fèn】,我自己😐不懂技【bú dǒng jì】术的,在我的dedecms5.6里面有用【yòng】,别人的【bié rén de】自己尝🎖试吧🕎。
Nginx 502 Bad Gateway的🔈含义是请求⭕的🔈PHP-CGI已经执【yǐ jīng zhí】行🤕,但是由于某种🥣原因(一般是读取资源的【yuán de】🔈问题【wèn tí】)没有执【méi yǒu zhí】行🤕完毕而导致【dǎo zhì】😐PHP-CGI进程终【jìn chéng zhōng】止😑。
Nginx 504 Gateway Time-out的【de】🏺含义是所请求【suǒ qǐng qiú】的【de】🏺网关没有请求到😃,简单来说就是【shuō jiù shì】没有请求到😃可以执【kě yǐ zhí】行【háng】🔙的【de】🏺PHP-CGI。
解决这两个问【liǎng gè wèn】⛩题其实是需要【shì xū yào】综合思考的💰,一般来【yī bān lái】说Nginx 502 Bad Gateway和php-fpm.conf的设置【de shè zhì】🧒有关【yǒu guān】❇,而Nginx 504 Gateway Time-out则是与nginx.conf的设置【de shè zhì】🧒有关【yǒu guān】❇。
而正确的设置【de shè zhì】需要考虑服务🚏器自身【qì zì shēn】的性能🧔和访客的数量【de shù liàng】等多重👨因素。
以我目前的服【qián de fú】🤩务器为【wù qì wéi】例子CPU是奔四💺1.5G的【de】,内存1GB,CENTOS的【de】系统🤹,访客大概是【gài shì】50人左右✡同时在线。
但是在线的人【xiàn de rén】大都需要请求【yào qǐng qiú】PHP-CGI进行大量的信🐂息处理,因此我【yīn cǐ wǒ】将♋nginx.conf设置为🍨:
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;#8 128
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
这里最主要的设置是前三条,即
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
这里规【zhè lǐ guī】定了🍜PHP-CGI的连接🌵、发送和🔕读取的【dú qǔ de】🙆时间,300秒足够用了🎰,因此我的服务【de fú wù】器很少【qì hěn shǎo】🧘出现【chū xiàn】🌰504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导【zhí jiē dǎo】致【zhì】502 Bad Gateway和🔕504 Gateway Time-out。
下面我【xià miàn wǒ】们来仔【men lái zǎi】🐆细分析💳一下php-fpm.conf几个重【jǐ gè chóng】🌋要的参数:
php-fpm.conf有两个🃏至关重要的参【yào de cān】🏅数💤,一个是【yī gè shì】”max_children”,另一个是【yī gè shì】”request_terminate_timeout”
我的【de】📅两个设置的【de】值一【yī】🔽个是🥒”40″,一【yī】个是🥒”900″,但是这个值不【gè zhí bú】是通用👦的【de】📅,而是需要自己【yào zì jǐ】计算的【de】📅。
计算的方式如下:
如果你的服务【de fú wù】🎮器性能足够好,且宽带资源足💷够充足,PHP脚本没有系循环或🌲BUG的话你可以直🦋接将🤡”request_terminate_timeout”设置成0s。0s的含义🗃是让【shì ràng】🧞PHP-CGI一直执🐜行下去而没有时间限⚾制【zhì】。而如果你做不到这一🥌点【diǎn】,也就是说你的👉PHP-CGI可能出【kě néng chū】现某个BUG,或者你【huò zhě nǐ】的宽带不够充足或者【zú huò zhě】其他的原因导【yuán yīn dǎo】致你的🍮PHP-CGI能够假死那么🎧就建议【jiù jiàn yì】你给👚”request_terminate_timeout”赋一个【fù yī gè】🥞值【zhí】,这个值【zhí】👴可以根【kě yǐ gēn】据你服【jù nǐ fú】务器的😐性能进【xìng néng jìn】🚘行设定。一般来说性能越好你可以设置越高🦏,20分钟-30分钟都【fèn zhōng dōu】可以。由于我的服务【de fú wù】🎮器PHP脚本需【jiǎo běn xū】🔑要长时间运行【jiān yùn háng】,有的可【yǒu de kě】能会超👘过10分钟因【fèn zhōng yīn】此我设🌓置了900秒【miǎo】,这样不🦒会导致【huì dǎo zhì】PHP-CGI死掉而【sǐ diào ér】出现502 Bad gateway这个错误【wù】。
而”max_children”这个【gè】值🍜又是怎么计算🐡出来的呢?这个【gè】值🍜原则上是越大🆘越好📚,php-cgi的进程🔇多了就【duō le jiù】会🎇处理的【chù lǐ de】很快【hěn kuài】,排队的【pái duì de】请求就【qǐng qiú jiù】会🎇很少。设置”max_children”也需要【yě xū yào】根据服务器的👌性能进行设定,一般来【yī bān lái】说一台服务器正常情【zhèng cháng qíng】况下每一个【gè】🤔php-cgi所耗费【suǒ hào fèi】的内存在20M左右,因此我的”max_children”我设置成【chéng】40个【gè】,20M*40=800M也就是【yě jiù shì】说在峰值的时候所有【hòu suǒ yǒu】PHP-CGI所耗内【suǒ hào nèi】存在800M以内🏄,低于我💛的有效【de yǒu xiào】内存1Gb。而如果【ér rú guǒ】我的”max_children”设置的【shè zhì de】📥较小🛅,比如5-10个【gè】,那么php-cgi就会【jiù huì】🎇“很累【hěn lèi】💻”,处理速度也很【dù yě hěn】🕶慢【màn】🦔,等待的时间也🈂较长。如果长时间没有得到【yǒu dé dào】🔃处理的【chù lǐ de】请求就【qǐng qiú jiù】会🎇出现♉504 Gateway Time-out这个【gè】错误【wù】😢,而正在🦃处理的【chù lǐ de】很累【hěn lèi】💻的那几个【gè】php-cgi如果遇【rú guǒ yù】到了问【dào le wèn】🔕题就会【jiù huì】🛂出现♉502 Bad gateway这个【gè】错误【wù】😢。
关键词:Nginx
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0