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地址】
        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;                     # 跳过证书验证
    
            # 设置请求头,伪装成真实用户请求。【改成你自己的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是禁止缓存登录页,不缓存哪些你自己设置】、【代理地址改成你自己的博客源站访问地址+端口、地址,支持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/域名】
        # -------------------------
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2?)$ {
            expires 30d;
            access_log off;
            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;
        }
    
        # -------------------------
        # 错误码 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

    nginx -t && systemctl reload nginx

🔐 雷池 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;
    }


🌐 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;

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

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


文末

👇👇👇