架构

halo + docker + frp + nginx

网站在 window 系统下,通过 docker desktop 安装 halo,并通过 frp 内网穿透,将本地 halo 服务暴露到云服务器上,最后通过 nginx 代理实现通过域名访问本机 halo 服务搭建的个人博客网站。

实现步骤

1、windows 下 docker desktop 安装

1.1、安装流程

docker desktop 官网:Docker: Accelerated Container Application Development

下载 Download for Windows - AMD64(根据自己电脑系统决定)

运行程序进行安装,一直下一步即可。

修改 docker 安装位置。

1.2、安装报错

解决办法:

1、打开 C 盘,选择显示 “隐藏的项目”

2、删除 DockerDesktop 文件夹

3、以管理员身份运行 “Docker Desktop Installer.exe”

1.3、修改 docker disk image location 位置失败

1、打开 Windows 功能,勾选 “Hyper-V” 、“适用于 Linux 的 Windows 子系统”、“虚拟机平台”,然后重启系统。

win + R 打开运行窗口
输入:optionalfeatures

2、下载最新 WSL 镜像,并安装

下载地址:microsoft/WSL: Windows Subsystem for Linux 的 releases 中

2、docker desktop 中安装 halo

1、在 Docker Hub 中搜索下载 halo 镜像

2、在 Images 中创建 halo 容器,并配置

3、启动 Halo 容器

3、安装内网穿透工具 frp

下载地址 fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. 的 releases 中

下载两个安装包:frp_0.68.1_linux_amd64.tar.gzfrp_0.68.1_windows_amd64.zip

3.1、阿里云服务器安装 frps

1、解压 frp_0.68.1_linux_amd64.tar.gz,编辑 frps.toml 文件

# 进入root目录,解压文件
cd /root
tar -zxf frp_0.68.0_linux_amd64.tar.gz
cd frp_0.68.0_linux_amd64

# 编辑 frps.toml
vim frps.toml
# 文件内容如下,auth.token 是自己随机写的,也就是 frpc 连接的密码
bindPort = 7000
auth.token = "2a9286bfd0abf55c0a7a7d98a7fds98af6"

2、配置开机自启动服务

编辑文件:`vim /etc/systemd/system/frps.service` , 添加如下内容

[Unit]
Description=frp server
After=network.target
StartLimitIntervalSec=0
StartLimitBurst=0

[Service]
# /root/frp_0.68.0_linux_amd64 可以自定义自己文件所在位置
ExecStart=/bin/sh -c '/root/frp_0.68.0_linux_amd64/frps -c /root/frp_0.68.0_linux_amd64/frps.toml >> /var/log/frps.log 2>&1'
Restart=always
RestartSec=10


[Install]
WantedBy=multi-user.target

3、运行命令

# 依次运行下面的命令
systemctl daemon-reload
systemctl start frps
systemctl enable frps
systemctl status frps

# 查看启动日志,出现如下日志说明成功了
tail -100 /var/log/frps.log
2026-04-03 07:35:29.288 [I] [frps/root.go:115] frps uses config file: /root/frp_0.68.0_linux_amd64/frps.toml
2026-04-03 07:35:29.376 [I] [server/service.go:246] frps tcp listen on 0.0.0.0:7000
2026-04-03 07:35:29.376 [I] [frps/root.go:124] frps started successfully

3.2、本地 windows 安装 frpc

1、解压 frp_0.68.1_windows_amd64.zip,编辑 frpc.toml 文件

# serverAddr = 公网IP
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "2a9286bfd0abf55c0a7a7d98a7fds98af6"

[[proxies]]
name = "test-tcp-win"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9000
remotePort = 9090

2、配置开机自启动服务

官网 Releases · winsw/winsw下载文件 WinSW-x64.exe 到 frp 目录。

修改 “WinSW-x64.exe” 文件名为 “frpc-service.exe”

创建 “frpc-service.xml” 文件

<service>
  <id>frpc-service</id>
  <name>FRPC Service</name>
  <description>FRPC 客户端开机自启动服务</description>
  <workingdirectory>D:\work\env\frp\frp_0.68.1_windows_amd64\frp_0.68.1_windows_amd64</workingdirectory>

  
  <executable>D:\work\env\frp\frp_0.68.1_windows_amd64\frp_0.68.1_windows_amd64\frpc.exe</executable>
  <arguments>-c D:\work\env\frp\frp_0.68.1_windows_amd64\frp_0.68.1_windows_amd64\frpc.toml</arguments>
  
  <logpath>D:\work\env\frp\frp_0.68.1_windows_amd64\frp_0.68.1_windows_amd64\logs</logpath>
  <log mode="append" />

  <startmode>Automatic</startmode>
  <onfailure action="restart" delay="10sec"/>
  
</service>

命令行安装 frpc 服务

# 安装服务
.\frpc-service.exe install

# 启动服务
.\frpc-service.exe start

查看运行情况,可重启

win + R 打开运行窗口,输入 services.msc
上述步骤完成后,通过阿里云的公网IP加端口即可访问本机的Halo服务。

阿里云配置等相关内容参考其他网上资料,域名申请、配置等亦如此

4、通过 Nginx 代理实现 域名访问 Halo 服务

下载 Nginx

# 安装必备依赖,Alibaba Cloud Linux / CentOS
yum install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel -y

# 下载 Nginx
wget http://nginx.org/download/nginx-1.26.2.tar.gz

# 解压
tar -zxvf nginx-1.26.2.tar.gz

自定义编译配置

./configure \
--prefix=/JT/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_gzip_static_module

编译 & 安装

make && make install

配置开机自启动

vim /etc/systemd/system/nginx.service

[Unit]
Description=Nginx
After=network.target

[Service]
Type=forking
ExecStart=/JT/nginx/sbin/nginx
ExecReload=/JT/nginx/sbin/nginx -s reload
ExecStop=/JT/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

修改 /JT/nginx/conf/nginx.conf 文件

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
	listen 80;
  	server_name   blog.xxxxx.cn;

  	location / {
    		proxy_pass  http://127.0.0.1:8080;
    		proxy_set_header Host $host;
       		proxy_set_header X-Real-IP $remote_addr;
        	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        	proxy_set_header X-Forwarded-Host $host;

		# 1. 解决 strict-origin-when-cross-origin + Halo 接口 403/跨域
    		add_header Referrer-Policy "same-origin" always;
    		add_header Access-Control-Allow-Origin * always;
    		add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE always;
    		add_header Access-Control-Allow-Headers Content-Type,Authorization,X-Requested-With always;
  	}

  	if ($host ~* ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$) {
    		return 403;
  	}
   }
}

启动 nginx

systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
systemctl status nginx