【发布时间】:2016-01-21 22:31:30
【问题描述】:
所以我在 Windows Server 2012 上的 Apache(2.4) 后面运行 Tomcat(8.0),并使用 ProxyPass 传递所有流量。一切正常,但是每当我在 60 秒内什么都不做,然后再次访问服务器时,我会延迟 8-20 秒,就像 apache 正在创建一个新进程来处理请求一样。
我的配置几乎是 Apache Haus 附带的默认配置,加上代理的东西,我认为这是罪魁祸首:
ProxyPass /static/ !
ProxyPass / http://localhost:8088/
ProxyPassReverse / http://localhost:8088/
我添加了
/静态/!
豁免查看在提供的静态文件上是否会发生同样的问题,显然确实如此。我通过注释掉所有 ProxyPass 的东西来进一步缩小范围,并验证我的静态文件总是快速加载。然后我取消了 ProxyPass 的注释,只请求了我的静态文件,它又总是快速返回。但是一旦我点击了一个带我通过代理的 URL,等一下,然后再次点击它,就会出现可怕的错误。下面是两个请求的网络监视器输出,第一个静态文件在代理使用之前延迟 1 分钟后第二次请求,另一个在代理使用两次之后,代理请求之间存在延迟。
3501 4:17:48 PM 10/21/2015 104.2752287 httpd.exe HTTP HTTP:Request, GET /static/index.html
3502 4:17:48 PM 10/21/2015 104.2760830 httpd.exe HTTP HTTP:Response, HTTP/1.1, Status: Not modified, URL: /static/index.html
之后(8秒返回):
24232 4:26:13 PM 10/21/2015 608.7355960 httpd.exe HTTP HTTP:Request, GET /static/index.html
24775 4:26:20 PM 10/21/2015 616.0896861 httpd.exe HTTP HTTP:Response, HTTP/1.1, Status: Not modified, URL: /static/index.html
在 SynReTransmit 线最初被破坏后,我注意到它的更多内容,不确定它是否相关:
24226 4:26:13 PM 10/21/2015 608.7286692 httpd.exe TCP TCP:[SynReTransmit #24107]Flags=......S., SrcPort=61726, DstPort=HTTP(80), PayloadLen=0, Seq=1157444168, Ack=0, Win=8192 ( Negotiating scale factor 0x2 ) = 8192
但基本上每次调用,无论是静态文件还是通过代理,如果自上次调用以来已超过 60 秒,则需要永远得到响应!
有什么想法吗?
更新: 我运行的是稍旧的 Apache 2.4.12 版本,但更新到最新版本 2.4.17 并没有修复它。我尝试了各种keepalive设置,似乎没有任何帮助。在另一个论坛上,我被指向了这个 apache 开发线程,该线程有一个针对听起来类似问题的建议补丁,我想我会等待 apache 更新:
【问题讨论】:
-
你解决了吗?
-
不,我放弃并切换到 nginx 作为我的代理...