AI摘要

本文介绍了如何通过Nginx和FastCGI缓存、浏览器缓存、Gzip压缩等技术优化Typecho博客的性能。优化后,页面加载速度显著提升,服务器负载降低,带宽消耗减少。文章提供了详细的Nginx配置示例,包括FastCGI页面缓存、浏览器缓存、Gzip压缩和缓存状态验证等,以实现网站性能的优化。

概述

随着网站内容不断增加,访问量上升,未优化的动态博客系统容易出现以下问题:
  1. 页面加载慢
    每次请求都需要 PHP-FPM 解析模板和数据库查询,尤其是首页、文章页访问量大时,响应延迟明显。
  2. 服务器负载高
    大量重复访问同一页面会频繁调用 PHP 和 MySQL,导致 CPU、内存和数据库压力增加。
  3. 带宽消耗大
    静态资源(CSS、JS、图片)每次请求都传输,会占用大量带宽。

通过 Nginx + FastCGI 缓存 + 浏览器缓存 + Gzip 压缩 可以显著优化性能:

  • FastCGI 缓存:将动态页面缓存到磁盘,减少 PHP 调用,提高响应速度。
  • 浏览器缓存:静态资源缓存到用户浏览器,避免重复下载。
  • Gzip 压缩:减小传输体积,加快页面加载。
  • 缓存状态可视化:通过响应头和 Nginx 状态页,可实时监控缓存命中率(HIT/MISS)。

先看优化前后效果对比


页面访问速度(未启用缓存)

  • 首页:www.hxy.bj.cn
  • 平均响应时间:2.23 秒
  • PHP-FPM 与数据库请求频繁
  • 静态资源每次都重新加载
  • 服务器 CPU 和带宽占用高

页面访问速度(启用 Nginx + FastCGI 缓存)

  • 首页:www.hxy.bj.cn
  • 平均响应时间:202 毫秒
  • 页面缓存命中率高(HIT)
  • 静态资源浏览器缓存,重复请求速度极快
  • PHP-FPM 与数据库压力大幅下降
  • 用户体验显著提升

Nginx配置优化策略

优化方式说明效果
FastCGI 缓存将动态页面缓存到磁盘,减少每次请求对 PHP-FPM 的调用提高响应速度,减少服务器 CPU 和数据库压力
浏览器缓存静态资源(CSS、JS、图片)缓存到用户浏览器避免重复下载,提升重复访问速度,降低带宽占用
Gzip 压缩对文本类型资源进行压缩(HTML、CSS、JS 等)减小传输体积,加快页面加载
缓存状态可视化通过响应头(X-Cache-Status)和 Nginx 状态页(/cache_status)监控缓存命中率可实时查看 HIT/MISS,优化缓存策略,提高系统可维护性

全局缓存配置

缓存类型分为两类:

  1. FastCGI 页面缓存(动态 PHP 页面)
  2. 浏览器缓存(静态资源 CSS/JS/图片等)
1. FastCGI 页面缓存(磁盘缓存)

配置示例(放在 server 外部,全局生效):

fastcgi_cache_path /data/nginx/typecho_cache levels=1:2 keys_zone=TYPECHO_CACHE:100m inactive=10m max_size=5g;
  • /data/nginx/typecho_cache:缓存文件存放目录,需提前创建
  • levels=1:2:目录层级结构
  • keys_zone=TYPECHO_CACHE:100m:共享内存区域存放缓存元数据,100MB
  • inactive=10m:缓存超过 10 分钟未访问即过期
  • max_size=5g:磁盘缓存最大容量
⚠️ 注意:目录 /data/nginx/typecho_cache 必须可写,并且 Nginx 用户拥有权限。
2.浏览器缓存(静态资源)
location ~* \.(?:ico|css|js|gif|jpe?g|png|webp|svg|woff2?|ttf|eot)$ {
    expires 7d;
    add_header Cache-Control "public";
    try_files $uri $uri/ =404;
    access_log off;
}
  • expires 7d:浏览器缓存有效期 7 天
  • Cache-Control: public:允许缓存共享
  • 避免访问日志产生大量静态资源记录

主站动态页面缓存配置

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

    fastcgi_cache TYPECHO_CACHE;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_valid 200 1h;
    fastcgi_cache_valid 404 1m;
    fastcgi_cache_use_stale error timeout updating http_500 http_503;

    # 后台、登录页不缓存
    set $no_cache 0;
    if ($request_uri ~* "/admin|/login") {
        set $no_cache 1;
    }
    fastcgi_no_cache $no_cache;
    fastcgi_cache_bypass $no_cache;

    add_header X-Cache-Status $upstream_cache_status;
}

说明:

  • fastcgi_cache_valid 200 1h:200 页面缓存 1 小时
  • fastcgi_cache_use_stale:在源服务器异常时,使用过期缓存返回响应
  • $no_cache:后台和登录页面不缓存,保证安全
  • X-Cache-Status:响应头显示缓存状态(HIT / MISS / BYPASS)

访问速度优化

1.Gzip 压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 5;
gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml;
gzip_vary on;
  1. 压缩传输内容,减小网络带宽
  2. zip_vary on:支持代理缓存
  3. 浏览器缓存:静态资源缓存 7 天
  4. FastCGI 缓存:动态页面缓存,减少 PHP-FPM 调用
  5. 禁用后台、登录缓存:保证用户安全

缓存状态验证

1.Nginx 状态页(仅本机访问)
location = /cache_status {
    stub_status;
    access_log off;
    allow 127.0.0.1;
    deny all;
}
  • 访问 http://127.0.0.1/cache_status 可查看 Nginx 活跃连接、请求数
  • 结合 X-Cache-Status 响应头可验证缓存命中
2.验证缓存命中示例
curl -Ik https://www.hxy.bj.cn/ --insecure
# Response header:
# x-cache-status: HIT

禁用敏感访问

location ~ /\.ht {
    deny all;
}
  • 阻止 .htaccess 等敏感文件访问
  • 增强安全性

总结

通过以上配置:

  1. 静态资源浏览器缓存 7 天
  2. PHP 页面缓存 1 小时
  3. 后台与登录页不缓存
  4. 响应头显示缓存命中状态,方便调试
  5. 支持 Gzip 压缩,提高访问速度
  6. 安全头设置增强 HTTPS 安全
⚡ 实测:页面缓存 HIT 时,访问时间明显缩短,减轻 PHP-FPM 负载,提高网站整体性能。

Nginx完整配置

# ---------------------------
# 全局缓存配置(必须放在 server 外部)
# ---------------------------
fastcgi_cache_path /data/nginx/typecho_cache levels=1:2 keys_zone=TYPECHO_CACHE:100m inactive=10m max_size=5g;

server {
    listen 80;
    server_name example.com;
    # 所有 HTTP 请求重定向到 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    # ---------------------------
    # SSL 配置
    # ---------------------------
    ssl_certificate /path/to/cert.pem;        # 证书文件
    ssl_certificate_key /path/to/key.key;     # 私钥文件
    ssl_trusted_certificate /path/to/chain.pem; # 中间证书
    ssl_protocols TLSv1.2 TLSv1.3;            # 支持的 TLS 协议
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

    # ---------------------------
    # 安全响应头
    # ---------------------------
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;

    # ---------------------------
    # 网站根目录和默认首页
    # ---------------------------
    root /var/www/html/typecho;
    index index.php index.html index.htm;

    # ---------------------------
    # Gzip 压缩配置
    # ---------------------------
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 5;
    gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml;
    gzip_vary on;

    # ---------------------------
    # Nginx 状态页(仅允许本机访问)
    # ---------------------------
    location = /cache_status {
        stub_status;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }

    # ---------------------------
    # 静态资源浏览器缓存
    # ---------------------------
    location ~* \.(?:ico|css|js|gif|jpe?g|png|webp|svg|woff2?|ttf|eot)$ {
        expires 7d;                          # 缓存时间 7 天
        add_header Cache-Control "public";    # 浏览器可缓存
        try_files $uri $uri/ =404;
        access_log off;
    }

    # ---------------------------
    # 主站动态请求(PHP 页面缓存)
    # ---------------------------
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # ---------------------------
        # 启用 FastCGI 缓存
        # ---------------------------
        fastcgi_cache TYPECHO_CACHE;
        fastcgi_cache_key "$scheme$request_method$host$request_uri";  
        fastcgi_cache_valid 200 1h;      # 200 页面缓存 1 小时
        fastcgi_cache_valid 404 1m;      # 404 页面缓存 1 分钟
        fastcgi_cache_use_stale error timeout updating http_500 http_503;

        # ---------------------------
        # 后台和登录页面不缓存
        # ---------------------------
        set $no_cache 0;
        if ($request_uri ~* "/admin|/login") {
            set $no_cache 1;
        }
        fastcgi_no_cache $no_cache;
        fastcgi_cache_bypass $no_cache;

        # ---------------------------
        # 响应头显示缓存命中状态
        # ---------------------------
        add_header X-Cache-Status $upstream_cache_status;
    }

    # ---------------------------
    # 禁止访问敏感文件
    # ---------------------------
    location ~ /\.ht {
        deny all;
    }
}

正文到此结束
最后修改:2025 年 08 月 13 日
如果觉得我的文章对你有用,请随意赞赏