当我提出这个问题时,我的 IT 人员只是耸了耸肩,所以我转向 SE 寻求帮助。
我认为这张图最能说明问题。

很简单,随着时间的推移,响应时间变得越来越糟,直到午夜左右发生一些事情,它几乎恢复正常。我们在 IIS 上,这个页面碰巧仍然在经典 ASP 中,但这发生在所有页面上,甚至是纯 HTML 页面,我认为这排除了 SQL 连接问题。
我想我的问题是,我从哪里开始寻找?我浏览了常规日志,没有看到任何跳出来的东西。但显然有些事情正在发生,我不知道从哪里开始。
我们在 Windows Server 2012 上有这个 Apache:
Server version: Apache/2.4.9 (Win32)
Apache Lounge VC10 Server built: Mar 17 2014 10:48:43
大多数情况下,它运行良好,但有时(随机,每周 cca 3-4 次),它停止在端口 443 上提供 HTTPS,但继续在端口 80 上提供 HTTP。当它停止提供 HTTPS 时,解决问题的唯一方法是重新启动 Apache。
这似乎与这里的问题完全相同:Apache 停止响应 http 请求——https 继续工作,除了在我们的例子中是 HTTPS 停止工作,而 HTTP 是一直工作的那个。
我们启用了 trace6 级别的详细信息,以获取有关正在发生的事情的一些好的信息。但是,日志是空的:
...
[Sat Mar 21 07:51:50.577373 2015] [ssl:debug] [pid 3356:tid 2540] ssl_engine_io.c(999): [client ...:16529] AH02001: Connection closed to child 137 with standard shutdown (server ...:443)
[Sat Mar 21 07:54:21.936742 2015] [ssl:info] [pid 4760:tid 432] AH01914: …Run Code Online (Sandbox Code Playgroud) 我试图解决奇怪的问题 - wget 获取文件,将其保存到磁盘并挂起。以下是详细信息:
wget --server-response --ca-directory=/etc/ssl/certs --no-dns-cache -T 1 --read-timeout=1 --header="Connection: close" https://api.vk.com/method/users.get?uids=1&fields=first_name,last_name,photo,photo_big
Run Code Online (Sandbox Code Playgroud)
详细日志:
Setting --server-response (serverresponse) to 1
Setting --ca-directory (cadirectory) to /etc/ssl/certs
Setting --dns-cache (dnscache) to 0
Setting --timeout (timeout) to 1
Setting --read-timeout (readtimeout) to 1
Setting --header (header) to Connection: close
DEBUG output created by Wget 1.11.4 on linux-gnu.
--2015-05-06 10:44:04-- https://api.vk.com/method/users.get?uids=1
Resolving api.vk.com... 87.240.131.117, 87.240.131.118, 87.240.131.119, ...
Connecting to api.vk.com|87.240.131.117|:443... connected.
Created socket 3.
Releasing 0x0000000001b6d5e0 (new refcount 0).
Deleting unused 0x0000000001b6d5e0.
Initiating SSL …Run Code Online (Sandbox Code Playgroud) 我在 CloudFlare 后面创建了一个网站,有时我会收到一个提前终止的 (nginx 499) 请求,这在代码库中真的很难解决。
这发生在大约 4000 个请求中的 1 个中。
我想问一下这是正常的还是不正常的?CloudFlare 支持告诉我,当 CF 和服务器之间的某些事情断开连接时,会发生 499。我不在 AWS 上,不在负载均衡器上,而是在具有直接 IP 连接(没有虚拟路由器等)的简单 VPS 上
我有一个文件夹中的备忘录集合 一个/memos/items/备忘录用于包含 HTML 标题部分的 SSI 包含语句,直到并包括开头<body>,然后是备忘录内容的 HTML 代码,最后是进一步的 SSI 包括包含关闭 HTML 文档的代码的页脚的语句,如下所示:
<!--# include file="/memos/header.html" -->
Dies ist ein <i>Testeintrag</i>.
<blockquote>
Man soll den Tag
nicht vor dem Abend loben
</blockquote>
<!--# include file="/memos/footer.html" -->
Run Code Online (Sandbox Code Playgroud)
这很有效,但我不喜欢单项文件中的 SSI 语句。我更愿意指示 nginx 自动提供页眉和页脚,配置类似于
location ~ /memos/[\w-]+$ {
sendfile /memos/before.html;
sendfile $request_filename;
sendfile /memos/after.html;
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?是否有一个 nginx 模块提供了一个sendfile像描述的那样工作的指令?
优点是:
grep编辑文件夹。编辑 (2016/07/01)
同时,我通过简单地改变视角,找到了具有上述优点的 SSI 解决方案(即仅提供项目文件内容,没有 ssi 标签):而不是在每个单独的项目文件中包含页眉和页脚,我包括单个主模板中的项目文件。
受到nginx 站点上的提议的启发;我配置
location /memos/ {
ssi …Run Code Online (Sandbox Code Playgroud) 对于我的新服务器上的所有站点,似乎一旦nginx提供了一定数量的流量,它就会开始提供“错误 502 - 错误网关! ”。
让我们来看看一些日志和配置...
操作系统:Ubuntu 16.04(服务器)
硬件:6核,12GB内存
面板:ISPConfig
nginx 版本:1.10.3
来自/var/www/example/log/error.log:
11: Resource temporarily unavailable) while connecting to upstream, client: 216.170.123.179, server: example.com, request: "GET /KHFxygk9 HTTP/1.1", upstream: "fastcgi://unix:/var/lib/php7.0-fpm/web3.sock:", host: "example.com", referrer: "http://example.com/"
2017/08/10 06:01:06 [error] 15408#15408: *31372 connect() to unix:/var/lib/php7.0-fpm/web3.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 192.3.114.12, server: example.com, request: "GET /jiPNQjwp HTTP/1.1", upstream: "fastcgi://unix:/var/lib/php7.0-fpm/web3.sock:", host: "example.com", referrer: "http://example.com/"
Run Code Online (Sandbox Code Playgroud)
这是我的配置文件:
[www]
user = …Run Code Online (Sandbox Code Playgroud) 我希望 app.dotaquiz.org 可以使用我的网络服务 (185.156.179.139)。所以我已经注册了域名。我还创建了一个 A 记录 (app-A-185.156.179.139)。
对http://185.156.179.139/users/1 的GET 请求给出 OK-200。
对http://app.dotaquiz.org/users/1 的GET 请求给出 404。
我缺少什么?
HTTP 1.0 存在与会话劫持相关的安全弱点。有没有办法通过使用mod_rewrite模块来禁用它?
是否有适用于通过 SNI 或 HTTP Host 标头发送错误主机名(或根本没有)的客户端的 HTTP 状态代码?
一个较旧的问题首先解决了此类请求如何以及为何发生,以及如何在 Apache 中从技术上处理它们。然而,它没有解决响应状态代码的选择问题。
过去,我实现了一个 HTTP 代理,它会发送状态代码 502 和一个 html 页面,解释为什么会产生错误消息。我使用 502 的理由是期望我看到它主要是由于配置错误,这意味着代理找不到合适的后端。实际上,仅仅看到完全虚假的主机名的频率要高得多。
是否有另一个状态代码更合适,更清楚地向客户端发出信号,表明此 IP 地址上的服务器无法识别通过 SNI 和/或主机标头发送的值?
我在负载平衡器后面有一组 Java Vertx 服务器,用于处理峰值流量。一分钟它可能处理 150k r/m,下一分钟它可能处理 2mm r/m,然后又回到 150k r/m。我发现在这些高峰期间,整个队列可能会在几分钟内无响应并断开连接,而任何一台机器上的 cpu 和 mem 压力几乎没有达到 50% 的利用率。
为了测试究竟是什么导致了中断,我设置了一个测试服务器,它与我的生产队列中的一个服务器的规格相匹配,以查看在它发出之前我可以投入多少。我的测试涉及使用其他 10 台机器,每台机器打开 500 个到服务器的 https 连接,并发送 1mm 请求,每个请求有效负载约 2kb。这总共打开了 5k 个并发连接,发送了总共 10mm 的请求,用于大约 20gb 的数据传输。
一旦连接打开,我每分钟可以发出大约 70 万个请求。我只是通过向健康端点发出请求并记录响应时间来监控服务器的可用性。响应时间快,几十毫秒。我对这些结果很满意。
但是在大量数据开始进入之前,这 10 台机器必须首先建立 5k 连接。在此期间,服务器无响应,甚至在我尝试检查运行状况端点时可能超时。我相信这就是导致我的生产车队中断的原因 - 新连接的突然增加。一旦建立连接,服务器就可以轻松处理传入的所有数据。
我已经更新了 nofile ulimit、net.core.netdev_max_backlog、net.ipv4.tcp_max_syn_backlog 和 net.core.somaxconn,但在几秒钟内收到一连串 5k 新连接请求时它仍然挂起。
我可以做些什么来更快地建立新的连接?
编辑:
实际的服务器在 docker 容器中运行。我的网络设置没有应用于容器。接下来要尝试一下,看看它是否有所作为。
编辑编辑:
这一切都在 SSL 中。通过普通 HTTP 快速建立如此多的连接几乎是即时的。所以我必须弄清楚如何更快地建立 TLS 连接。
编辑编辑编辑:
我发现本机 java 安全 ssl 处理程序是瓶颈。切换到netty-tcnative(又名本机 OpenSSL)几乎解决了我的 HTTPS 问题。
http ×10
nginx ×3
https ×2
linux ×2
tcp ×2
apache-2.4 ×1
cloudflare ×1
http-headers ×1
iis ×1
java ×1
networking ×1
packetloss ×1
php-fpm ×1
php7 ×1
sni ×1
wget ×1