php 499,尽管进行了配置,但NginX在60秒后仍发出HTTP 499错误。 (PHP和AWS)

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

我花了几天的时间试图找到答案,并尝试了我在互联网上可以找到的所有内容,包括Stack Overflow上的一些条目,但没有任何效果。

我试过修改PHP设置,PHP-FPM设置和Nginx设置。 您可以在星期五在NginX论坛上看到我提出的一个问题([http://forum.nginx.org/read.php?9,237692)],尽管没有收到任何答复,所以我希望我能够 在我被迫回到我知道可以正常工作的Apache之前,请在这里找到答案。

此问题与其他条目中报告的HTTP 500错误不同。

我已经能够使用PHP 5.4.11使用NginX的微型微型AWS实例来复制问题。

为了帮助希望在实际操作中发现问题的任何人,我将带您完成我为最新的微型测试服务器运行的设置。

您需要使用AMI ami-c1aaabb5启动一个新的AWS Micro实例(因此它是免费的)

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

[http://pastebin.com/WQX4AqEU]

设置完成后,您只需要创建示例PHP文件即可,我正在测试该示例文件。

sleep(70);

die( 'Hello World' );

?>

将其保存到webroot中,然后进行测试。 如果您使用php或php-cgi从命令行运行脚本,它将可以正常工作。 如果您通过网页访问脚本并添加访问日志/var/log/nginx/example.access.log,您将注意到60秒后收到HTTP 1.1 499响应。

现在您可以看到超时,接下来,我将对PHP和NginX进行一些配置更改,以解决此问题。 对于PHP,我将创建几个配置文件,以便可以轻松禁用它们

更新PHP FPM Config以包含外部配置文件

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 / sites-enabled / example(请参阅pastebin条目),并将以下设置添加到server指令中

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条目。

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

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

更新1

执行了进一步的测试以表明问题不在于客户端快死了,我将测试文件修改为

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秒以上时执行两次)。 虽然这似乎是客户端请求脚本失败

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值