个人博客从零搭建全纪录:WordPress + Docker 容器化部署方案

这是一份基于云服务器实操验证的个人独立博客部署指南。方案采用 Docker Compose 实现组件隔离,通过 Nginx 统一代理并配置自动化 HTTPS 证书,兼顾了极高的稳定性和后期的免维护性。

核心架构概览

  • 服务器OS: Ubuntu 22.04 LTS
  • 部署环境: Docker + Docker Compose
  • 核心组件: Nginx (反向代理) + WordPress (博客引擎) + MySQL 8.0 (数据库)
  • 安全加密: Let’s Encrypt 免费自动续期 HTTPS 证书

阶段一:基础设施准备

  1. 配置云端防火墙 登录云服务商控制台,找到服务器的“防火墙”或“安全组”设置,务必添加规则放行 TCP 80 (HTTP) 和 TCP 443 (HTTPS) 端口。这是后续 Nginx 代理和申请证书的前提。
  2. 域名解析 (DNS) 在域名注册商后台,添加两条 A 记录(主机记录分别为 @ 和 www),记录值填入云服务器的 公网 IP。等待生效即可。
  3. 优化底层拉取速度(国内机房必选) 如果你使用的是国内云服务器,建议配置云厂商的内网 Docker 镜像源(以提升 docker pull 速度及稳定性),并将默认编辑器设置为完整版 Vim (/usr/bin/vim.basic)。

阶段二:目录规划与服务配置

在服务器中创建统一的博客数据卷目录,便于后期整体打包备份。

sudo mkdir -p /opt/blog-stack/{nginx/conf.d,mysql_data,html,certbot/www,certbot/conf}
cd /opt/blog-stack

1. 编写容器编排配置 (docker-compose.yml)

在 /opt/blog-stack 目录下创建 docker-compose.yml,定义我们的三大核心服务(数据库、WordPress主体、Nginx网关)。注意替换文件中的数据库密码。

services:
  db:
    image: mysql:8.0
    container_name: blog_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: your_secure_wp_password
    volumes:
      - ./mysql_data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password

  wordpress:
    image: wordpress:latest
    container_name: blog_wordpress
    restart: always
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: your_secure_wp_password
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./html:/var/www/html

  nginx:
    image: nginx:alpine
    container_name: blog_nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./html:/var/www/html
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    depends_on:
      - wordpress

2. 编写 Nginx 初始配置

为了让 Let’s Encrypt 能够通过 80 端口验证域名所有权,需先配置一份仅包含 80 端口转发的初始规则。

创建并编辑 nginx/conf.d/default.conf

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;

    # 用于 Let's Encrypt 证书验证的临时目录映射
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    # 将其他请求反向代理到 WordPress
    location / {
        proxy_pass http://wordpress:80;
        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;
    }
}

启动基础服务:

sudo docker compose up -d


阶段三:加密加固与服务上线

1. 申请 HTTPS 证书

确认 DNS 解析完全生效后(可通过 ping yourdomain.com 验证),执行以下命令临时拉取 Certbot 容器申请证书。注意替换你的域名和邮箱。

sudo docker run --rm -it \
  -v /opt/blog-stack/certbot/conf:/etc/letsencrypt \
  -v /opt/blog-stack/certbot/www:/var/www/certbot \
  certbot/certbot certonly --webroot \
  --webroot-path=/var/www/certbot \
  -d yourdomain.com -d www.yourdomain.com \
  --email your_email@example.com \
  --agree-tos --no-eff-email

当屏幕出现 Successfully received certificate. 即代表签发成功。

2. 启用 HTTPS 并强制重定向

再次编辑 Nginx 配置文件 nginx/conf.d/default.conf,将 80 端口流量强制重定向至 443,并挂载刚刚申请好的证书。

# HTTP 强制跳转 HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPS 核心配置
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name yourdomain.com www.yourdomain.com;

    # 证书路径映射
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # TLS 安全协议强化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    client_max_body_size 50M;

    location / {
        proxy_pass http://wordpress:80;
        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;
    }
}

无缝重载 Nginx 生效:

sudo docker compose exec nginx nginx -s reload

3. 配置证书自动化续期

Let’s Encrypt 证书的有效期为 90 天,利用 Linux 定时任务实现免人工干预续签。 执行 sudo crontab -e,在末尾添加:

0 3 1 * * docker run --rm -v /opt/blog-stack/certbot/conf:/etc/letsencrypt -v /opt/blog-stack/certbot/www:/var/www/certbot certbot/certbot renew && docker exec blog_nginx nginx -s reload

(代表每月 1 号凌晨 3 点自动验证并重载 Nginx)


阶段四:网站初始化

打开浏览器,访问 https://yourdomain.com 即可进入 WordPress 著名的五分钟安装向导:

  • Site Title (站点标题): 填写你的博客名称。
  • Username (管理员账号): 务必避免使用 admin 或 root 以防暴力破解,推荐使用个人英文 ID。
  • Password (管理员密码): 建议使用高强度随机密码。
  • Search engine visibility: 根据个人需求选择是否允许搜索引擎抓取。

配置完毕点击安装,即可登录后台开始探索!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!