在使用 mod_proxy 作为 SOAP Web 服务的反向代理时,每隔几分钟就会出现此错误。每秒大概会有 3 或 4 个请求,因此我们说的是每千个请求中大约有 1 或 2 个会出现此错误。
[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] (20014)Internal error: proxy: error reading status line from remote server soap1.server:8888
[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] proxy: Error reading from remote server returned by /someapp/path/to/web/service
这会导致请求失败。如果我让客户端直接连接到 soap 服务器而不使用代理,则成功率为 100%,因此问题似乎出在代理上
配置如下。目的是当主服务器不可用时切换到备份服务器:
<Proxy balancer://apicluster>
BalancerMember http://soap1.server:8888 lbset=0
BalancerMember http://soap2.server:8888 lbset=1
</Proxy>
ProxyPass /someapp balancer://apicluster/someapp
ProxyPassReverse / balancer://apicluster/someapp
有人遇到过这个问题并找到了解决办法吗?错误报告中提到了一些问题,但没有解决方案。唯一可能不寻常的是客户端请求可能为 100MB 或更大,因此请求可能比 SOAP 调用预期的时间要长一些。
答案1
以防其他人遇到这种情况。这是 mod_proxy 中的一个错误,可以通过在 httpd.conf 中添加以下几行来避免:
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
https://issues.apache.org/bugzilla/show_bug.cgi?id=37770
有关这些变量的信息,请参阅mod_proxy
文档。他们有一个特定的部分,即“协议调整”,来解决这些变量。
答案2
请注意此处的 Apache 文档:http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html
mod_proxy_http 中似乎存在竞争条件,但可以通过包含以下内容来避免:
SetEnv proxy-initial-not-pooled 1
如果这是初始请求,这将阻止 Apache 使用池连接。
该文件确实指出,此设置将导致性能下降。
答案3
您还可以AH01102: error reading status line from remote server
通过使用 apache 模块 mod_reqtimeout 和此 conf 指令来抑制此相关错误消息():
RequestReadTimeout header=30
您可能必须启用 reqtimeout 模块,如下所示:
$ sudo a2enmod reqtimeout
$ sudo apache2ctl restart