0

我有一个处理 http 和 https 请求的播放框架 1.2.4 站点。

Play 监听 80 和 443 端口,没有安装反向代理。

一段时间后,站点停止响应,并在日志中显示大量“java.io.IOException:打开的文件过多”。

显然,播放有时会使 https 连接处于 CLOSE_WAIT 状态。这些连接如下所示:

java    24151 root  201u  IPv6             915797      0t0      TCP Ubuntu-1004-lucid-64-minimal:https->xdsl.******.net:55055 (CLOSE_WAIT)

以下是对存活(工作几个小时)和死亡(打开 16k 文件)的 lsof 转储的分析:

$ grep "CLOSE_WAIT" dead.txt | wc -l
10473
$ grep "ESTABLISHED" dead.txt | wc -l
1888
$ grep "https.*CLOSE_WAIT" dead.txt | wc -l
10473
$ grep "https.*ESTABLISHED" dead.txt | wc -l
1621

$ grep "CLOSE_WAIT" alive.txt | wc -l
7
$ grep "ESTABLISHED" alive.txt | wc -l
50
$ grep "https.*CLOSE_WAIT" alive.txt | wc -l
7
$ grep "https.*ESTABLISHED" alive.txt | wc -l
32

如您所见,约 20% 的请求是 http,但所有处于 CLOSE_WAIT 状态的连接都是 https。

什么可能造成麻烦?这可能是游戏框架中的错误吗?

4

1 回答 1

2

根据您所描述的,我同意这似乎是 Play 中的一个错误。这可能是 Netty 的问题,但由于 Play 与 Netty 集成,我认为分界与您的目的无关。我建议在 Lighthouse 上提出一张票,并可能联系 Nicolas Leroux,他负责应用程序的 https 部分。

但是,Play 开发人员会首先说 Play 不打算成为 http 和 https 容器。https 握手最好由前端代理执行,例如 Apache。在线和 Play 文档中有很多关于如何执行此操作的示例。

于 2012-05-04T10:12:10.173 回答