题 代理错误502“原因:从远程服务器读取错误”与Apache 2.2.3(Debian)mod_proxy和Jetty 6.1.18


Apache正在端口:80接收请求,并在端口:8080将它们代理到Jetty

The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /.

我的困难: 一切正常 一般 (快速请求,几秒或几十秒长的请求被处理 )。 问题 发生 当请求处理需要很长时间 (一会儿?)。

如果我发出请求  到港口码头:8080请求处理好了。 所以问题是 容易 坐在我正在使用的Apache和Jetty之间的某个地方 mod_proxy的。怎么解决这个?

我已经尝试了一些“技巧” 与KeepAlive设置相关,没有运气。这是我目前的配置,有什么建议吗?

#keepalive Off                     ## I have tried this, does not help
#SetEnv force-proxy-request-1.0 1  ## I have tried this, does not help
#SetEnv proxy-nokeepalive 1        ## I have tried this, does not help
#SetEnv proxy-initial-not-pooled 1 ## I have tried this, does not help
KeepAlive 20                       ## I have tried this, does not help
KeepAliveTimeout 600               ## I have tried this, does not help
ProxyTimeout 600                   ## I have tried this, does not help

NameVirtualHost *:80
<VirtualHost _default_:80>
    ServerAdmin webmaster@mydomain.fi

    ServerName www.mydomain.fi

    ServerAlias mydomain.fi mydomain.com mydomain www.mydomain.com

    ProxyRequests On
    ProxyVia On
    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyRequests Off
    ProxyPass / http://www.mydomain.fi:8080/ retry=1 acquire=3000 timeout=600
    ProxyPassReverse / http://www.mydomain.fi:8080/

    RewriteEngine On
    RewriteCond %{SERVER_NAME} !^www\.mydomain\.fi
    RewriteRule /(.*) http://www.mydomain.fi/$1 [redirect=301L]

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

</VirtualHost>

以下是失败请求的调试日志:

74.125.43.99 - - [29/Sep/2010:20:15:40 +0300] "GET /?wicket:bookmarkablePage=newWindow:com.mydomain.view.application.reports.SaveReportPage HTTP/1.1" 502 355 "https://www.mydomain.fi/?wicket:interface=:0:2:::" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: error reading status line from remote server www.mydomain.fi, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: Error reading from remote server returned by /, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::

72
2017-09-29 17:35




嗨..我仍然坚持这个。尝试了以上所有设置,并且还增加了jetty maxIdleTime没有帮助。任何指针接下来要尝试什么? - Martin


答案:


我已经解决了这个问题。该 Keepalive=On 应插入 ProxyPass 配置行:

ProxyPass / http://www.dom.fi:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On

看到了

Keepalive=On

那里?这很关键;)


81
2018-02-18 22:27



我相信你可以将自己的答案标记为已接受。它标志着系统中已解决的问题可供其他人查找。 - sysadmin1138♦
你究竟在哪里放这个? - AlxVallejo
@AlxVallejo你应该在/etc/apache2/sites-enabled/[sitename].conf找到你的配置文件 - Steven
我们有完全相同的代理错误。它们很少发生(千分之一请求)。 为什么 确实如此 Keepalive=On 危急? - dokaspar
难道不是 timeout=600 要么 retry=1 相反修复此问题? (或组合) - MattBianco


你试过设置吗? setenv proxy-initial-not-pooled 1

参考 这里


4
2017-09-29 17:46



不,这没有用。然后它不是关于竞争条件,它是长时间的延迟和介于两者之间的事情(Jetty和mod_proxy之间的某种误解)。


如果您不使用a结束代理URL,也会发生此错误 /。两个路径都应以a结尾 / 或两者都不


3
2018-06-14 23:37





查看日志,有一些东西在5分钟(= 300秒)超时。那是等待回应的很长时间。当您直接访问Jetty服务器时,此资源是否真的需要很长时间才能生成响应?

如果五分钟确实在可能的响应时间内,您可以尝试调整ProxyTimeout配置指令。

根据您的网络设置,可能没有理由甚至尝试使用任何keepalive系统(应用服务器和代理之间是否有防火墙,可能配置为丢弃空闲时间太长的会话?) ,但ProxyTimeout会影响代理本身的行为。

如果同一代理也服务于其他后端,最好保留当前的ProxyTimeout,并在ProxyPass指令中配置超时(请参阅mod_proxy文档)。

但是,如果没有代理的响应始终远远低于此处作为截止限制的五分钟,那么代理和应用服务器之间可能确实存在一些奇怪的干扰,但是您没有提供任何识别它可能是什么的价值。


1
2017-10-10 18:51



“当你直接访问Jetty服务器时,这个资源真的需要很长时间来产生响应吗?” - 是的我也尝试将此ProxyTimeout设置为600.没有帮助。代理和码头之间没有防火墙。超时也在ProxyPass中配置。
“你没有提供任何有价值的东西来识别它可能是什么”:我不知道那可能是什么。我收到的是来自服务器的错误消息:代理服务器错误代理服务器收到来自上游服务器的无效响应。代理服务器无法处理请求GET /。原因:从远程服务器读取时出错
至于增加代理超时,这是否也改变了浏览器在获得502错误之前旋转的时间?
然后,了解如何找出应用程序服务器中发生的情况:您可以进行几个线程转储,并从中查看浏览器等待时正在执行的操作。或者,添加足够的调试日志记录语句,以便能够跟踪代码以查明缓慢的原因。
我知道为什么它很慢。我不知道为什么apache代理在最终准备就绪时会拒绝响应。


我删除一个名为的标头值 Transfer-Encoding" (binary) 在我的服务器应用程序(PHP)中解决了以下问题:

[proxy_http:error] [pid 17623](22)参数无效:[客户端   127.0.0.1:44929] AH01102:从远程服务器0.0.0.0:80读取状态行时出错

所有其他建议都喜欢 SetEnv proxy-initial-not-pooled 要么 Keep-Alive 没有。


0
2018-05-21 12:27





如果上述解决方案不起作用,您可以尝试的一件事是启用所有apache模块,以确保没有一些模块需要以某种方式意外禁用。

例如,我如何找到问题的原因是在所有Apache配置文件中用LoadModule替换#LoadModule的所有实例。由于这解决了我的问题,因此我知道我的问题不是缺少“KeepAlive”指令参数,而是我的问题是缺少依赖。

因为,记住,.so文件基本上是静态库。启用模块并不意味着它会被使用,但是有一个禁用确实意味着它不能被使用,因此,任何依赖它的东西都必然会失败。

注意:由于我的初步答案似乎建议永远保留所有模块,因此这个答案已经收到一些降票。虽然理论上你可以做到这一点而不必破坏任何东西,但它显然不是最佳实践解决方案。

所以,请理解,我只是建议将其作为故障排除步骤,而不是最终解决方案。

另外,请注意:我使用一个特殊的git项目来跟踪我所有的本地机器的apache配置文件。这样我可以在我的apache配置工作目录中执行这些类型的全局搜索和替换操作,作为故障排除步骤。如果启用所有模块成功,则尝试逐个禁用它们并在其间重新启动apache,直到找到需要保持启用的模块。一旦你想出来,然后将repo重置回原来的状态,只启用一个需要保持启用的模块。

您还会发现使用git跟踪您的apache配置文件可以清理这些目录,因为您将不再需要那些旧式的.bak和.default文件。


-1
2017-12-24 09:56



每个库带来了不同的功能,与代理无关 - Arnold Roa