Apache2 反向代理在代理 tomcat web 应用程序时似乎会间歇性冻结。
问题是,当我尝试登录这个代理 Web 应用程序时,它经常会冻结(通常是一天一次或两次,在不活动之后)。应用程序会无限期地冻结,没有 500 响应代码...浏览器只是等待和等待。
如果我继续尝试从我的浏览器提示网址,它最终会重新开始工作。
我尝试通过直接导航到 tomcat 端口 8080 上的 Web 应用程序来重现此问题,但如果不通过反向代理,我就无法重现此问题。
这是我的反向代理配置...有什么查找故障的方法吗?谢谢
/etc/apache2/站点可用/默认
ProxyPass /manage/ http://localhost:8080/manage/
ProxyPassReverse /manage/ http://localhost:8080/manage/
ProxyPass /manage http://localhost:8080/manage
ProxyPassReverse /manage http://localhost:8080/manage
/etc/apache2/mods-available/proxy.conf
<IfModule mod_proxy.c>
#turning ProxyRequests on and allowing proxying from all may allow
#spammers to use your proxy to send email.
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
Allow from all
</Proxy>
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
ProxyVia On
</IfModule>
更多信息:(不确定是否相关)
- 每个网页平均有 2 - 3 个 Ajax 调用
- 未申请提高网站加载速度的 14 条规则. 希望很快应用过期标头来缓存静态内容。
启用 Apache 模块:
core_module(静态) log_config_module(静态) logio_module(静态) mpm_worker_module(静态) http_module(静态) so_module(静态) alias_module(共享) auth_basic_module(共享) authn_file_module(共享) authz_default_module(共享) authz_groupfile_module(共享) authz_host_module(共享) authz_user_module(共享) autoindex_module(共享) cgid_module(共享) deflate_module(共享) dir_module(共享) env_module(共享) mime_module(共享) negotiation_module(共享) proxy_module(共享) proxy_ajp_module(共享) proxy_connect_module(共享) proxy_http_module(共享) reqtimeout_module(共享) rewrite_module(共享) setenvif_module(共享) status_module(共享)
更新:我现在使用 ajp 协议作为代理。并设置了一些附加的 ProxyPass 配置,例如
ProxyPass /manage ajp://localhost:8009/manage max=20 ttl=120 acquire=10000 retry=0
ProxyPassReverse /manage ajp://localhost:8009/manage
答案1
我将尝试使用 ajp 从 apache 连接到 tomcat。
请使用 mod_proxy_ajp 和 Tomcat 测试配置。
从日志来看,tomcat 似乎没有响应 apache 的请求。它拒绝了连接。
如果流量很大,请深入搜索应用程序日志。这可能是死锁或已达到最大线程数。
高血压
答案2
检查你的 apache 文件缓存是否被禁用。
# LoadModule file_cache_module modules/mod_file_cache.so
如果这不能解决问题(应该不能,这似乎不是缓存问题),请尝试使用 mod_jk 进行调试。下载适合您的 Apache 的 mod_jk 版本,进行设置,并将日志级别设置为 DEBUG
# Set the jk log level [debug/error/info]
JkLogLevel debug
另外,在你的 Apache 日志中包含大量信息
LogFormat "%h %l %u %t \" %m \"%V\" \"%r \" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D CustomLogFormat
. . .
CustomLog "|C:/Apache2/bin/rotatelogs.exe C:/Apache2/logs/access_%Y%m%d.log 86400" CustomLogFormat
现在您应该有一个包含提供页面所需微秒数的 Apache 日志,以及一个 AJP 1.3 与 tomcat 连接的调试级别日志(使用 mod_jk)。
完成后,重新启动 Apache 并尝试强制解决该冻结错误。当错误发生时,检查时间并浏览日志以查看当时发生了什么,Apache 花了多少时间进行处理等等。
它不会解决任何问题,但很可能会让你了解正在发生的事情。
答案3
如果您的连接被拒绝,则可能是 Tomcat 上的 maxthread 数量已达到上限。Apache 的 maxclient 设置为多少?Tomcat 上的 maxthread 设置为多少?您需要确保您的 maxclient 不超过 maxthread。否则,Apache 将尝试代理超过 Tomcat 可以提供的连接,并且 Tomcat 将拒绝连接。
此外,如果您retry=0
在 ProxyPass 语句的末尾,Apache 将不会禁用后端工作程序,并且遇到此问题时您的恢复将会更快。