我有一个 Ubuntu 12.04 服务器虚拟盒,其中安装的软件和配置基本上都是默认的,另外还安装了 jetty 6 服务器,该服务器为一些网站提供服务。为了简单起见,我没有安装 apache httpd,而是使用 iptables 将 jetty(在 8080 端口上运行)暴露给端口 80。以下是
/sbin/iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere localhost tcp dpt:http redir ports 8080
REDIRECT tcp -- anywhere Ubuntu-1104-natty-64-minimal tcp dpt:http redir ports 8080
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere localhost tcp dpt:http redir ports 8080
REDIRECT tcp -- anywhere Ubuntu-1104-natty-64-minimal tcp dpt:http redir ports 8080
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
我必须承认,我对 iptables 的工作方式(尤其是对于不同类型的链)的理解很肤浅。这个东西可以工作,但有时我会遇到大量套接字,这些套接字会永久处于 CLOSE_WAIT 状态。我知道这个状态意味着什么,但由于我没有编写管理 servlet 的代码(它们由 jetty 处理),所以我无法通过修补代码来解决问题。最终,CLOSE_WAIT 套接字的数量会累积起来,导致服务器无响应,因此我必须重新启动 jetty。
我查找了与 CLOSE_WAIT 相关的类似问题,但只发现与程序员代码相关的案例,或与 Tomcat 相关的问题,而不是 Jetty。我想知道它们是否与部分损坏的 iptables 配置有关(另一种可能是 Jetty 6 中的错误,但我首先想排除其他可能的原因)。
谢谢。
答案1
到目前为止,还没有反馈:-(对于遇到麻烦的其他人,我至少能够编写一个快速的 crontab 脚本来检测问题并重新启动 jetty。这并不能完全解决问题,但可以减轻影响。
#!/bin/sh
CLOSE_WAIT_COUNT=`/bin/netstat | /bin/grep CLOSE_WAIT | /usr/bin/wc -l`
TIMESTAMP=`/bin/date`
THRESHOLD=5
echo "$TIMESTAMP Reported $CLOSE_WAIT_COUNT sockets in CLOSE_WAIT state..." >> /var/log/jettyrestarter.log
if [ $CLOSE_WAIT_COUNT -gt $THRESHOLD ]
then
echo "$TIMESTAMP Restarting jetty" >> /var/log/jettyrestarter.log
service jetty restart
fi
答案2
另一个快速跟进,以防对其他人有用。几周前,我升级了运行 jetty 的虚拟服务器,从 512MB RAM 的虚拟服务器升级到 1GB RAM 的虚拟服务器。问题似乎已经消失 - 在 jettyrestarted 的日志中(见上文),最新事件来自 12 月 6 日。