nginx-cdn_00.avif

是不是也有朋友和我一样,搭了 Halo 博客后发现加载速度总是慢半拍?尤其源站 IP 还裸奔在公网,安全隐患让人睡不踏实。

我之前也试过各种优化方法,直到摸索出一套更适合个人站长的组合:雷池 WAF + Nginx 缓存中转。不靠贵价 CDN,也能让网站加速访问,还能彻底隐藏源站 IP、启用 HTTPS,提升安全性。

这篇教程就是我在实际部署过程中的完整记录,特别适合手上有公网 IP 的 NAS 用户,或者境内外服务器混合部署的朋友。全流程图文讲解,从架构设计到 Nginx 配置一步步带你走通,帮你把 Halo 博客速度和安全都提上去。

本教程基于我在真实项目中的搭建经验,分享如何使用中转云服务器+雷池 WAF,实现 Halo 博客的安全访问与内容加速。


🚀架构需求优化说明

  • 本项目中的 Halo 博客源站 部署在大陆本地 NAS,作为内容型网站,博客中含有大量图片资源,对访问速度和带宽提出较高要求。

  • 过去仅使用雷池 WAF 简单反代回源的方式,将请求从海外 WAF 转发回大陆源站,导致网络延迟明显、页面加载缓慢,严重影响用户体验。

  • 相比部署在云服务器,本地 NAS 更便于数据备份、管理与维护,也能避免公有云带宽不足、同步麻烦等问题。因此,我们希望保留本地部署的灵活性,同时通过多台中转云服务器实现反向同步访问,确保仅修改一个数据源即可完成多节点共享,加快全国各地的访问速度,提升 Halo 博客整体性能与稳定性。

  • 最终目标是:提升网站打开速度、提高访客留存率,同时保护源站 IP,不暴露于公网,为内容型博客打下高性能、高安全的基础架构。

🧩 架构逻辑(中转服务器 + 雷池 WAF 架构)

用户访问 www.aabcc.top
        ↓
DNS 解析到「香港雷池 WAF 公网 IP」
        ↓
雷池 WAF 监听 443 端口(HTTPS)
        ↓
WAF 自动转发请求到 中转服务器内网地址(如 10.0.20.5:444)
        ↓
中转服务器 Nginx 反向代理访问源站 Halo 博客(如 155.5.5.5:8888)
        ↓
Halo 博客响应页面内容
        ↓
中转服务器缓存 & 转发响应给雷池
        ↓
雷池 WAF 返回内容给用户浏览器

📌 补充说明


中转服务器 雷池 WAF:

  • 仅对外开放 80 / 443 端口;

  • 所有请求根据规则回源至中转服务器内网 IP + 端口(如:10.0.20.5:444);

  • 支持自定义 location 与 HTTPS 回源。


中转服务器:

  • 监听内网地址(如 10.0.20.5:444),不暴露公网;

  • 缓解源站压力、隐藏源站 IP;

  • 可缓存 Halo 内容,加速网站访问。


源站 Halo 博客:

  • 部署在大陆/任意可公网访问的服务器上;

  • 使用非标准端口(如 8888);

  • 不对公网暴露,靠中转服务器 + WAF 间接访问。


🧪 实验环境说明

Halo 博客源站:

  • Halo 博客部署在家庭NAS有公网 IP(或任何云服务器);

  • 通过雷池 WAF 反向代理到其他端口,添加 SSL 证书实现 HTTPS访问,路由器将反向代理后的端口映射出去,;

  • Halo 博客源站演示公网 IP:155.5.5.5


中转云服务器:

  • 香港、日本、美国等任意地区低价云服务器(2H2G 即可),可点击此处查看低价云服务器活动

  • 中转云服务器内网 IP 示例:10.0.20.5

  • 安装好雷池 WAF + Nginx;

  • 云防火墙放通 80、443 端口。


🧭 操作步骤详解

1️⃣ 在本地 NAS 搭建 Halo 博客(含雷池 WAF)

  • 搭建好你的Halo博客

  • 安装雷池WAF,申请好SSL域名证书,导入域名证书到雷池WAF。

  • 为Halo博客端口开启 SSL,设置只允许指定域名访问;

  • (可绑定DDNS)路由器映射对应端口,确保外部可通过 IP / 域名 访问Halo博客。


2️⃣ 中转服务器准备工作

  1. 演示在全新的Debian12系统上操作

  2. 首先确保你的中转云服务器80、443端口没有被占用

  3. 使用Docker安装好雷池WAF并导入需要使用的SSL域名证书

  4. 在你需要的路径下创建SSL证书文件夹并放入证书文件(本教程默认使用的是雷池WAF导入的自己申请的SSL证书)

    # 雷池WAF的默认SSL证书保存路径如下,实际的路径取决于你将雷池WAF安装在哪。
    
    /opt/SafeLine/resources/nginx/certs/
    
    #例如你只上传过一次SSL证书,那么证书的名字就是cert.crt和cert.key
    
    /opt/SafeLine/resources/nginx/certs/cert.crt
    /opt/SafeLine/resources/nginx/certs/cert.key
  5. 更新软件源

    apt update
  6. 安装vim工具

    apt install -y vim
  7. 安装nginx

    apt install -y nginx
  8. 启动Nginx

    sudo systemctl start nginx
    
    或者
    
    sudo service nginx start
  9. 检查 nginx 服务状态,确认是否启动成功。

    systemctl status nginx

3️⃣ 创建缓存目录 & 授权

  1. 创建Nginx缓存文件夹

    # 可将halo_cache换成你喜欢的文件名,此处更改后后面的就要保持一致。
    
    mkdir -p /var/cache/nginx/halo_cache
  2. 授权Nginx缓存文件夹

    chown -R www-data:www-data /var/cache/nginx/halo_cache

4️⃣ 查看局域网 IP

  1. 查看中转服务器的局域网IP地址

    # 演示使用的中转云服务器的局域网IP地址是10.0.20.5,部分云服务器无局域网IP,只有公网IP。
    
    ip a

5️⃣ 创建反代缓存配置文件

  1. 编辑创建一个反代缓存配置文件

    # 可将halo_proxy.conf换成你自己想用的名称,更改后自己记住即可。
    
    vim /etc/nginx/conf.d/halo_proxy.conf
  2. 按字母i键进入编辑模式,复制并修改下面的配置文件,粘贴到终端,按Esc键退出编辑模式,输入:wq保存并退出。

    (排版太挤的就先粘贴到文本文件内,修改后再使用,灵活应变。)

    # =========================
    # ① HTTP 请求跳转到 HTTPS【将www.aabcc.top改成你自己想要绑定的缓存加速域名】
    # =========================
    server {
        listen 80;
        server_name www.aabcc.top;
    
        # 🔁 所有 http:// 请求强制跳转到 https://
        # ⚠️ 实际的 HTTPS 入口由雷池 WAF 监听并管理
        return 301 https://$host$request_uri;
    }
    
    # =========================
    # ② HTTPS 回源服务(供雷池 WAF 使用)
    # =========================
    server {
        # ⚠️ 此端口为雷池回源使用,非对公网开放【将10.0.20.5改成你自己的中转云服务器的局域网IP地址(无局域网IP的填写公网IP)】【将www.aabcc.top改成你自己想要绑定的缓存加速域名】
        listen 10.0.20.5:444 ssl http2;
        server_name www.aabcc.top;
    
        # 📜 SSL 证书路径(仅用于雷池连接 Nginx 回源时验证)【将cert.crt和cert.key的SSL证书路径改成你自己实际的。】
        ssl_certificate     /opt/SafeLine/resources/nginx/certs/cert.crt;
        ssl_certificate_key /opt/SafeLine/resources/nginx/certs/cert.key;
    
        # ⚡ 启用 gzip 提高传输效率
        gzip on;
        gzip_types text/css application/javascript application/json image/svg+xml;
    
        # -------------------------
        # 反向代理主入口(启用缓存)
        # -------------------------
        location / {
            proxy_pass https://155.5.5.5:8888;   # 源站地址(Halo 博客)【改成你自己的博客源站访问地址+端口,支持IP/域名,注意http/https协议区分】
            proxy_ssl_verify off;                     # 跳过源站 SSL 证书验证
    
            # 设置请求头,传递真实客户端信息到源站【改成你自己的Halo博客源站访问地址,支持IP/域名】
            proxy_set_header Host 155.5.5.5;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    
            # 🚀 启用缓存,减少对源站的访问频率
            proxy_cache halo_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    
            # 返回是否命中缓存的状态
            add_header X-Cache-Status $upstream_cache_status;
        }
    
        # -------------------------
        # 后台路径(目前启用缓存,如果禁用将无法通过域名地址进行登陆。)【/console是Halo博客系统登录页,不缓存哪些你自己设置】、【代理地址改成你自己的博客源站访问地址+端口、地址,支持IP/域名】
        # 若需要禁用缓存,可取消注释下方两行
        # -------------------------
        location ^~ /console {
            proxy_pass https://155.5.5.5:8888;
            proxy_ssl_verify off;
            proxy_set_header Host 155.5.5.5;
    
            # ❌ 默认开启缓存
            # ✅ 如需禁用前面指定页面的缓存,请取消下面两行注释
            # proxy_no_cache 1;
            # proxy_cache_bypass 1;
        }
    
        # -------------------------
        # 静态资源路径(长期缓存,提升访问速度,这些文件上缓存在用户浏览器和中转服务器上。)【改成你自己的博客源站访问地址+端口/地址,支持IP/域名】
        # 支持现代图片格式、字体、JS/CSS 等资源的缓存,需要哪些格式的自行扩展即可(精简版:js|css|png|jpg|jpeg|gif|ico|svg|webp|avif|woff2?)
        # -------------------------
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|avif|bmp|heic|woff2?|ttf|eot|otf|json|mp4|webm|mkv|zip|rar|7z|tar|gz|pdf|docx|pptx|xlsx|csv|xml|yml|yaml|md|mp3|ogg|wav|txt)$ {
            expires 30d;                   # 客户端缓存 30 天
            access_log off;               # 不记录访问日志,减少磁盘IO
            proxy_pass https://155.5.5.5:8888;
            proxy_ssl_verify off;
            proxy_set_header Host 155.5.5.5;
            proxy_cache halo_cache;
            proxy_cache_valid 200 30d;      # 缓存 200 响应 30 天
        }
    
        # -------------------------
        # 错误码 497 修复(http 误发到 https 端口)
        # -------------------------
        error_page 497 https://$host$request_uri;
    }

6️⃣ 替换默认 nginx 配置

  1. 先删除默认初始的Nginx配置

    rm /etc/nginx/nginx.conf
  2. 编辑nginx配置

    vim /etc/nginx/nginx.conf
  3. 按字母i键进入编辑模式,复制并修改下面的配置文件,粘贴到终端,按Esc键退出编辑模式,输入:wq保存并退出。

    (排版太挤的就先粘贴到文本文件内,修改后再使用,灵活应变。)

    # 指定 nginx 运行用户,推荐使用权限较低的 www-data 用户
    user www-data;
    
    # 自动根据 CPU 核心数调整工作进程数,提升并发处理能力
    worker_processes auto;
    
    # 存放 nginx 进程 ID 文件的路径,方便管理 nginx 进程
    pid /run/nginx.pid;
    
    # 事件模块配置,定义工作连接数等参数
    events {
        # 单个 worker 进程允许的最大连接数(包括客户端和后端连接)
        worker_connections 1024;
    }
    
    # HTTP 服务配置
    http {
        # 配置代理缓存路径及参数
        # /var/cache/nginx/halo_cache :缓存文件存放路径
        # levels=1:2 :缓存目录分层级数,避免单目录文件过多
        # keys_zone=halo_cache:50m :缓存区域名称和共享内存大小(50MB,用于缓存元数据)
        # max_size=2g :最大缓存容量,超过自动删除旧文件
        # inactive=60m :60分钟内未被访问的缓存文件会被清理
        # use_temp_path=off :关闭临时路径,缓存直接写入正式目录,提升性能
        proxy_cache_path /var/cache/nginx/halo_cache levels=1:2 keys_zone=halo_cache:50m max_size=2g inactive=60m use_temp_path=off;
    
        # 加载 MIME 类型映射文件,支持常见文件类型的 Content-Type 头设置
        include /etc/nginx/mime.types;
    
        # 默认的 MIME 类型,未匹配到类型时使用
        default_type application/octet-stream;
    
        # 开启高效文件传输机制,减少内核与用户空间切换,提升性能
        sendfile on;
    
        # 保持长连接的超时时间,单位秒,避免频繁建立连接的开销
        keepalive_timeout 65;
    
        # 启用 gzip 压缩,提高传输效率,减少带宽占用
        gzip on;
    
        # 指定 gzip 压缩的内容类型(文本和 JSON 等常见静态资源)
        gzip_types text/css application/javascript application/json image/svg+xml;
    
        # 包含其他配置文件,通常是 sites-enabled 及 conf.d 中的具体服务配置
        include /etc/nginx/conf.d/*.conf;
    }

7️⃣ 测试并重载配置

  1. 测试配置是否有语法错误

    nginx -t
  2. 如果输出为下面这样的,说明配置语法正确,可以继续。

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
  3. 重新加载 Nginx 使配置生效

    systemctl reload nginx
  4. 如果你使用的是非 systemd 系统或手动安装的 Nginx,也可以使用:

    nginx -s reload

🔐 雷池 WAF 设置

  1. 雷池WAF > 通用设置 > 添加证书,添加你的域名 SSL 证书;

  2. 点击【防护应用】>【添加应用】;

  3. 编辑应用,参考下图进行设置后点击提交。
    域名:你允许使用哪个域名访问这个中转服务器就添加哪个(演示测试额外添加了test.aabcc.top这个临时二级域名)
    端口:填写443,勾选SSL。(因为HTTP的80端口被Nginx占用,我们只添加HTTPS协议的443端口)
    证书:选择你添加的域名证书(要和你设置的域名匹配,否则证书不符,无法访问。)
    上游服务器:填写你中转服务器的局域网IP地址+反向代理缓存的端口(HTTPS协议)
    上游服务器的健康检查:随意


⚙️ 自定义配置中添加 301 强制跳转:

  1. 添加完之后点击 高级配置 > 下拉到底部

  2. 在底部的自定义 NGINX 配置中粘贴下面的代码,实现HTTP强制永久301重定向到HTTPS。

    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }

  3. 也可以设置🌐 通配所有非 www 的子域名跳转到 www(建议提前配置好域名证书):

    if ($host ~* ^(?!www\.)(.+)) {
        return 301 https://www.$host$request_uri;
    }

🌐 DNS 设置(以 CloudFlare 为例)

  • 在CloudFlare上添加你的DNS域名解析,将A记录解析到你的中转服务器上,有多少个中转服务器都可以添加上去。

  • 下面的解析主机名,根据你的需求设置。

    DNS解析类型

    主机名

    值(IP)

    代理状态

    A

    www

    中转服务器公网IP

    ⛅ 关闭代理

    A

    @

    中转服务器公网IP

    ⛅ 关闭代理

⚠️ 注意事项:

  • 必须关闭 Cloudflare 的小云朵(代理)功能;

  • 否则雷池无法正确处理 SSL,无法识别真实 IP。


✅ 测试效果验证

中转服务器上测试:

curl -k -I https://10.0.20.5:444 -H "Host: www.aabcc.top"

# 返回结果应为
HTTP/2 200

在本地电脑上测试(CMD窗口上即可):

curl -k -I https://155.5.5.5:444 -H "Host: www.aabcc.top"

# 返回结果应为(防火墙/安全组没放行444端口就不会有返回结果)
HTTP/1.1 200 OK

测试 301 跳转:

  1. 测试301永久跳转的http自动跳转到https(演示测试额外添加了test.aabcc.top这个临时二级域名)

    curl -I http://test.aabcc.top
    
    # 返回结果应返回 301 跳转到 https://test.aabcc.top 说明你的 Nginx 中的 80 端口监听和跳转配置正常生效了。
    HTTP/1.1 301 Moved Permanently
    Location: https://test.aabcc.top/

🧱 安全防护设置

安装 iptables 工具:

  1. 安装iptables-persistent 工具,输入Y然后按回车键确定,连着弹出两个选项直接按回车键确认。

    apt install iptables-persistent
  2. 不想用命令的也可以安装(服务器配置好的可选)1Panel面板,使用firewall防火墙,直接WEB页面可视化操作。


情况一:中转服务器有内网 IP

  • 假设中转服务器公网IP是 155.5.5.5,想禁止公网访问444端口,只允许内网或者本机访问。
    可按需求选择下面的一条命令执行

    # 允许本机访问
    iptables -A INPUT -p tcp -s 127.0.0.1 --dport 444 -j ACCEPT
    
    # 允许内网IP访问(假设内网网段为10.0.0.0/8)
    iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 444 -j ACCEPT
    
    # 拒绝其他所有IP访问444端口
    iptables -A INPUT -p tcp --dport 444 -j DROP

情况二:中转服务器无内网 IP

  • 假设中转服务器公网IP是 155.5.5.5,想禁止通过中转服务器的共IP+444端口访问。
    按照下面的顺序执行

    # ✅ 允许雷池 WAF 的 IP 访问,将155.5.5.5换成你自己实际的中转服务器公网IP。
    iptables -A INPUT -p tcp -s 155.5.5.5 --dport 444 -j ACCEPT
    
    # ❌ 拒绝其他所有来源访问 444(必须放在最后)
    iptables -A INPUT -p tcp --dport 444 -j DROP

🔒 建议:保存规则

  1. 以上设置完之后执行命令保存

    # 保存当前规则,重启不会失效。
    
    iptables-save > /etc/iptables/rules.v4
  2. 现在通过配置雷池 WAF 仅监听 443 端口的 HTTPS 请求,并限制只允许特定域名访问,中转服务器的 443 端口将只对受信域名开放。这样可以有效阻止通过 IP 地址或未授权域名访问中转服务器,进一步提升网站的安全性与访问控制精度。


📌 总结

通过雷池 WAF + Nginx 缓存中转架构,你可以实现以下目标:

  • ✅ 隐藏博客源站 IP,提升安全性;

  • ✅ 开启内容缓存,加速页面访问;

  • ✅ 实现全链路 HTTPS;

  • ✅ 控制来源,仅允许通过指定域名访问。

  • ✅ 如果有其他闲置的云服务器可照抄此教程,打造环大陆网站加速。


文末

👇👇👇