我有一个 CentOS 6.7 apache 服务器版本:Apache/2.4.7 (Unix) 服务器,配置了 http 和 https 端口。除了 SSL 特定设置之外,它们的配置相同。
最相关的设置是
KeepAlive on
MaxKeepAliveRequests 50
KeepAliveTimeout 65
Timeout 65
AcceptFilter https none
没有 .htaccess 文件或其他明显的配置文件。
但是当我使用类似命令测试原始连接超时时
time telnet localhost 443 或 # time telnet localhost 80
我得到了意想不到的错误结果。
对于http我得到
time telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
real 0m51.423s
user 0m0.001s
sys 0m0.002s
对于 SSL https 我得到
time telnet localhost 443
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
real 0m20.018s
user 0m0.001s
sys 0m0.002s
如您所见,nighter 显示预期的 65 秒超时,http 为 50 秒,https 为 20 秒。
任何配置文件中都没有设置替代超时。
我还考虑了内核 TCP 设置。 tcp_fin_timeout=60 tcp_keepalive_time=7200 tcp_synack_retries=5
SSL 的这 20 秒从何而来?为什么保活设置和超时设置被忽略? SSL 是否有不同形式的“KeepAlive”和/或“Timeout”关键字使其与 http 不同?
答案1
由于您使用的是 Linux,AcceptFilter
功能是TCP_DEFER_ACCEPT
在 Linux 上使用套接字选项。 Apache 源代码显示httpd
为此使用 30 秒的套接字选项值(硬编码)。
如果你的阿帕奇还有mod_reqtimeout
模块,这可能是默认行为RequestReadTimeout
参与。默认情况下,RequestReadTimeout
等待至少在客户端连接超时之前读取标头需要 20 秒。
所以把这些放在一起,或许您会看到 HTTP 请求超时 50 秒,因为您有不是禁用AcceptFilter
HTTP(仅 HTTPS),这意味着您有 30 秒 ( AcceptFilter
) 加 20 秒 (RequestReadTimeout
)。 但对于 HTTPS 请求,您已禁用AcceptFilter
,我怀疑您遇到了只是由于 20 秒超时RequestReadTimeout
。
希望这可以帮助!
答案2
你有请求超时apache模块加载了吗?
尝试这个命令看看:apachectl -M | grep reqtimeout
如果是这样,则默认为 20 秒http://httpd.apache.org/docs/2.4/mod/mod_reqtimeout.html:
语法:RequestReadTimeout [header=timeout[-maxtimeout][,MinRate=rate] [body=timeout[-maxtimeout][,MinRate=rate]
默认值: header=20-40,MinRate=500 body=20,MinRate=500
你可以改变这个时间为 60 秒(最多 90 秒,包括接受请求),并在 /etc/httpd/conf/httpd.conf (或某些 vhosts.conf 类型的文件)中包含以下内容:
RequestReadTimeout header=60-90,MinRate=500 body=60-90,MinRate=500
你也可以测试使用以下命令之前/之后:
time openssl s_client -connect your.ip.address.here:443
为我:
前
real 0m20.222s
user 0m0.012s
sys 0m0.000s
后
real 1m0.527s
user 0m0.017s
sys 0m0.006s