Apache正在端口:80接收请求,并将请求代理到端口:8080的Jetty。秒的请求可以正常处理)。当请求处理花费很长时间(几分钟?)时,会出现问题。

如果我直接在端口:8080上向Jetty发出请求,则该请求将得到处理。所以问题可能出在我正在使用mod_proxy的Apache和Jetty之间。如何解决呢?

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

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


这里也是失败请求的调试日志:

#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/ [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>


评论

嗨..我仍然坚持这一。尝试了所有上述设置,并且增加码头的maxIdleTime也无济于事。任何指针接下来要尝试什么?

#1 楼

我已经解决了问题。应该将Keepalive=On插入到ProxyPass的配置行中:

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


看到
这很关键;)

评论


我相信您可以将自己的答案标记为已接受。它会将问题标记为系统中已解决的问题,供其他人查找。

– sysadmin1138♦
2011-2-18在22:50

你到底把它放在哪里?

– AlxVallejo
16年1月27日在15:34

@AlxVallejo您应该在此处找到配置文件/etc/apache2/sites-enabled/[sitename].conf

–史蒂文
16年2月8日在18:04

我们有完全相同的代理错误。它们很少发生(千分之一的请求)。为什么Keepalive = On关键?

– dokaspar
16年4月15日在12:22

可以通过timeout = 600或retry = 1来解决此问题吗? (或组合)

– MattBianco
16-09-13在7:20



#2 楼

您是否尝试过设置setenv proxy-initial-not-pooled 1

参考此处

评论


不,这没有帮助。然后,这与比赛条件无关,而是漫长的延迟,并且两者之间发生了某些事情(Jetty和mod_proxy之间存在某种误解)。

–马丁
2010-09-29 19:47

#3 楼

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

评论


谢谢,这解决了我的问题。只是一个简单的/结尾。 :)

–vijay
20 Nov 17在12:56



#4 楼

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

如果这五分钟确实在可能的响应时间内,您可以尝试调整ProxyTimeout配置指令。 />
取决于您的网络设置,很可能甚至没有理由甚至尝试使用任何keepalive系统(应用服务器和代理之间是否存在防火墙,可以将其配置为删除会话)。空闲时间太长?),但ProxyTimeout会影响代理本身的行为。在ProxyPass指令中(请参阅mod_proxy文档)。

但是,如果没有代理的响应始终比五分钟要少得多(请参见此处的截止极限),则可能确实代理服务器和应用服务器之间有些奇怪的干扰,但是没有提供任何有价值的东西来识别它可能是什么。

评论


“当您直接访问Jetty服务器时,此资源真的需要那么长时间才能产生响应吗?” -是的我也尝试将ProxyTimeout设置为600。这无济于事。代理服务器和码头之间没有防火墙。超时也是在ProxyPass中配置的。

–马丁
2010-10-11 12:39

“您没有提供任何有价值的东西来识别它可能是什么”:我不知道那可能是什么。我得到的只是来自服务器的错误消息:代理错误代理服务器收到来自上游服务器的无效响应。代理服务器无法处理请求GET /。原因:从远程服务器读取错误

–马丁
2010-10-11 12:40

至于增加代理超时,这是否还会更改浏览器在出现502错误之前旋转的时间?

–user56707
2010-10-11 17:01

然后介绍如何找出应用程序服务器中发生的情况:您可以进行几个线程转储,并从它们中查看浏览器在等待时正在执行什么。或者,添加足够的调试日志记录语句,以能够跟踪您的代码以查明运行缓慢的原因。

–user56707
2010-10-11 17:04

我知道为什么它很慢。我不知道为什么apache代理最终准备好后会拒绝响应。

–马丁
2010-10-12 3:47

#5 楼

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


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

#6 楼

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

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

因为,请记住,.so文件基本上是静态库。启用一个模块并不意味着它将被使用,但是禁用一个模块则意味着它不能被使用,因此,依赖于该模块的任何操作都必然会失败。

注意:由于我的最初答案似乎建议永久禁用所有模块,因此该答案获得了一些否决。虽然您理论上可以做到这一点而不必破坏任何内容,但这显然不是最佳实践解决方案。 >
也请注意:我使用一个特殊的git项目来跟踪我的本地计算机的所有apache配置文件。这样,我就可以在我的apache config工作目录中执行这类全局搜索和替换操作,作为故障排除步骤。如果启用所有模块均成功,则尝试再次逐个禁用它们并在两者之间重新启动apache,直到找到需要保持启用状态的模块为止。一旦确定了这一点,然后将存储库重置回其原始状态,并仅启用需要保持启用状态的那个模块。

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

评论


每个库都带来不同的功能,不一定与代理有关

–阿诺德·罗阿(Arnold Roa)
16年1月24日在1:03