文章背景图

腾讯云 Ubuntu 服务器从零搭建 Halo 2.0 博客指南 (Docker + Nginx + SSL)

2026-01-22
53
-
- 分钟
|

前言

最近入手了一台腾讯云的 Ubuntu 服务器(LightHouse/CVM),决定用它来搭建一个动态博客。经过对比,我选择了 Halo 2.0

Halo 是一款基于 Java 的强大开源博客系统,生态丰富,界面美观。配合国内服务器,访问速度极快。

本文将详细记录从环境配置、Docker 部署、Nginx 反向代理到 HTTPS 证书申请的全过程。即使你是 Linux 小白,跟着操作也能搞定。

🛠️ 准备工作

  1. 服务器:腾讯云 Ubuntu 20.04 或 22.04 (建议 2核 2G 内存及以上)。

  2. 域名:已经购买并解析到服务器公网 IP(本文以 blog.bennielab.cloud 为例)。

  3. 工具:SSH 连接工具(如 Termius, Xshell 或 VS Code)。


第一步:基础环境与 Docker 配置

国内服务器部署 Docker 最常见的问题就是拉取镜像超时。我们必须利用腾讯云的内网优势进行加速。

1.1 更新系统与安装基础工具

首先确保系统软件是最新的:

sudo apt update && sudo apt upgrade -y
sudo apt install curl git vim -y

1.2 安装 Docker

使用官方脚本一键安装:

curl -fsSL https://get.docker.com | bash

1.3 配置腾讯云内网镜像加速 (关键一步) 🚀

为了解决 context deadline exceeded (连接超时) 错误,我们需要配置镜像源。

直接复制下面整段命令执行:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ]
}
EOF

1.4 启动 Docker

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker  # 设置开机自启

第二步:使用 Docker Compose 部署 Halo

官方推荐使用 Docker Compose 来管理 Halo,这样方便日后升级和数据维护。

更多内容可以查阅 Halo 文档

2.1 创建工作目录

我们在用户目录下创建一个专门存放 Halo 配置的文件夹:

mkdir -p ~/halo && cd ~/halo

2.2 编写 docker-compose.yaml

创建配置文件:

nano docker-compose.yaml

将以下内容粘贴进去(Halo + PostgreSQL):

version: "3"

services:
  halo:
    image: registry.fit2cloud.com/halo/halo-pro:2.22
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./halo2:/root/.halo2
    ports:
      - "8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    environment:
      # JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
  halodb:
    image: postgres:15.4
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=openpostgresql
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo

networks:
  halo_network:

Ctrl+O 回车保存,按 Ctrl+X 退出。

2.3 启动 Halo

docker compose up -d

启动后,Halo 默认运行在 8090 端口。此时如果不做反向代理,你需要通过 http://IP:8090 访问。


第三步:配置 Nginx 反向代理

为了使用域名访问,我们需要配置 Nginx。

3.1 安装 Nginx

sudo apt install nginx -y

3.2 创建站点配置文件

不要直接修改 nginx.conf 主文件,最好在 conf.d 目录下为每个网站单独建立配置文件。

sudo nano /etc/nginx/conf.d/halo.conf

写入以下配置:

# 定义 Halo 的上游地址
upstream halo {
    server 127.0.0.1:8090;
}

server {
    listen 80;
    listen [::]:80;
    
    # 将此处改为你的实际域名
    server_name blog.bennielab.cloud;

    # 调大上传文件大小限制
    # Halo 后台上传主题或备份文件可能很大,默认 1M 肯定不够,这里设置为 1GB
    client_max_body_size 1024m;

    location / {
        proxy_pass http://halo;
        
        # 标准的反向代理头信息,确保 Halo 能获取正确的客户端 IP
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

3.3 检查并生效

sudo nginx -t   # 检查语法是否正确
sudo systemctl reload nginx

第四步:配置 HTTPS (SSL 证书)

现在网站只能通过 HTTP 访问,不仅不安全,浏览器还会提示警告。我们使用 Certbot 免费申请 Let's Encrypt 证书。

4.1 安装 Certbot

sudo apt install python3-certbot-nginx -y

4.2 申请证书

# 请将域名换成你的
sudo certbot --nginx -d blog.bennielab.cloud

交互提示:

  1. 输入邮箱(用于接收证书过期提醒)。

  2. 输入 Y 同意服务条款。

  3. Certbot 会自动修改上面的 halo.conf,添加 SSL 配置并开启 HTTP -> HTTPS 强制跳转。

至此,打开浏览器访问 https://blog.bennielab.cloud,你应该能看到 Halo 的初始化界面了!🎉


📝 进阶知识:Nginx 虚拟主机的妙用

这台服务器搭建完 Halo 后,性能还绰绰有余。如果我们想再部署一个 Alist 网盘 或者 ChatGPT Web 怎么办?

这时候就体现出 Nginx 虚拟主机 (Virtual Host) 的强大了。我们不需要再买服务器,只需要复用 Nginx:

  1. Docker 运行新服务:例如 Alist 运行在 5244 端口。

  2. DNS 解析:添加二级域名,如 pan.bennielab.cloud 解析到同一 IP。

  3. 新建 Nginx 配置

    新建 /etc/nginx/conf.d/pan.conf,将域名改为 pan...,端口改为 5244

  4. 申请证书:再次运行 Certbot。

一台服务器,通过 Nginx 分发,可以挂载无数个二级域名网站,互不干扰。


希望这篇教程能帮助大家快速搭建属于自己的博客。如果有问题,欢迎留言交流!

评论交流

文章目录