我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

nginx本质上是个代理,那么在处理一些长期运行的脚本的时候,会出现一种奇怪的404现象。究其实质,并不是因为脚本文件针对没有找到,而是因为脚本长时间运行导致没有输出,而造成的一种文件不存在的假象。也可以说,nginx判断文件是否存在的标准,并不是file_exists(),而是是否有及时的输出。

苏南大叔:nginx配置,如何修改超时限制以避免奇怪的404超时现象 - nginx超时设置
nginx配置,如何修改超时限制以避免奇怪的404超时现象(图1-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文测试环境:win10php@8.2.11ntsnginx@1.15.11

前文回顾

本文讨论的现象,是一种基于nginx的奇怪404现象:

解决方案的基础就是:nginx代理php的程序。参考:

修改配置

选项默认值单位说明
fastcgi_connect_timeout60连接FastCGI超时时间
fastcgi_read_timeout60读取FastCGI服务器的响应超时时间
fastcgi_send_timeout60发送FastCGI服务器的响应超时时间

虽然说,nginx并不能阻止超时现象的存在,但是可以尽最大努力延缓这种现象的发生。所以,如果是一个长期运行,且存在输出的php脚本(set_time_limit(0)),苏南大叔认为:请不要在外面套nginx,这会使得问题复杂化。

最终配置

nginx代理php,并设置fastcgi的超时,配置如下:

location ~ \.php(.*)$ {
    fastcgi_pass   127.0.0.1:9002;
    fastcgi_index  index.php;
    fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO  $fastcgi_path_info;
    fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
    include        fastcgi_params;
    fastcgi_connect_timeout 600;
    fastcgi_read_timeout 600;
    fastcgi_send_timeout 600;
}

有关include fastcgi_params配置,可能会引起php文件上传问题的文章:

参考文章

结语

长时间运行的php脚本(set_time_limit(0)),并不建议在放在nginx下执行,并且nginx并不能完全阻止超时的发生。这就是本文的主要结论。即使按着本文的设置进行配置后,缓解的也是奇怪的404超时的问题,并不能解决脚本输出无法显式的问题。请知晓。

更多nginx设置经验文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   nginx