在上周结束时,我在我的媒体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秒 )。 虽然这确实出现了客户端请求时脚本失败