![Windows 上的 Apache 2.4 对初始第一个请求的响应很慢](https://linux22.com/image/788235/Windows%20%E4%B8%8A%E7%9A%84%20Apache%202.4%20%E5%AF%B9%E5%88%9D%E5%A7%8B%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%AF%B7%E6%B1%82%E7%9A%84%E5%93%8D%E5%BA%94%E5%BE%88%E6%85%A2.png)
我开始在我的网站上提供预压缩的 Brotli 文件https://www.filmfix.com/en/home/。它们可以工作;但从那时起,Apache 就一直存在响应问题全部VirtualHost 设置(不只是用于VirtualHost
提供这些预压缩的静态 HTML 文件。)
如果我在初始(非常慢)加载后立即单击,它通常会保持响应(或者如果我刚刚重新启动 Apache)——但如果我等待一会儿,它就会停止响应。并且可能需要 7 秒到 45 秒才能重新连接。有时它甚至会让浏览器超时,等待连接。
这可能是什么原因造成的?我该如何解决?
我的https://www.webpagetest.org结果如下。
我确实希望这与我不久前提出的问题无关:内部网络断开连接。
我发现了类似的问题stackoverflow.com这给了我更多的想法,但没有什么可以解决这个问题。
或者这是我自己造成的?我正在处理来自三个不同域名的 18 个异步调用批次,生成 HTML 页面,这些页面被最小化、预压缩并推送到其他服务器。此时 CPU 的使用率徘徊在 80% 左右。可能是我让 Apache 过载了?我们正在处理大约 5,000 个页面。
来自我的 httpd-default.conf 文件
Timeout 300
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 40
# reqtimeout module is disabled
#<IfModule reqtimeout_module>
# RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
#</IfModule>
以下是我观察到的不同浏览器症状:
Chrome 计时初始连接/SSL
...当连接挂起时我读到的内容:
(无信息)
Microsoft Edge 瀑布
...当连接挂起时我读到的内容:
正在建立安全连接...
FireFox 计时已阻止
...当连接挂起时我读到的内容:
执行 TLS 握手(我的静态.子域名)
或者
从 connect.facebook.net 传输数据
我发现有时 Blocked 的时间和 TLS Setup 时间差不多一样长:
我的设置
服务器:Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/8.1.10,我有 48GB 可用 RAM,CPU 是 i7-8700 @ 3.20GHz。
我的 DNS TTL 设置为 3 小时,因为我即将将文件重新定位到不同的服务器。
我的 httpd-ssl.conf 文件
SSLSessionCacheTimeout 300
SSLUseStapling Off
HostnameLookups Off
EnableSendfile Off
EnableMMAP Off
<VirtualHost *:443>
Protocols h2 h2c http/1.1
...
SSLEngine on
...
SSLHonorCipherOrder on
SSLProtocol ALL -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
</VirtualHost>
我尝试设置<VirtualHost *:443>
为<VirtualHost 0.0.0.0:443>
(我仅使用 IPv4),但没有帮助。
我关闭了防火墙,看看是否与防火墙有关,结果不是。
运行这个
openssl s_client -connect www.filmfix.com:443 -status -servername www.filmfix.com
返回此
CONNECTED(000001B8)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = *.my_domainname_dot_com
verify return:1
OCSP response: no response sent
---
Certificate chain
0 s:CN = *.my_domainname_dot_com
i:C = US, O = Let's Encrypt, CN = R3
1 s:C = US, O = Let's Encrypt, CN = R3
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
subject=CN = *.my_domainname_dot_com
issuer=C = US, O = Let's Encrypt, CN = R3
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 5026 bytes and written 406 bytes
Verification error: unable to get local issuer certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 4096 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 20 (unable to get local issuer certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: 3D6884662...
Session-ID-ctx:
Resumption PSK: 5EA6E2B7D...
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 ... 3i.
Start Time: 1691621025
Timeout : 7200 (sec)
Verify return code: 20 (unable to get local issuer certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: 9BFE3...
Session-ID-ctx:
Resumption PSK: 38FFBF004D...
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - a9 01 cb ... a2 40 ....)..d...!.4.@
Start Time: 1691621025
Timeout : 7200 (sec)
Verify return code: 20 (unable to get local issuer certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
httpd -D DUMP_RUN_CFG
C:\64bit\Apache24\bin>httpd -D DUMP_RUN_CFG
ServerRoot: "C:/64bit/Apache24"
Main DocumentRoot: "C:/64bit/htdocs"
Main ErrorLog: "E:/log-files/apache/error_.log"
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="C:/64bit/Apache24/logs/" mechanism=default
PidFile: "C:/64bit/Apache24/logs/httpd.pid"
Define: DUMP_RUN_CFG
任何帮助都将非常感激。
谢谢。
答案1
我已恢復正常。
我更新了 Apache — 从 2.4.39 升级到 2.4.57。
为了做到这一点,我必须首先确保 Visual C++ Redistributable 已更新:
您必须首先安装适用于 Visual Studio 2015-2022 x64 的 Visual C++ Redistributable。
下载并安装,如果您还没有这样做,请参见:
运行更新时我进行了修复,然后更新了 Apache。
使用与以前相同的 Apache 配置文件后,我的网站的外观和行为略有不同。
我还添加了默认索引文件
DirectoryIndex static_html/com___en___home.min.html.br
答案2
尝试了解速度缓慢是否是由于 SSL 协商速度缓慢造成的。
测试一下
命令:
curl -v -o result.txt --trace-time https://yourdomain.com
或者从 chrome 开发者工具 falls
这很可能是由于错误的配置导致 SSL 协商缓慢造成的。
如果是这样,解决方案如下: