![返回标头之前脚本超时:iredadmin.py](https://linux22.com/image/62812/%E8%BF%94%E5%9B%9E%E6%A0%87%E5%A4%B4%E4%B9%8B%E5%89%8D%E8%84%9A%E6%9C%AC%E8%B6%85%E6%97%B6%EF%BC%9Airedadmin.py.png)
我正在尝试访问我的 iRedMail 后端https://domain.com/iredadmin
但是,它总是超时并出现 500 错误。
我检查错误日志,看到以下内容:
[Sat Apr 11 16:53:41 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 16:57:56 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 16:58:31 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 17:04:50 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 17:05:25 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 17:10:16 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 18:33:27 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 18:34:50 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
[Sat Apr 11 18:40:38 2015] [error] [client IP.ADDRESS.GOES.HERE] Script timed out before returning headers: iredadmin.py
这以前曾有效过,所以我想我做了一些破坏它的事情。我的猜测是与 SSL 有关的。我的服务器上没有正确设置 SSL - 事实上,这就是我尝试访问 iRedAdmin 的原因 - 添加用于 SSL 确认的电子邮件地址。然而,这以前绝对有效,所以我不确定为什么它现在停止工作。
我尝试暂时禁用 IPTables 以查看是否可以访问它 - 但这似乎不是问题(所以我的猜测是端口 443 没有被阻止)。
有人见过这个错误吗?可能是什么原因造成的?我在任何地方都找不到有关该问题的任何文档。
编辑 - 额外请求的信息:
剧本:
import os
import sys
rootdir = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0, rootdir)
from libs import iredbase
# Initialize webpy app.
app = iredbase.app
if __name__ != '__main__':
# Run app under Apache + mod_wsgi.
application = app.wsgifunc()
else:
# Starting webpy builtin http server.
app.run()
如果配置:
eth0 Link encap:Ethernet HWaddr 04:01:17:63:25:01
inet addr:162.243.99.103 Bcast:162.243.99.255 Mask:255.255.255.0
inet6 addr: fe80::601:17ff:fe63:2501/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:157212578 errors:0 dropped:0 overruns:0 frame:0
TX packets:23981088 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13992866807 (13.9 GB) TX bytes:9214954428 (9.2 GB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:24601180 errors:0 dropped:0 overruns:0 frame:0
TX packets:24601180 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3826034358 (3.8 GB) TX bytes:3826034358 (3.8 GB)
不确定您到底想要我 ping 的内容 - 我当前已登录到我尝试访问 https 的服务器。
您还需要查看 iredbase 的内容吗?
答案1
有两种解决脚本超时的通用方法,您可以使脚本更快,或者绕过或延长超时。每个人都同意,如果你让脚本更快,那就更好,但有时你不能或不知道如何做。在公共制作脚本中,我会尽一切努力使事情足够快,不会超时或转到后台处理机制(您的请求已收到,我们将在大约一个小时内给您答复)。
但在开发和某些内部应用程序类别中,长请求是可以接受的
Web 服务器对脚本施加三类超时。
- 完成总时间
- 进度超时:当脚本发送一些输出但停止时会发生这种情况。
- 第一个字节或所有标头:如果网络服务器没有收到标头并将其发送到浏览器,则浏览器认为服务器没有响应并超时,因此当这种情况发生时,网络服务器终止脚本是有意义的。
这些通常是可调整的,但我不会调整第一个字节超时(因为这样浏览器将超时,而不解决任何问题),而是努力不等待发送标头。这通常可以通过禁用脚本的输出缓冲或定期刷新缓冲区来实现。然后通过添加调试输出,您可以看到您实际将时间花在哪里。
我确实注意到,您的应用程序的大部分内容不在您的脚本中,这使得语言启动(包含)可能太长而无法实用,在这种情况下,像 mod_python 或 fast_cgi 这样的启动发生在请求将是一个好主意。