我试图弄清楚如何在通过curl.
这是我的目标服务器:
- Ubuntu 18.04.2 LTS
- 4.15.0-47-generic
- HA-Proxy version 1.8.19-1ppa1~bionic 2019/02/12
Run Code Online (Sandbox Code Playgroud)
这是我发布的客户端 1 curl(香草安装):
- Ubuntu 16.04.3 LTS
- 4.4.0-62-generic
- curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
Run Code Online (Sandbox Code Playgroud)
这是我发布的客户端 2 curl(香草安装):
- Ubuntu 18.04 LTS
- 4.15.0-20-generic
- curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Run Code Online (Sandbox Code Playgroud)
要关闭 keepalive,我尝试使用-H "Connection: close",--no-keepalive并且--keepalive-time 1只有第一个选项似乎有效,但只能从客户端 1 使用。
在客户端 1 (Ubuntu 16) 上,连接没有保持打开状态,但在客户端 2 (Ubuntu 18) 上,连接保持打开状态,直到超时。我通过查看目标服务器watch -n …
使用 nginx 作为带有 PHP 后端的 Apache 的 HTTP 反向代理(我需要为网站管理员提供 .htaccess 灵活性)。看到 Apache 日志中使用的 http/1.0 让我了解如何启用保持活动连接。
在我的搜索中,我发现了 Nginx 的这篇博客文章https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives
默认情况下,NGINX 为每个新的传入请求打开一个到上游(后端)服务器的新连接。这是安全但效率低下的,[...]
如果默认行为是安全的,那么启用上游 keepalive 的风险是什么?
精简版
为什么 chrome 会发出 keep-alive,而 IE 和 FF 不会?
长版
最初,我认为这是服务器端问题。
我有一个 apache 服务器,它是 tomcat webapp 的前端代理。此应用程序上的其中一个页面需要 15-20 分钟才能返回结果。我观察到在通过 IE 或 FF 访问时,使用此页面会超时。它转到标准的“无法访问”页面,就像您在尝试访问网络时查看网络电缆是否断开一样。然而,在 Chrome 上,它工作得很好。
这让我很好奇,所以我在服务器上用 tcpdump 监视了流量,我注意到了很大的不同。虽然 IE 和 FF 在超时之前一直保持沉默,但 chrome 会定期向服务器发送 ACK 数据包(并且正在收到响应 ACK)。另外值得注意的是,IE/FF 似乎都发送了 TCP 断开连接,而不是从服务器接收任何超时。
是的,为什么 IE/FF 断开连接,而 Chrome 没有断开连接?为什么 Chrome 会发送 keep-alives 而 IE/FF 不会?
我已尝试更改此知识库文章中MS 推荐的注册表设置。它似乎没有改变任何行为。
来自 IE 的流量示例(FF 几乎相同)
23:25:56.814732 IP InternetExplorer.27378 > Server.https: . 83070:84430(1360) ack 154 win 65382
23:25:56.814976 IP InternetExplorer.27378 > Server.https: . 84430:85790(1360) ack 154 win …Run Code Online (Sandbox Code Playgroud) 今天我们在服务器上遇到了一个问题,文件/脚本的加载时间超过了 3 秒。解决方案很简单 - 只需将 MaxClients 增加到估计的内存限制即可。但我担心该解决方案的可扩展性,它似乎不太可靠——如果负载稍微增加,问题会再次出现。
我们正在开发的网络服务的性质——小型在线游戏——要求我们嵌入 AJAX 机制,该机制每 15 秒发送一个信标,指示客户端在线。
让我们想象以下设置。Apache 2 (mpm_prefork), MaxClients = 150, KeepAlive = on, KeepAliveTimeout = 5. 有300个用户在线。我的理解是否正确 - 如果所有 300 个用户将同时发送一个信标(仅通过使用 POST 检索信标.php 脚本) - 前 150 个客户端将几乎立即得到答案,而其他 150 个客户端将不得不等待 5 秒才能得到一个回答?
还有第二个问题。在我的情况下,最好的解决方案是什么?完全禁用保持活动?
我在用 Apache 2.2.22
中的 Keepalive 指令之间有什么区别(如果有) /etc/apache2/apache2.conf
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
Run Code Online (Sandbox Code Playgroud)
以及/sites-enabled使用 ProxyPass 时配置中的指令
ProxyPass / http://localhost:8080/app/ connectiontimeout=28800 timeout=28800 Keepalive=On
Run Code Online (Sandbox Code Playgroud) 我们有一个相当典型的设置:客户端 <-> apache2 (2.2.22) <-> 后端 (*)。
最初,我们以最简单的形式使用 mod_rewrite 和 [P] 标志:
<VirtualHost *:80>
RewriteEngine On
ProxyPreserveHost On
RewriteRule ^(.*)$ http://localhost:8081$1 [P,L]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
然而,使用此设置,即使客户端使用保持活动连接并使用一个 tcp 连接向 apache 发送多个 http 请求,apache 也会创建一个到后端的新 tcp 连接以获取请求。
我决定尝试直接使用 mod_proxy:
ProxyPreserveHost On
ProxyPass / http://localhost:8081/
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,现在 apache 和后端之间的 tcp 连接被重新使用(这是我最初的目标)。
这是为什么?mod_rewrite 中是否有某些内容可以配置以启用 keepalive 后端连接?
(*) 后端实际上是 haproxy <-> 多个应用程序服务器,但我认为这在这里并不重要。
我们在 nginx 代理后面使用 nginx 后端。
我们使用上游保活。
他们工作得很好。
我们想知道,我们应该keepalive_requests在后端设置什么值来将最大保活请求数设置为无限制?
谢谢!
HTTP 请求上的 keep-alive 和 TIME_WAIT 中的 tcp 套接字之间有什么关系 - 它们应该相关吗?
此外,系统和网络服务器设置是否应该保持一致,例如server.max-keep-alive-idle = 60?根据如何减少 TIME_WAIT 中的套接字数量?在 Linux 中,TIME_WAIT 状态被硬编码为 60 秒(至少对于 Linux 的 Ubuntu/Debain 值)。
在 lighttpd 中是默认值server.max-keep-alive-idle = 5,他们建议在高负载时甚至更低。如果 tcp 套接字可用,则在 5 秒后关闭 http 请求似乎是一种浪费——当然,假设设置按照net.ipv4.tcp_tw_reuse = 1它在锡上所说的进行。
这个相关的问题 - tcp 如何保持连接有效?[关闭]触及了这个问题,但没有为我完全回答。
我正在使用 php-fpm 和 (d)dos deflate 设置一个 nginx 网络服务器以禁止攻击。
现在我的服务器根本没有流量,因为我正在测试。
使用此命令,我可以查看谁连接到我的服务器,以及他们打开了多少个连接:
netstat -ntu | awk '{print $5}' | 剪切 -d: -f1 | 排序 | uniq -c | 排序 -n
在测试期间,我注意到当我加载一个测试脚本时,它基本上<?php phpinfo(); ?>会启动 3 个连接。我猜 1 表示 HTML,2 表示该页面上的 2 张图像。到目前为止一切都很好...
但我注意到在关闭这 3 个连接之前花了一分钟多的时间。我一直在运行上面的 netstat 命令来查看这 3 个外部连接是否会关闭。
我的 nginx.conf 的保持活动超时为 4。
keepalive_timeout 4;
Run Code Online (Sandbox Code Playgroud)
连接是通过默认设置的 Chrome 浏览器进行的。
这些连接怎么保持打开这么长时间,这正常吗?另外,有没有办法可以更快地关闭它们?
预简报:
尽管我的问题很广泛,但我正在处理连接到 php-fpm (fcgi) 的 nginx,它通过本地套接字 (/tmp/somesocket.socket) 提供服务。
Nginx 有一个设置来保持与 fcgi 后端的连接(http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_keep_conn)。
这就是我的问题所涉及的。
题:
在linux中,当连接到本地套接字时,是否存在keepalives这样的东西?
保持连接是否会消除(甚至是一点点)与创建/拆除连接相关的一些开销?
谢谢。
keepalive ×10
nginx ×4
http ×3
apache-2.2 ×2
timeout ×2
502-error ×1
apache2 ×1
curl ×1
ddos ×1
firefox ×1
linux ×1
mod-proxy ×1
mod-rewrite ×1
mpm-prefork ×1
networking ×1
proxy ×1
socket ×1
tcp ×1
tcpip ×1
time-wait ×1