【发布时间】: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