我正在Windows Server 2012上运行Tomcat(8.0),并在Apache(2.4)后面使用ProxyPass来传递所有流量。一切都正常,但每当我没有任何操作60秒钟,然后再次访问服务器时,会出现8-20秒的延迟,就像Apache正在创建一个新进程来处理请求。
我的配置基本上是Apache Haus默认的配置,除了代理部分,我认为这是罪魁祸首。
基本上,无论是调用静态文件还是代理,如果距离上一次调用已经超过60秒,每个调用都需要很长时间才能得到响应!有什么想法吗?
更新: 我运行的是稍旧版本的Apache,2.4.12,但更新到最新版本2.4.17也没有解决问题。我尝试了各种keepalive设置,但似乎都没有帮助。在另一个论坛上,我被引导到这个Apache开发线程,其中提出了一个类似问题的建议补丁,我猜我会等待Apache的更新:
我的配置基本上是Apache Haus默认的配置,除了代理部分,我认为这是罪魁祸首。
ProxyPass /static/ !
ProxyPass / http://localhost:8088/
ProxyPassReverse / http://localhost:8088/
我添加了
/static/!
的例外情况,以查看是否会在提供静态文件时出现相同问题,显然确实如此。我进一步缩小了范围,通过注释掉所有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的更新: