使用 mod_proxy 对 SOAP 服务进行反向代理时出现间歇性错误

使用 mod_proxy 对 SOAP 服务进行反向代理时出现间歇性错误

在使用 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

相关内容