【问题标题】:Apache Tomcat http dies, stops taking requestsApache Tomcat http 死亡,停止接受请求
【发布时间】:2020-06-13 11:41:50
【问题描述】:

上周我一直在处理攻击性机器人爬虫/攻击。该机器人以随机 ips 和代理字符串分发,因此难以阻止,但我有另一个线程。这个问题是http请求泛滥会导致Tomcat死机。

Tomcat 进程还可以,并且没有内存不足,它只是停止接受 http 或 https 请求。它会使任何 http 请求超时,但仍会接受 https 请求(如果 http 被攻击,有时 https 也会死掉)。

我之前看到过“打开的文件太多”的错误,所以我将文件限制从 10000 更改为 50000,这似乎有所帮助,至少 https 死了,但 http 仍然死了。最近没看到“打开的文件太多”。

貌似打开的文件量太大了,为什么Tomcat会打开这么多文件,高负载下会不会有文件泄露?服务器有时6个月还可以(所以正常情况下不会泄漏),但之前在高负载下已经死了。

该网站是一个拥有 >100 万页(动态内容)和 >100 万每天点击量的大型网站。

当 Tomcat 收到大量 http 请求时会发生什么(例如长时间每秒超过 100 个),我假设请求将开始备份,如果使用线程池将没有线程剩余,它会继续池请求直到出现问题,还是会开始拒绝请求?

有没有办法在一定数量的备份后开始拒绝请求?似乎是在极端负载下防止死亡或崩溃的唯一方法。

我的 http 和 https 配置是不同的,所以这可能与 http 死亡的原因有关。 https 使用 maxThreads 而 http 没有,(默认有多少线程?)

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443"
               URIEncoding="UTF-8" />

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
               keystoreFile="..." keystorePass="..."
               URIEncoding="UTF-8"/>

使用 Tomcat v8.5.47、CentOS 7.6、Oracle Java 1.8

【问题讨论】:

    标签: java http tomcat web-crawler


    【解决方案1】:

    每个套接字连接都被操作系统计为一个打开的文件。如果您根据操作系统使用 ulimit 命令或类似命令,请不要害怕将其设置为更高的数字,例如 250,000 用于像这样的大型网站。

    如果未指定,maxThreads 将设置为 200。也请尝试增加此值,因为这样做时不会使服务器的 CPU 饱和,可以增加 maxThreads 以帮助缓解 DDOS 攻击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多