如何调试 Ubuntu / EC2 上与 Squid / Tomcat 相关的 POST 问题?

如何调试 Ubuntu / EC2 上与 Squid / Tomcat 相关的 POST 问题?

我在 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,一切正常。(这是最佳实践吗?)

相关内容