我有一个 Web 服务器(运行 Apache2 的 Amazon Linux EC2 实例),我们称之为“服务器 A”,我在其上使用以下命令设置了反向代理:
# (All the appropriate modules are loaded higher up in the conf file)
# ...
ProxyRequests off
ProxyPass /booth5/ http://localhost:8005/
ProxyHTMLURLMap http://localhost:8005 /booth5
<location /booth5/>
ProxyPassReverse /
SetOutputFilter proxy-html
ProxyHTMLURLMap / /booth5/
ProxyHTMLURLMap /booth5 /booth5
RequestHeader unset Accept-Encoding
</location>
localhost:8005
通过 ssh 连接转发到防火墙后面的服务器的端口在哪里。
该设置运行良好并运行了一段时间,但一段时间后,服务器 A 不会向代理服务器发送任何新请求。
与代理服务器的连接保持正常:
# netstat -napt | grep 8005
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 22675/sshd
tcp 1 0 127.0.0.1:38860 127.0.0.1:8005 CLOSE_WAIT 28910/httpd
tcp 1 0 127.0.0.1:39453 127.0.0.1:8005 CLOSE_WAIT 28548/httpd
tcp 1 0 127.0.0.1:44596 127.0.0.1:8005 CLOSE_WAIT 28542/httpd
tcp 1 0 127.0.0.1:38774 127.0.0.1:8005 CLOSE_WAIT 28549/httpd
tcp 1 0 127.0.0.1:39997 127.0.0.1:8005 CLOSE_WAIT 29889/httpd
tcp 1 0 127.0.0.1:39135 127.0.0.1:8005 CLOSE_WAIT 28544/httpd
tcp 0 0 ::1:8005 :::* LISTEN 22675/sshd
我相信这会“耗尽” ssh 隧道上的所有通道,并且我希望服务器 A 能够以这样的方式运行:它根据需要向代理服务器发送 http 请求,然后清除连接。
最初我怀疑这是由于代理服务器上的 Apache 建立了持久连接,因此我更新了那里的配置以包括:
# Timeout: The number of seconds before receives and sends time out.
# Timeout 300
Timeout 30
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
KeepAlive On
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#MaxKeepAliveRequests 100
MaxKeepAliveRequests 6
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
KeepAliveTimeout 5
我还没有尝试设置KeepAlive Off
。我试图从短/持久连接中获取一些好处,但它们没有关闭。
Apache 配置是解决此问题的正确位置吗?它是隧道的 ssh 配置的一部分吗?(如果需要,可以提供该配置)。
答案1
不幸的是,这看起来像是 Apache 和 mod_proxy 代码的一个已知错误:https://issues.apache.org/bugzilla/show_bug.cgi?id=51814
我现在已经转向替代解决方案。