Windows 上的 Apache 2.4 对初始第一个请求的响应很慢

Windows 上的 Apache 2.4 对初始第一个请求的响应很慢

我开始在我的网站上提供预压缩的 Brotli 文件https://www.filmfix.com/en/home/。它们可以工作;但从那时起,Apache 就一直存在响应问题全部VirtualHost 设置(不只是用于VirtualHost提供这些预压缩的静态 HTML 文件。)

如果我在初始(非常慢)加载后立即单击,它通常会保持响应(或者如果我刚刚重新启动 Apache)——但如果我等待一会儿,它就会停止响应。并且可能需要 7 秒到 45 秒才能重新连接。有时它甚至会让浏览器超时,等待连​​接。

这可能是什么原因造成的?我该如何解决?

我的https://www.webpagetest.org结果如下。 websitetest.org 结果

我确实希望这与我不久前提出的问题无关:内部网络断开连接

我发现了类似的问题stackoverflow.com这给了我更多的想法,但没有什么可以解决这个问题。

或者这是我自己造成的?我正在处理来自三个不同域名的 18 个异步调用批次,生成 HTML 页面,这些页面被最小化、预压缩并推送到其他服务器。此时 CPU 的使用率徘徊在 80% 左右。可能是我让 Apache 过载了?我们正在处理大约 5,000 个页面。

CPU使用率

来自我的 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

...当连接挂起时我读到的内容:

(无信息)

Chrome 计时


Microsoft Edge 瀑布

...当连接挂起时我读到的内容:

正在建立安全连接...

微软Edge


FireFox 计时已阻止

...当连接挂起时我读到的内容:

执行 TLS 握手(我的静态.子域名)

或者

从 connect.facebook.net 传输数据

FireFox 计时已阻止

我发现有时 Blocked 的时间和 TLS Setup 时间差不多一样长:

TLS 设置时间


我的设置

服务器: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。

下载并安装,如果您还没有这样做,请参见:

https://www.apachelounge.com/download/

运行更新时我进行了修复,然后更新了 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 协商缓慢造成的。

如果是这样,解决方案如下:

https://stackoverflow.com/a/78247758/14938811

相关内容