ser*_*erg 7 tomcat java apache-2.2
我有一个网站,主要由静态 html 页面组成,偶尔会有 ajax 请求。该站点在 Apache 上运行,ajax 由 Tomcat 处理。
如果 Tomcat 响应变慢(java 无法连接到数据库服务器,或者只是因为任何原因需要很长时间来处理请求) - 它会使整个站点瘫痪:所有静态 html 页面都需要很长时间才能加载(相同带有图像、css、js)。
现在,如果我只是手动停止 Tomcat,一切仍然正常 - 该站点快速且响应迅速,只是 ajax 请求不起作用。
如何使响应缓慢的 Tomcat 不使用所有 Apache 资源,以便无论 Tomcat 发生什么情况,静态页面都可以始终工作?在我的情况下,响应式 html 页面比不使用 ajax 重要得多。
httpd.conf :
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule prefork.c>
StartServers 16
MinSpareServers 10
MaxSpareServers 40
ServerLimit 512
MaxClients 512
MaxRequestsPerChild 4000
</IfModule>
Run Code Online (Sandbox Code Playgroud)
worker.properties
worker.worker1.port=8888
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000
Run Code Online (Sandbox Code Playgroud)
服务器.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8081" />
<Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100" maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因 tomcat 不能快速处理您的 ajax 请求,这会减少您的 apache 可以处理的请求数量。Tomcat 被配置为并行处理 400 个请求,也有一个默认值acceptCount100。所以你的 tomcat 能够吃掉 500 个请求 - 至少:jvm 和平台依赖可能会有更多的连接请求排队。
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000
Run Code Online (Sandbox Code Playgroud)
..告诉 mod_jk为套接字操作等待大约 1.7天(socket_timeout 以秒为单位),为来自 tomcat 的单个网络数据包等待2 分钟。您应该调整这些值,以便在 tomcat 速度较慢的情况下让 mod_jk 尽早返回错误。
让我们假设您的 ajax 请求通常在一秒内处理,异常值最多两秒。处理完毕后,立即将响应发回。然后可以设置worker.worker1.reply_timeout=2500,只需半秒。socket_timeout甚至可以省略,因为它只是一个粗略的值。socket_connect_timeout,它定义了从 apache/mod_jk 连接到 tomcat 可能需要多长时间,应该添加到 worker.properties 并设置为一个非常低的值,例如 100。因为它们都位于同一台服务器上。有关更多详细信息,请参阅Apache Tomcat 连接器 - 参考。
从 apache 到 tomcat 的每个请求都计入您MaxClients在 httpd.conf 中配置的内容。被困在 tomcat 中的请求越多,apache 处理静态内容的可能性就越小。如果在这种情况下关闭 tomcat,静态内容会再次快速传递,因为它会释放资源用于 mod_jk 和 apache 中的请求处理。
你已经在 httpd.conf 中同时配置了prefork.c和worker.c。我猜prefork.c是活跃的,因为MaxClients设置为 512,这将符合您的观察和我的解释.. ;-)
告诉 mod_jk 提前放弃对 tomcat 的长时间运行的请求可能会有很大帮助,但您还应该考虑调整 apache ( MaxClients)处理的客户端请求数和 tomcat<connector maxThreads=...并行处理的请求数 ( )。这些数字必须与正常操作期间发生的情况相平衡。对页面加载进行一些跟踪可能有助于了解这些值的比例。绝对值取决于您的服务器规格、网络情况、客户端数量等。
如果可能的并行请求的绝对数量过低,用户会抱怨页面加载缓慢,而您将看不到服务器的容量。如果它太高,它将使用比实际需要更多的内存,甚至会变慢,并且无法从子系统(例如数据库)的问题中快速恢复。如果 apache 向 tomcat 发送更多请求,因为它会及时处理,您会看到其中一些超时,而其他请求在可接受的时间内处理。从 apache 和 tomcat 的类似值开始并不是一个坏主意,只要超时设置确保缓慢或无响应的 tomcat 不是 apache 脖子上的磨盘。
| 归档时间: |
|
| 查看次数: |
50429 次 |
| 最近记录: |