Akemi

基于ECS的网站访问速度与nginx优化

2025/02/19

最近给博客上了个人的ssl证书,但是配了https之后,反而访问速度更加慢了

通过阿里云的一次性拨测工具,测试全国各节点对于我的网站的访问速度,发现首包时间与下载时间比较长,加起来甚至能达到20000毫秒以上

使用cdn

CDN(内容分发网络) 的主要目的通常是 加速网站访问,但如果配置不当或场景不匹配,也可能导致访问速度变慢。

比如国内的网站不要使用cloudflare接管,老老实实用阿里云或者腾讯云,不然不仅慢的一批,有时候还连不上,甚至不如github page

TLS握手开销

HTTPS 在建立连接时需要进行 TLS 握手,涉及非对称加密计算(如 RSA、ECDHE),首次访问会多出 1-2 RTT(往返时间)

  • 启用 TLS 会话恢复
1
2
3
ssl_session_cache shared:SSL:50m; # 共享会话缓存
ssl_session_timeout 1h; # 会话超时时间设为 1 小时
ssl_session_tickets on; # 启用 TLS 会话票证(减少服务端负担)
  • 使用更高效的密钥交换算法

优先选择 ECDHE-ECDSAECDHE-RSA,避免使用 RSA 密钥交换(性能更低)。

  • 开启 OCSP Stapling

避免客户端单独验证证书状态,减少延迟:

1
2
3
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;

加密算法选择

过时的加密套件(如 CBC 模式)或低效的算法会增加 CPU 负载。

  • 优先使用 AES-GCM(支持硬件加速)和 ChaCha20-Poly1305(适合移动设备):
1
2
ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384";
ssl_prefer_server_ciphers on;
  • 禁用不安全的算法(如 SSLv3、TLS 1.0/1.1)

只使用TLS1.2和1.3的算法

1
ssl_protocols TLSv1.2 TLSv1.3;

HTTP/2 支持

HTTP/2 的多路复用和头部压缩可显著提升速度。

1
listen 443 ssl http2; # 添加 http2 标识

安全头(Security Headers)

影响:添加安全头(如 Content-Security-PolicyX-Frame-Options)通常只会增加几百字节的响应头大小,对速度影响微乎其微。

建议:合并重复的头设置,避免嵌套多次 add_header。精简 CSP 策略,避免过度限制导致额外请求。

推荐的nginx模板(我现在使用的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 443 ssl http2;
server_name akemi.zj.cn;

ssl_certificate /home/git/ssl/akemi.zj.cn.pem;
ssl_certificate_key /home/git/ssl/akemi.zj.cn.key;

# 性能优化
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1h;
ssl_session_tickets on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384";
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;

# 安全头
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval';" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}

优化完成前都是红的一圈,优化完成后都是绿的了

CATALOG
  1. 1. 使用cdn
  2. 2. TLS握手开销
  3. 3. 加密算法选择
  4. 4. HTTP/2 支持
  5. 5. 安全头(Security Headers)
  6. 6. 推荐的nginx模板(我现在使用的)