VPSKnow

零代码快速建站指南:WordPress 与 Halo 实战

初级
20分钟

建一个博客或官网不需要写代码。WordPress 占据全球 43% 的网站份额,Halo 是国内开发者精心打造的现代博客系统——两者都能通过 Docker 在 VPS 上 10 分钟内跑起来。本指南带您从零完成部署,并配置好 HTTPS 和基础安全防护,让网站正式上线。

🗺️ 建站方式选择指南

在动手之前,先根据自己的需求选对工具,避免走弯路。

方案 难度 最低配置 核心优势 适合场景
WordPress ⭐ 初级 1C 1GB 插件/主题生态最丰富,全球最多资料 博客、企业官网、电商、社区
Halo 2.x ⭐ 初级 1C 1GB 国产现代博客,UI 精美,中文社区活跃 个人博客、技术博客、作品展示
Ghost ⭐⭐ 中级 1C 1GB 专注写作,内置会员/付费功能 付费订阅内容创作者
Hexo/Hugo ⭐⭐ 中级 任意 静态生成,速度极快,0 服务器压力 技术博客(需要懂 Git)
1Panel 面板 ⭐ 初级 1C 1GB 图形化一键安装 WordPress 等,省去 Compose 步骤 完全不想手写命令的新手

💡 选不定就选 WordPress——全球 4 亿+ 网站在用,遇到任何问题网上都能找到解决方案。如果您主要写中文博客且追求界面美观,Halo 是更现代的选择。本指南两套方案均提供完整部署步骤。

🟦 WordPress:Docker 一键部署

使用 Docker Compose 部署 WordPress,相比传统 LAMP 方式更干净、更易迁移,数据全部持久化在卷中,重建容器不丢数据。

第一步:创建 docker-compose.yml

/opt/wordpress/docker-compose.yml
# 文件路径:/opt/wordpress/docker-compose.yml
# 使用前先创建目录:mkdir -p /opt/wordpress && cd /opt/wordpress

services:

  # ── MySQL 数据库 ────────────────────────────────────────────────────────────
  db:
    image: mysql:8.0
    container_name: wp-mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}   # 在 .env 文件中设置
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql    # 数据库文件持久化
    networks:
      - wp-net

  # ── WordPress 主程序 ────────────────────────────────────────────────────────
  wordpress:
    image: wordpress:latest
    container_name: wordpress
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "127.0.0.1:8080:80"    # 只绑定本地,通过 Nginx 反代对外提供 HTTPS
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_TABLE_PREFIX: wp_
    volumes:
      - wp_data:/var/www/html   # WordPress 文件持久化(主题/插件/上传文件)
    networks:
      - wp-net

volumes:
  db_data:
  wp_data:

networks:
  wp-net:

第二步:创建 .env 密码文件

/opt/wordpress/.env
# 文件路径:/opt/wordpress/.env
# 密码不要提交到 Git!

MYSQL_ROOT_PASSWORD=请替换为强随机密码_Root
MYSQL_PASSWORD=请替换为强随机密码_WP

第三步:启动并验证

# 1. 进入工作目录
cd /opt/wordpress

# 2. 创建 .env 文件(修改密码后保存)
nano .env

# 3. 启动服务(后台运行)
docker compose up -d

# 4. 查看启动状态(应看到两个容器 running)
docker compose ps

# 5. 查看 WordPress 日志(排查启动问题)
docker compose logs wordpress
⏱️

首次启动需要下载镜像,耐心等待约 1-3 分钟。

启动成功后访问 http://服务器IP:8080 会看到 WordPress 安装向导(配置 Nginx 反代和 SSL 后改为 HTTPS 域名访问)。填写站点名称、管理员账号即完成安装。

🎨 WordPress 主题与插件选型

WordPress 的核心价值在于庞大的插件和主题生态。以下是经过验证的精选推荐,避免安装过多导致网站臃肿变慢。

🖼️ 推荐主题

Astra 免费/付费

全球最流行轻量主题,兼容性最佳,配合页面构建器使用

Kadence 免费/付费

现代设计,内置全站编辑,适合博客和企业站

GeneratePress 免费/付费

性能最优,极轻量,技术博客首选

Blocksy 免费/付费

颜值高,自定义能力强,电商支持好

Twenty Twenty-Four 官方免费

WordPress 官方主题,全站编辑体验,开箱即用

🔌 必装插件

Wordfence Security 安全

WordPress 最强安全插件,防火墙+恶意软件扫描

UpdraftPlus 备份

自动备份到云存储(Google Drive/S3),一键还原

WP Rocket / LiteSpeed Cache 性能

页面缓存+资源压缩,显著提升加载速度

Rank Math SEO SEO

全功能 SEO 优化,结构化数据,免费版足够用

Smush / ShortPixel 图片

自动压缩上传图片,减小文件大小不损画质

⚠️ 插件数量控制在 10 个以内。每个插件都会增加数据库查询和 PHP 执行时间。发现网站变慢时,首先检查是否有闲置插件——停用+删除不用的插件是最简单的提速方法。

🌸 Halo:国产博客系统部署

Halo 2.x 是完全重写的现代版本,基于 Spring Boot + Vue 3,提供精美的管理后台和主题市场。相比 WordPress,Halo 更专注于内容创作体验,中文支持原生且无需额外插件。

Docker Compose 部署

/opt/halo/docker-compose.yml
# 文件路径:/opt/halo/docker-compose.yml

services:

  # ── PostgreSQL 数据库(Halo 2.x 官方推荐)────────────────────────────────
  postgres:
    image: postgres:16-alpine
    container_name: halo-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: halo
      POSTGRES_USER: halo
      POSTGRES_PASSWORD: ${PG_PASSWORD}
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks:
      - halo-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U halo -d halo"]
      interval: 10s
      retries: 5

  # ── Halo 主程序 ──────────────────────────────────────────────────────────
  halo:
    image: halohub/halo:2
    container_name: halo
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - "127.0.0.1:8090:8090"   # 只绑定本地,通过 Nginx 反代
    environment:
      SPRING_R2DBC_URL: r2dbc:pool:postgresql://postgres/halo
      SPRING_R2DBC_USERNAME: halo
      SPRING_R2DBC_PASSWORD: ${PG_PASSWORD}
      SPRING_SQL_INIT_PLATFORM: postgresql
      HALO_EXTERNAL_URL: https://blog.yourdomain.com   # 改为您的域名
      HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME: admin
      HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD: ${HALO_ADMIN_PASSWORD}
    volumes:
      - halo_data:/root/.halo2   # Halo 数据(主题/插件/附件)
    networks:
      - halo-net

volumes:
  pg_data:
  halo_data:

networks:
  halo-net:
/opt/halo/.env
# 文件路径:/opt/halo/.env

PG_PASSWORD=请替换为强随机密码
HALO_ADMIN_PASSWORD=请替换为管理员密码

Halo 启动与访问

  1. 创建目录并编辑配置:mkdir -p /opt/halo && cd /opt/halo,将上方内容保存为 docker-compose.yml.env
  2. 修改 HALO_EXTERNAL_URL 为您的实际域名,修改两个密码变量
  3. 启动:docker compose up -d(首次启动需 1-2 分钟等待数据库初始化)
  4. 访问管理后台:http://服务器IP:8090/console,用 admin + 设置的密码登录
  5. 在"主题"页安装喜欢的主题,推荐:Earth(简洁)Higan(日式风格)Stack(技术博客)

🔐 Nginx 反代 + SSL 证书配置

容器在本地运行后,需要通过 Nginx 对外提供 HTTPS 访问。前提条件:已将域名 DNS 解析到服务器 IP,并等待生效(通常 5-30 分钟)。

申请 SSL 证书

# 1. 安装 certbot(Debian/Ubuntu)
apt install certbot python3-certbot-nginx -y

# 2. 申请 SSL 证书(自动修改 Nginx 配置)
certbot --nginx -d blog.yourdomain.com

# 或者只申请证书,不修改 Nginx(手动配置)
certbot certonly --nginx -d blog.yourdomain.com

# 3. 测试自动续期(证书 90 天有效,certbot 会自动续期)
certbot renew --dry-run

# 4. 查看已申请的证书
certbot certificates

Nginx 反代配置

/etc/nginx/conf.d/blog.conf
# 文件路径:/etc/nginx/conf.d/blog.conf
# 适用于 WordPress(端口 8080)和 Halo(端口 8090),修改端口和域名即可

server {
    listen 443 ssl;
    http2 on;
    server_name blog.yourdomain.com;   # 改为您的域名

    # SSL 证书路径(使用 certbot 申请,见下文)
    ssl_certificate     /etc/letsencrypt/live/blog.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.yourdomain.com/privkey.pem;

    # 上传文件大小限制(WordPress 上传图片/视频需要)
    client_max_body_size 64M;

    # 反代到本地容器
    location / {
        proxy_pass         http://127.0.0.1:8080;   # WordPress 用 8080,Halo 用 8090
        proxy_http_version 1.1;
        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-Proto $scheme;
        proxy_read_timeout 300;
    }

    # 静态资源缓存(提升加载速度)
    location ~* .(css|js|png|jpg|jpeg|gif|ico|svg|woff2)$ {
        proxy_pass http://127.0.0.1:8080;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

# HTTP 强制跳转 HTTPS
server {
    listen 80;
    server_name blog.yourdomain.com;
    return 301 https://$host$request_uri;
}

保存配置后验证并重载 Nginx:

# 验证配置语法
nginx -t

# 无报错则重载
systemctl reload nginx

性能与安全基础优化

⚡ 性能优化清单

  • 安装缓存插件(WP Rocket / LiteSpeed Cache)
  • 开启 Nginx gzip 压缩(减少传输体积 60-80%)
  • 图片全部走 WebP 格式 + 懒加载
  • 接入 Cloudflare CDN(全球加速 + 防护)
  • 数据库定期清理(删除修订版本/垃圾评论)
  • PHP-FPM 调整 worker 数量(匹配 CPU 核数)

🔒 安全加固清单

  • 安装 Wordfence(WordPress)限制登录失败次数
  • 禁用 wp-admin 文件编辑器(防代码注入)
  • 定期更新 WordPress 核心、主题、插件
  • wp-login.php 限制只允许您的 IP 访问
  • 数据库不对外暴露(只绑定内网)
  • 配置自动备份到异地存储(UpdraftPlus)

关键安全命令参考

# ── WordPress 文件权限加固 ──────────────────────────────────────────────────
# 在容器内执行(docker exec -it wordpress bash)
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

# ── 关闭 WordPress 文件编辑器(防止被黑后直接改代码)────────────────────────
# 在 wp-config.php 末尾添加:
# define('DISALLOW_FILE_EDIT', true);

# ── 限制 wp-admin 只允许特定 IP 访问(Nginx 配置)───────────────────────────
# 在 nginx.conf 的 location / 块内添加:
# location /wp-admin {
#     allow 你的家庭IP;
#     deny all;
# }

# ── 定期备份数据库(配合第19篇备份方案)────────────────────────────────────
# WordPress 数据库备份:
docker exec wp-mysql mysqldump -u wpuser -p密码 wordpress > /backup/wp-$(date +%Y%m%d).sql

# Halo 数据库备份:
docker exec halo-postgres pg_dump -U halo halo > /backup/halo-$(date +%Y%m%d).sql

常见问题解答

WordPress 还是 Halo,我该怎么选?

WordPress 如果:① 需要电商功能(WooCommerce);② 需要会员/付费内容体系;③ 网站不只是博客,还有复杂页面;④ 团队协作,有编辑/作者/管理员角色需求;⑤ 未来可能找人接手维护(WordPress 开发者最多)。选 Halo 如果:① 主要写中文博客,追求写作体验;② 喜欢简洁现代的设计风格;③ 不想被大量插件搞复杂;④ 资源有限(Halo 在 512MB 内存机器上也能流畅运行)。两者都是优秀的选择,核心差距在于生态广度(WordPress 胜)和使用体验简洁度(Halo 胜)。

网站打开很慢,如何快速诊断原因?

按顺序排查:① 用 GTmetrix 或 PageSpeed Insights 测速,查看是哪类资源最慢(图片/CSS/JS/服务器响应);② 服务器响应时间(TTFB)超过 500ms:说明是服务器端问题——检查 PHP 是否开了缓存(WP Rocket/LiteSpeed Cache)、MySQL 是否运行正常、内存是否告急(free -h);③ TTFB 正常但页面加载慢:通常是图片太大或 JS/CSS 未压缩——安装 Smush 压缩图片,启用 WP Rocket 的资源合并/压缩功能;④ 国内访问慢但国外快:线路问题,考虑接入 Cloudflare 或更换 CN2 GIA 线路的 VPS;⑤ 最后检查是否安装了太多插件——逐个停用,找出拖慢速度的元凶。

certbot 申请证书失败,提示 "Connection refused" 或 "Timeout",怎么处理?

certbot 申请证书时 Let's Encrypt 会从外网访问您的域名验证所有权,失败通常有以下原因:① DNS 未解析到正确 IP:用 ping 你的域名 确认指向服务器 IP;② 80 端口未放行:certbot http-01 验证必须通过 80 端口,检查 ufw allow 80/tcp 是否执行;③ Nginx 未运行或配置错误systemctl status nginx 确认运行,nginx -t 确认配置无误;④ 域名被 Cloudflare 代理(橙色云朵):申请证书时需先临时关闭 Cloudflare 代理(改为灰色云朵/仅 DNS 模式),申请成功后再开启;⑤ 境外 VPS 被某些服务商过滤:尝试使用 DNS 验证方式:certbot certonly --manual --preferred-challenges dns -d 你的域名,在域名 DNS 中添加 TXT 记录完成验证,完全不依赖 80 端口。

WordPress 被黑了(页面显示异常/出现陌生文件),怎么处理?

紧急处置步骤:① 立即下线:Nginx 配置添加 return 503 暂停访问,防止恶意代码继续传播;② 用 Wordfence 扫描:安装并运行完整扫描,找出被修改的文件和恶意代码;③ 从备份恢复:如果有 UpdraftPlus 备份,直接恢复到被黑前的版本是最快的方法;④ 修改所有密码:WordPress 管理员密码、数据库密码、FTP 密码、服务器 SSH 密码全部更换;⑤ 找入侵原因:查看 Nginx access.log 找到异常请求,通常是过时的插件或主题漏洞被利用——立即更新所有组件;⑥ 恢复后启用 Wordfence 防火墙、限制 wp-login.php 访问 IP,防止再次被黑。最好的防御是定期备份——被黑后从备份恢复比手动清理代码快 10 倍。

WordPress 后台地址可以修改吗?修改后更安全吗?

可以修改,安装 WPS Hide Login 插件可以将 /wp-admin 改为自定义路径(如 /my-secret-panel)。这能有效减少自动化扫描工具的骚扰(它们只知道去扫 /wp-login.php),但不应被视为核心安全措施——真正的安全来自强密码+双因素认证+及时更新。修改地址后务必记住新路径,忘记了只能直接访问数据库修改。更推荐的方案是在 Nginx 配置中限制 /wp-login.php 只允许您的 IP 访问,这不依赖插件且更可靠:location /wp-login.php { allow 你的IP; deny all; }

如何把旧网站(另一台服务器的 WordPress)迁移过来?

最简单的迁移方法:① 在旧服务器安装 All-in-One WP Migration 插件,导出整站打包文件(含数据库+文件);② 在新服务器按本指南部署好 WordPress;③ 安装同款插件,导入打包文件;④ 在"设置 → 常规"更新新的网站 URL;⑤ 把域名 DNS 指向新服务器 IP,等待生效即完成迁移。注意:All-in-One 免费版有 512MB 文件大小限制,大型网站(含大量媒体文件)需要 Duplicator Pro 或手动迁移(rsync 文件 + mysqldump 数据库)。迁移完成后一定要测试所有功能,尤其是图片路径和固定链接是否正常。

Halo 主题哪里找?如何安装第三方主题?

Halo 官方主题市场在 halo.run/themes,目前有数十款主题,涵盖简约博客、杂志、作品集等风格。安装方式:① 在线安装:管理后台 → 主题 → 主题市场,直接点击安装;② 手动安装:下载 .zip 格式主题包,在主题页面上传安装;③ GitHub 安装:部分主题托管在 GitHub,在主题页面输入 GitHub Release 地址直接拉取。推荐几款高颜值主题:Earth(简洁白净)、Higan(日系极简)、Stack(技术感十足)、Anatole(双栏经典布局)。Halo 主题基于 Freemarker 模板引擎开发,有前端基础可以自己定制。

想让博客支持评论但不想用 WordPress 自带的,有什么替代方案?

几个流行的第三方评论系统:① Twikoo(推荐,国人开发):支持部署到腾讯云函数或自托管,支持 Markdown、表情包、邮件通知,中文社区友好;② Waline:功能全面的评论系统,支持多种数据库和部署方式,与 Valine 同源但更安全;③ Disqus(境外):全球最流行但加载慢,需要代理才能在国内稳定使用;④ Cusdis:隐私友好的轻量评论工具,可自托管;⑤ GitHub Discussions / Utterances:直接用 GitHub Issue 作为评论存储,适合技术博客,访客需要 GitHub 账号。Halo 2.x 已内置评论功能且支持第三方评论组件。WordPress 通过插件(Twikoo / Disqus)集成。

1Panel 或宝塔面板和本指南的 Docker 方案有什么区别?哪个更好?

面板方案(1Panel/宝塔):图形界面操作,一键安装 WordPress,自动配置 Nginx+SSL,适合完全不想接触命令行的用户。缺点是面板本身占用资源,且面板的安全漏洞历史上出现过多次。Docker 方案(本指南):更灵活、可移植,docker compose up -d 一条命令即可在任何机器重建环境,数据卷独立管理。缺点是需要手动配置 Nginx 和 SSL。推荐选择:① 如果是第一次建站、对命令行不熟悉 → 先用 1Panel,快速上线;② 有一定基础、追求稳定和可控 → Docker 方案,长期维护更省心;③ 两者不冲突——可以先用 1Panel 建站,之后学习 Docker 方案后迁移。参见可视化面板部署指南了解 1Panel 的完整安装流程。

网站建好后,下一步应该做什么来提升访问速度和安全性?

建站后的标准强化路径:① 接入 Cloudflare(免费):将域名 NS 改为 Cloudflare,自动获得 CDN 加速、DDoS 防护、WAF 防火墙、免费 SSL,是性价比最高的单一提升措施——参见CDN 加速配置指南;② 配置监控报警:部署 Uptime Kuma 监控网站存活,宕机时立即收到 Telegram 通知——参见服务器监控指南;③ 建立备份策略:配置 UpdraftPlus 自动备份到云存储,遵循 3-2-1 原则——参见数据备份指南;④ SSL 评级优化:在 SSLLabs.com 测试,目标达到 A+ 评级,需要在 Nginx 中配置 HSTS、禁用旧版 TLS 等。