我花了整整 8 个小时来追踪这个问题,但我仍然不太明白发生了什么,所以我希望有人可以向我解释这个问题或者确认这是一个错误,这样我就可以向 Apache 开发人员开具一张票据让他们知道。
我有一个 Ubuntu 20.04.2 LTS / Apache 2.4.41 / mod_wsgi 4.6.8 / Django 3.1 网络服务器,最近开始出现一些间歇性块编码问题。我在 Chrome 开发控制台中收到“ERR_INCOMPLETE_CHUNKED_ENCODING”。它只影响一个特别大的 .js 静态文件(~220Kb),所以我把它当作只有那个文件受到影响的原因,并尝试了我能找到的所有已知修复方法。
最有希望的方法是禁用该文件的 gzip 编码,这至少可以改变错误,但随后我得到的只是“ERR_CONTENT_LENGTH_MISMATCH”。此时我意识到下载的 .js 文件的数量在请求尝试之间有所不同。使用 wireshark 跟踪数据包,似乎服务器有时会提前停止响应,因此我的客户端关闭了连接并报告内容长度不匹配。偶尔整个 .js 文件会正确下载,但大多数情况下不会,如果没有它,页面将无法正确加载。
直接跳到正题,我最终发现,禁用默认服务器超时似乎是罪魁祸首。我设置了:
Timeout -1
...在 apache2.conf 中禁用此超时以解决先前的问题(是的,从安全角度来看,这不一定是最好的解决方案,但这是一个仅限内部的系统,并且是当时最有效的解决方案)。将其设置回任何常规值(例如默认值 300),可修复块编码问题。
我不知道为什么这可以解决我的问题,所以我想看看这里是否有人知道为什么这会导致我看到的行为 - 否则我会向 Apache 开一个错误单,看看我是否不能为其他人节省我所经历的麻烦。
我唯一能想到的是,是否有一个单独的超时设置用于传达块编码,并且-1
禁用全局超时的别名会以某种方式不正确地影响较低级别的超时?无论如何 - 任何方向都值得赞赏。
谢谢。
答案1
根据Apache HTTPd 文档超时指令以秒为单位指定。没有提到 -1 是禁用超时的神奇值。
将超时设置为 -1 可能会将有效超时减少到最低可能值,这个值太短,以至于 httpd 无法正常工作。