Apache2 反向代理似乎间歇性冻结?

Apache2 反向代理似乎间歇性冻结?

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>

更多信息:(不确定是否相关)

启用 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 将不会禁用后端工作程序,并且遇到此问题时您的恢复将会更快。

相关内容