首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NginX不顾配置在60秒后发出HTTP499错误。(PHP和AWS)

NginX不顾配置在60秒后发出HTTP499错误。(PHP和AWS)
EN

Stack Overflow用户
提问于 2013-03-25 11:09:17
回答 5查看 104.7K关注 0票数 58

上周末,我注意到我的一个中间AWS实例出现了问题,如果请求超过60秒,Nginx总是返回一个HTTP 499响应。请求的页面是一个PHP脚本

我花了几天的时间来寻找答案,并且尝试了我在互联网上能找到的所有东西,包括在Stack溢出上的几个条目,没有任何效果。

我尝试过修改PHP设置、PHP设置和Nginx设置。你可以看到我周五在NginX论坛(http://forum.nginx.org/read.php?9,237692)上提出的一个问题,尽管没有得到任何回应,所以我希望在我被迫搬回Apache之前,我能在这里找到一个答案。

不是--与在其他条目中报告的HTTP500错误问题不同。

我已经能够使用PHP5.4.11使用一个新的NginX微AWS实例来复制这个问题。

为了帮助那些希望看到实际问题的人,我将带你们通过我为最新的微测试服务器运行的设置。

您需要使用AMI ami-c1aaabb 5启动一个新的AWS微实例(所以它是免费的)。

这个PasteBin条目有完整的设置来运行,以反映我的测试环境。您只需要在最后更改example.com配置中的NginX

http://pastebin.com/WQX4AqEU

设置好之后,您只需创建示例PHP文件,我正在测试的文件是

代码语言:javascript
复制
<?php
sleep(70);
die( 'Hello World' );
?>

把它保存到webroot,然后测试。如果您使用php或php从命令行运行脚本,它将工作。如果您通过网页访问脚本并跟踪访问日志/var/ log /nginx/example.access.log,您将注意到60秒后收到HTTP1.1 499响应。

现在您可以看到超时了,我将介绍一下我对PHP和NginX所做的一些配置更改,以试图解决这个问题。对于PHP,我将创建几个配置文件,以便很容易地禁用它们

更新PHP以包括外部配置文件

代码语言:javascript
复制
sudo echo '
include=/usr/local/php/php-fpm.d/*.conf
' >> /usr/local/php/etc/php-fpm.conf

创建一个新的PHP配置来覆盖请求超时

代码语言:javascript
复制
sudo echo '[www]
request_terminate_timeout = 120s
request_slowlog_timeout = 60s
slowlog = /var/log/php-fpm-slow.log ' >
/usr/local/php/php-fpm.d/timeouts.conf

更改一些全局设置,以确保紧急重启间隔为2分钟

代码语言:javascript
复制
# Create a global tweaks
sudo echo '[global]
error_log = /var/log/php-fpm.log
emergency_restart_threshold = 10
emergency_restart_interval = 2m
process_control_timeout = 10s
' > /usr/local/php/php-fpm.d/global-tweaks.conf

接下来,我们将再次使用单独的文件更改一些PHP.INI设置。

代码语言:javascript
复制
# Log PHP Errors
sudo echo '[PHP]
log_errors = on
error_log = /var/log/php.log
' > /usr/local/php/conf.d/errors.ini

sudo echo '[PHP]
post_max_size=32M
upload_max_filesize=32M
max_execution_time = 360
default_socket_timeout = 360
mysql.connect_timeout = 360
max_input_time = 360
' > /usr/local/php/conf.d/filesize.ini

如您所见,这将使套接字超时时间增加到3分钟,并将有助于记录错误。

最后,我将编辑一些NginX设置,以增加超时的那一面

首先,我编辑文件/etc/nginx/nginx.conf并将其添加到http指令fastcgi_read_timeout 300中;

接下来,我编辑文件/etc/nginx/sites启用了我们前面创建的/示例(参见pastebin条目),并将以下设置添加到服务器指令中

代码语言:javascript
复制
client_max_body_size    200;
client_header_timeout   360;
client_body_timeout     360;
fastcgi_read_timeout    360;
keepalive_timeout       360;
proxy_ignore_client_abort on;
send_timeout            360;
lingering_timeout       360;

最后,我将以下内容添加到服务器dir的location ~ .php$部分

代码语言:javascript
复制
fastcgi_read_timeout 360;
fastcgi_send_timeout 360;
fastcgi_connect_timeout 1200;

在重新尝试脚本之前,请同时启动nginx和php,以确保新设置已经被选中。然后,我尝试访问该页面,并仍然在NginX example.error.log中接收HTTP1.1 499条目。

我哪里出问题了?当我将PHP的最大执行时间设置为2分钟时,这只适用于apache。

我可以看到,通过从web访问的页面运行phpinfo()来获取PHP设置。我只是不明白,实际上我认为已经增加了太多,因为它应该只需要PHP的max_execution_time、default_socket_timeout以及NginX的fastcgi_read_timeout在服务器->location指令中。

更新1

执行了一些进一步的测试,以表明问题并不是客户端正在死亡,我已经将测试文件修改为

代码语言:javascript
复制
<?php
file_put_contents('/www/log.log', 'My first data');
sleep(70);
file_put_contents('/www/log.log','The sleep has passed');
die('Hello World after sleep');
?>

如果我从网页上运行脚本,那么我可以看到文件的内容被设置为第一个字符串。60秒后,错误出现在NginX日志中。10秒后,文件的内容更改为第二个字符串,证明PHP正在完成该过程。

更新2

fastcgi_ignore_client_abort设置为on;确实将响应从HTTP499更改为HTTP200,但仍然没有返回到最终客户端。

更新3

将Apache和PHP (5.3.10)直接安装到盒子上(使用apt),然后增加执行时间,这个问题似乎也会发生在Apache上。这些症状与NginX现在是一样的,这是一个HTTP200响应,但是实际的客户端连接在手头上已经超时。

我还开始注意到,在NginX日志中,如果我使用火狐进行测试,它会发出双重请求(如这个PHP script executes twice when longer than 60 seconds)。虽然这看起来确实是客户端请求脚本失败

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-25 17:37:28

造成这一问题的原因是AWS上的弹性负载平衡器。默认情况下,它们在60秒的不活动之后超时,这就是导致问题的原因。

所以它不是NginX,PHP或PHP,而是负载均衡器。

要解决这个问题,只需进入ELB "Description“选项卡,滚动到底部,并单击”(编辑)“链接旁边的”空闲超时:60秒“。

票数 83
EN

Stack Overflow用户

发布于 2016-03-09 16:13:34

我想我会留下两分钱。首先,问题与php无关(仍然可以是php相关的,php总是让我惊讶:P )。这是肯定的。它主要是由服务器自身代理引起的,更具体地说,主机名/别名问题,在您的例子中,可能是负载均衡器请求nginx,nginx正在回调负载均衡器,并且它继续这样做。

我曾经历过类似的问题,其中nginx作为负载均衡器,apache作为webserver/代理。

票数 1
EN

Stack Overflow用户

发布于 2016-10-18 10:18:12

实际上,我在一台服务器上遇到了同样的问题,我发现在nginx配置更改之后,我没有重新启动nginx服务器,所以每次点击nginx url,我都会得到一个499 http响应。在nginx重新启动之后,它开始与http 200响应一起正常工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15613452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档