尽管配置nginx的HTTP发出60秒后499错误。 (PHP和AWS)(NginX issue

2019-07-23 05:26发布

在上周结束时,我在我的媒体AWS实例如果请求花费超过60秒Nginx的地方总是返回一个HTTP 499响应的人注意的一个问题。 被请求的页面是一个PHP脚本

我花了好几天试图找到答案,并试图一切,我能找到在互联网包括在这里堆栈溢出几个项目上,没有什么工作。

我试图修改PHP设置,PHP-FPM设置和Nginx的设置。 你可以看到一个问题,我对Nginx的论坛上提出上周五( http://forum.nginx.org/read.php?9,237692 )虽然已没有收到任何答复,所以我希望我也许能找到一个这里回答之前,我不得不搬回到Apache我知道只是工作。

不是同样的问题在其他项中报告的HTTP 500错误。

我已经能够与Nginx的使用PHP 5.4.11新的微AWS实例来重现问题。

为了帮助任何人谁希望看到在行动的问题,我要带你完成设置后我跑了最新的高测试服务器。

你需要推出一个新的AWS微实例(所以它是免费的)使用AMI AMI-c1aaabb5

该引擎收录条目具有完整的建立运行,以反映我的测试环境。 你只需要在最后Nginx的配置中的改变example.com

http://pastebin.com/WQX4AqEU

一旦这样建立你只需要建立一个我与它是测试样品PHP文件

<?php
sleep(70);
die( 'Hello World' );
?>

保存到Web根目录,然后测试。 如果运行使用PHP或php-cgi的命令行脚本,它会奏效。 如果您是通过网页和尾部访问脚本访问日志/var/log/nginx/example.access.log,你会发现,您会收到HTTP 60秒后1.1 499的响应。

现在,你可以看到超时,我会去通过一些我对PHP和Nginx的所做的配置修改,试图解决这个问题。 对于PHP,我会创建多个配置文件,使他们可以很容易地禁用

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

sudo echo '
include=/usr/local/php/php-fpm.d/*.conf
' >> /usr/local/php/etc/php-fpm.conf

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

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分钟

# 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设置,再次使用单独的文件

# 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的/我们在前面(见引擎收录条目)创建/例如启用站点,并添加以下设置到服务器指令

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;

最后,我添加以下到位置服务器目录的〜.PHP $

fastcgi_read_timeout 360;
fastcgi_send_timeout 360;
fastcgi_connect_timeout 1200;

重试脚本之前,同时启动的Nginx和PHP-FPM,以确保新的设置都被接走了。 然后我尝试访问该页面,仍然收到Nginx的example.error.log内的HTTP / 1.1 499项。

所以,我要去哪里错了? 这只是工程上的Apache当我设置PHP的最大执行时间为2分钟。

我可以看到的是,PHP设置已经通过从网络访问的网页运行phpinfo()函数回升。 我只是不明白,其实我觉得太多有所增加,因为它应该只需要PHP的max_execution_time,default_socket_timeout只是服务器- >位置指令中改变以及NGINX的fastcgi_read_timeout。

更新1

已经进行了一些进一步的测试表明,该问题不在于客户正在死去我已经修改了测试文件是

<?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上; 并从HTTP 499改变响应HTTP 200虽然没有什么仍会返回到最终客户。

更新3

已经安装了Apache和PHP(5.3.10)到箱直(使用apt),然后增加执行时间的问题确实出现也发生在Apache为好。 其症状是一样的nginx现在,一个HTTP200响应,但实际的客户端连接超时前手。

我也开始注意到,在Nginx的日志,如果我测试使用Firefox,它使一个双请求(这样的PHP脚本执行两次时长超过60秒 )。 虽然这确实出现了客户端请求时脚本失败

Answer 1:

这个问题的原因是在AWS弹性负载均衡。 他们在默认情况下,不活动是什么导致问题的60秒后超时。

所以这是不Nginx的,PHP-FPM或PHP,但负载平衡器。

为了解决这个问题,只需进入ELB“说明”选项卡上,滚动至底部,并点击上面写着“空闲超时:60秒”的值旁边的“(编辑)”链接



Answer 2:

我以为我会离开我的两分钱。 首先,问题不在于PHP相关(仍可能与一个PHP,PHP总是令我感到奇怪:P)。 这是肯定的。 其主要是由于代理到自己的服务器,更具体的主机名/别名名称的问题,你的情况可能是负载平衡器请求nginx的和nginx的是回调到负载平衡器,它一直持续下去。

我已经遇到类似的问题,nginx的作为负载平衡器和Apache的Web服务器/代理服务器



Answer 3:

你需要的地方住的问题其中找到。 我不”知道确切的答案,只是让我们试着找到它。

在这里,我们有3个要素:nginx的,PHP-FPM,PHP。 正如你说,在Apache相同的PHP设置就可以了。 它是相同的,相同的设置? 你有没有尝试同OS /主机/等在Apache,而不是nginx的?

如果我们将看到,PHP不是怀疑,那么我们有两名犯罪嫌疑人:nginx的和PHP-FPM。

要排除nginx的:尽量设置相同的“系统”的红宝石。 见https://github.com/garex/puppet-module-nginx获得的想法来安装简单的红宝石设置。 用谷歌(可能是它会更好)。

我在这里的主要犯罪嫌疑人是php-fpm的。

尝试使用这些设置发挥:

  • PHP-fpm`s request_terminate_timeout
  • nginx`s fastcgi_ignore_client_abort


Answer 4:

其实我面临的一个服务器上的同样的问题,我想通了,nginx的配置更改后,我没有重新启动nginx的服务器,那么nginx的网址的每一击我得到一个499 HTTP响应。 nginx的重新启动后,它开始与HTTP 200响应正常工作。



Answer 5:

不知道是否有人面对这一点,但对我来说这事我把后/在结束我的实例url.This了499错误,只有在我删除了/ ,它给了我200都去好。



文章来源: NginX issues HTTP 499 error after 60 seconds despite config. (PHP and AWS)