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

JOT*_*OTN 21 mod-proxy apache-2.2

使用 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
Run Code Online (Sandbox Code Playgroud)

这会导致请求失败。如果我让客户端在不使用代理的情况下直接连接到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 
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个问题并找到了解决方法?错误报告中有一些提及,但没有解决方案。唯一可能不寻常的是客户端请求可能为 100MB 或更大,因此该请求可能比您预期的 SOAP 调用花费的时间长一点。

JOT*_*OTN 28

以防其他人遇到这种情况。这是 mod_proxy 中的一个错误,可以通过将这些行放在 httpd.conf 中来避免:

SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
Run Code Online (Sandbox Code Playgroud)

https://issues.apache.org/bugzilla/show_bug.cgi?id=37770

有关这些变量的作用的信息,请参阅mod_proxy文档。他们有一个特定的部分,协议调整,解决这些变量。


小智 5

请注意此处的 Apache 文档:http : //httpd.apache.org/docs/2.2/mod/mod_proxy_http.html

mod_proxy_http 中似乎存在竞争条件,但可以通过包含以下内容来避免:

SetEnv proxy-initial-not-pooled 1
Run Code Online (Sandbox Code Playgroud)

如果这是初始请求,这会阻止 Apache 使用池连接。

该文档确实指出,此设置会降低性能。