Nginx 499的问题
PHP 异步 HTTP 与 NGINX 499
PHP 异步 HTTP
在 PHP 代码中提交异步 HTTP 请求比较常用的方式是通过 fsockopen/fwrite/fclose 来实现,请参考如下代码。
function post($host, $path, $port, $data) {
$post = http_build_query($data);
$len = strlen($post);
$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)\n";
return;
}
$out = "POST $path HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Content-type: application/x-www-form-urlencoded\r\n";
$out .= "Connection: Close\r\n";
$out .= "Content-Length: $len\r\n";
$out .= "\r\n";
$out .= $post . "\r\n";
// echo($out);
fwrite($fp, $out);
// 注释掉如下代码实现不等待 HTTP 响应,从而实现“异步”
// $receive = '';
// while (!feof($fp)) {
// $receive .= fgets($fp, 128);
// }
// echo "<br />" . $receive;
fclose($fp);
}
这段代码可以如期完成异步 HTTP 效果,但是如果提交的服务端有 NGINX 做 CGI 反代的话,可能会导致上游后端 PHP 接收不到该请求。
NGINX 499
查看 NGINX access log,发现这样的请求会以 499(Client Closed Request)记录。确定问题是因为:客户端主动端口请求连接时,NGINX 不会将该请求代理给上游服务(FastCGI PHP 进程),这个时候 access log 中会以 499 记录这个请求。
要解决这个问题需要将 NGINX FastCGI 忽略客户端中断配置打开:
fastcgi_ignore_client_abort on;
这样无论客户端是否断开,都会将这个请求代理给上游,并且会记录上游服务处理后的返回状态。
另外,还有一个类似配置 proxy_ignore_client_abort on;,这个配置是针对其他类型的反代,PHP 的场景并不适用。
文章来源:https://hacpai.com/article/1444367397136?m=0
备注:fastcgi_ignore_client_abort on;虽然会忽略客户端中断,只是在nginx记录中不记录499记录,并不能从根本上解决499问题。499有可能是客户端关闭连接,也有可能是请求时间超过upstream_response_time的值,但是即便是upstream_response_time没有值也会产生499,upstream_response_time 记录的是从 Nginx 把请求转发到后端服务器开始,到后端服务器响应到 Nginx 为止的时间。
upstream_response_time 没有值有两种情况:
1. 请求没有被转发到 upstream server
2. Nginx 在等待 upstream response 的时候,客户端把连接关掉了,Nginx 也因此把跟 upstream 之间的连接关掉,所以不可能有 upstream response 被返回到 Nginx,自然也不会有 upstream_resposne_time. 在这种情况下,Nginx 会向客户端返回 499 。结合数据库中有记录来看,客户端发起一个 http 请求, 请求到 Nginx, Nginx 转发给后端 PHP,PHP 处理请求往数据库插记录,在这时,客户端发起 abort, Nginx 断开到 PHP 的连接,但是因为 PHP 已经发起了数据库的操作,这个操作不会被中断,所以记录被成功插入到数据库, Nginx 也向客户端返回了 499 端口。
就大多数场景而言,如果只有少量的nginx499是无关紧要的,很大一部分只是客户端主动断开了请求而已。
Nginx 499的问题的更多相关文章
- Nginx 499错误的原因及解决方法
今天进行系统维护,发现了大量的499错误, 499错误 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */n ...
- nginx 499状态码
Web服务器在用着nginx,在日志中偶尔会看到有499这个错误. rfc2616中,400-500间的错误码仅定义到了417,所以499应该是nginx自己定义的.后来想到读读nginx代码,疑问立 ...
- 通过nginx 499 来判断服务端超时数量
这个其实不能算一篇文章,因为内容太少了,就当记点笔记吧. (1)什么是 nginx 499 499 其实是 nginx 下特有的 http 状态码,代表客户端主动断开了连接,导致服务器无法返回 htt ...
- nginx 499 状态码优化
在grafana界面中发现不少499的状态码,在网上了解到出现499的原因大体都是说服务端处理时间过长,客户端主动关闭了连接. 既然原因可能是服务端处理时间太长了,看一下upstream_resp ...
- nginx 499 错误码
今天查看nginx的access log 文件,发现类似这种请求: [22/Apr/2014:14:01:12 +0800] "GET / HTTP/1.1" 499 0 &quo ...
- nginx 499错误
原因: 服务响应时间太长,客户端自动断开链接. 解决: 1. 找到响应世间长的接口,看依赖的数据源(数据库,第三方接口等)响应时间是否超时,还是自己程序有逻辑问题. 可以通过加入日志打印时间消耗来确定 ...
- Nginx_HTTP 499 状态码 nginx下 499错误
日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...
- HTTP 499 状态码 nginx下 499错误[转]
日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...
- HTTP 499 状态码 nginx下 499错误
日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...
随机推荐
- System.Data.EntityException: The underlying provider failed on Open.
场景:IIS默认站点建立程序,使用Windows集成身份验证方式,连接SQLServer数据库也是采用集成身份验证.我报“System.Data.EntityException: The underl ...
- pat L2_004
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索 ...
- Django2.0 应用 Xadmin 报错解决(转载)
原文地址:https://blog.csdn.net/GoAheadNeverTurnBack/article/details/8143362 1.TypeError at /xadmin/ l ...
- C++通用框架和库
C++通用框架和库 来源 https://www.cnblogs.com/skyus/articles/8524408.html 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应 ...
- JS基础_函数的返回值
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 单变量图形的pandas方法
数据加载与展示: 1. 类别数据的Bar图 1.1 每一类对应有多少个 1.2 每类数量占整体的比值 1.3 对X轴进行排序
- C# 填充无效,无法被移除
1.本文采用微软的 RijndaelManaged 命名空间: System.Security.Cryptography Assemblies: mscorlib.dll, netstandard.d ...
- 【Day3】4.Xpath语法与案例
课程目标 1.谷歌浏览器配置Xpath 2.Xpath常用语法 3.Xpath常用案例 1.谷歌浏览器配置Xpath Xpath下载:http://chromecj.com/web-developme ...
- Delphi 类成员的可见性
- Mac息屏后如何保持网络连接,方便远程访问
1 wifi换成有线,因为息屏后WiFi就会自动断开 2 设置修改,点亮唤醒网络不勾选,进入休眠不勾选 3 目前测试用向日葵,远程这台电脑,再屏幕保护程序运行的情况下,可以远程控制.