建一个博客或官网不需要写代码。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
# 使用前先创建目录: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 # 密码不要提交到 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 的核心价值在于庞大的插件和主题生态。以下是经过验证的精选推荐,避免安装过多导致网站臃肿变慢。
🖼️ 推荐主题
全球最流行轻量主题,兼容性最佳,配合页面构建器使用
现代设计,内置全站编辑,适合博客和企业站
性能最优,极轻量,技术博客首选
颜值高,自定义能力强,电商支持好
WordPress 官方主题,全站编辑体验,开箱即用
🔌 必装插件
WordPress 最强安全插件,防火墙+恶意软件扫描
自动备份到云存储(Google Drive/S3),一键还原
页面缓存+资源压缩,显著提升加载速度
全功能 SEO 优化,结构化数据,免费版足够用
自动压缩上传图片,减小文件大小不损画质
⚠️ 插件数量控制在 10 个以内。每个插件都会增加数据库查询和 PHP 执行时间。发现网站变慢时,首先检查是否有闲置插件——停用+删除不用的插件是最简单的提速方法。
🌸 Halo:国产博客系统部署
Halo 2.x 是完全重写的现代版本,基于 Spring Boot + Vue 3,提供精美的管理后台和主题市场。相比 WordPress,Halo 更专注于内容创作体验,中文支持原生且无需额外插件。
Docker Compose 部署
# 文件路径:/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 PG_PASSWORD=请替换为强随机密码 HALO_ADMIN_PASSWORD=请替换为管理员密码
Halo 启动与访问
- 创建目录并编辑配置:
mkdir -p /opt/halo && cd /opt/halo,将上方内容保存为docker-compose.yml和.env - 修改
HALO_EXTERNAL_URL为您的实际域名,修改两个密码变量 - 启动:
docker compose up -d(首次启动需 1-2 分钟等待数据库初始化) - 访问管理后台:
http://服务器IP:8090/console,用 admin + 设置的密码登录 - 在"主题"页安装喜欢的主题,推荐: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
# 适用于 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 等。