我在 Ubuntu(10.10)上运行 Tomcat 服务器(6.0.28),并启用了 APR(直接在端口 80 上运行,没有任何 Web 服务器前端)。
当我从浏览器提交页面并且 POST 数据很大(> 1444 字节)时,请求会失败并出现“504”错误。如果数据较少,则请求会成功。
仅当使用 Squid 代理服务器和/或低带宽访问网站时,才会出现此问题。如果通过快速互联网连接访问网站,则不会出现问题。
我已经启用了 RequestDumperValve,它始终显示截断的 POST 请求,然后中止,而没有在 tomcat 访问日志中记录任何内容。
为了混淆事物,我有这个:
- 同一应用程序在另一台运行 AWS Elastic Load Balancer(Amazon EC2、Tomcat 6.0.28/Ubuntu 10.10)的服务器上运行
- Apache2 服务器(Amazon EC2、mod_jk、Tomcat 6.0.24/Ubuntu 10.04)后面的另一台服务器上的同一应用程序可正常运行
- Apache2 服务器(Amazon EC2、mod_jk、Tomcat 6.0.24/Ubuntu 10.04)后面的另一台服务器上的同一应用程序无法运行
我比较了 apache2 配置文件和 tomcat 配置文件,没有发现任何区别。
我目前的观察:
- 如果我将 POST 主体内容长度减少到小于 1444,则 POST 请求成功,并且响应非常快(亚秒级)。
- 除此之外,请求还会返回 504 错误。
- 在 POST 工作的服务器上,长度为 1910 的内容都没有问题。但是,与亚秒级的 POST 请求相比,响应时间会延迟很多(服务器第一个字节需要约 20 秒)。
- Tomcat 总是在同一个地方中止 POST - 就在参数开始之前
- 其他一些用户也报告了这个问题,带宽较低,并且防火墙设备可能涉及内容过滤。
在 Tomcat 配置方面,启用 APR 并且 disableUploadTimeout="false"。其他一切都是默认的。
或者这毕竟是 Squid 的问题?还是网络 / TCP 层面的问题?
关于我还可以尝试什么,还有什么提示吗?
答案1
这是与 MTU 大小相关的问题。当客户端使用 ADSL 调制解调器并且路由器存在 PMTU 黑洞问题时,就会出现这个奇怪的问题。
我们将服务器上的 MTU 降低到 4192,一切正常。(这是最佳实践吗?)