微信扫码,获取更多

AI教我用Docker搭建WordPress个人网站(中)

通过之前的操作,我已成功的把域名 anjir.top 和 www.anjir.top 通过A记录解析到了服务器的公网 IP 地址,服务器也安装好了Docker 和 Docker Compose。接下来,就是用AI教我的网站配置完成个人网站的搭建。本篇文章主要记录:我实操后确认可行,整理好的、可复用的建站过程。


简单7个步骤

  1. 创建项目目录结构
  2. 编写 Docker Compose 核心文件
  3. 配置 Nginx
  4. 首次启动并申请SSL证书
  5. 更新 Nginx 配置以启用 HTTPS 及优化
  6. 完成 WordPress 安装
  7. 设置 SSL 证书自动续期

第一步:创建项目目录结构

登录服务器,执行以下命令创建目录:

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
# 创建一个总的项目目录
mkdir my_website && cd my_website

# 创建各个服务所需的子目录
mkdir -p nginx/conf.d
mkdir -p nginx/cache
mkdir -p wordpress/html
mkdir -p mysql/data
mkdir -p certbot/conf
mkdir -p certbot/www

目录结构说明:

  • my_website/
    : 我们的项目根目录。
  • nginx/conf.d/
    : 存放 Nginx 站点配置文件。
  • nginx/cache/
    : 存放 Nginx 的缓存文件。
  • wordpress/html/
    : 存放 WordPress 的所有文件(主题、插件等)。
  • mysql/data/
    : 存放 MySQL 数据库文件。
  • certbot/conf/
    : 存放 Let's Encrypt 生成的SSL证书和配置文件。
  • certbot/www/
    : 用于 Let's Encrypt 进行域名验证的临时目录。

第二步:编写 Docker Compose 核心文件

这是整个架构的核心。在 my_website 目录下,创建一个名为 docker-compose.yml 的文件。

  • 1
nano docker-compose.yml

将以下内容完整地复制并粘贴到文件中。请务必将其中 YOUR_STRONG_PASSWORD 和 YOUR_EMAIL@example.com 替换为你自己的信息。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

services:
db:
image:mysql:5.7
container_name:wordpress_db
restart:always
volumes:
-./mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD:'YOUR_STRONG_ROOT_PASSWORD'# 请替换为你的MySQL root强密码
MYSQL_DATABASE:'wordpress'
MYSQL_USER:'wordpress_user'
MYSQL_PASSWORD:'YOUR_STRONG_USER_PASSWORD'# 请替换为你的WordPress数据库用户强密码
networks:
-app-network

wordpress:
image:wordpress:php8.2-fpm
container_name:wordpress_fpm
restart:always
depends_on:
-db
volumes:
-./wordpress/html:/var/www/html
environment:
WORDPRESS_DB_HOST:db:3306
WORDPRESS_DB_USER:'wordpress_user'
WORDPRESS_DB_PASSWORD:'YOUR_STRONG_USER_PASSWORD'# 确保和上面db服务中的密码一致
WORDPRESS_DB_NAME:'wordpress'
networks:
-app-network

nginx:
image:nginx:1.27.0
container_name:wordpress_nginx
restart:always
ports:
-"80:80"
-"443:443"
volumes:
-./nginx/conf.d:/etc/nginx/conf.d
-./nginx/cache:/var/cache/nginx
-./wordpress/html:/var/www/html:ro# 以只读方式挂载WordPress文件,更安全
-./certbot/conf:/etc/letsencrypt
-./certbot/www:/var/www/certbot
depends_on:
-wordpress
networks:
-app-network

certbot:
image:certbot/certbot
container_name:certbot_tool
volumes:
-./certbot/conf:/etc/letsencrypt
-./certbot/www:/var/www/certbot

networks:
app-network:
driver:bridge

说明:

  • 我们定义了 dbwordpressnginxcertbot 四个服务。
  • volumes
     将我们宿主机的目录挂载到容器内,这样数据(数据库、网站文件、证书)就持久化了,即使容器被删除,数据依然在。
  • networks
     创建了一个内部桥接网络 app-network,让容器之间可以通过服务名(如 dbwordpress)进行通信,非常安全。
  • WordPress 镜像我们用了 php8.2-fpm 版本,它不自带Web服务器,性能更高,将由 Nginx 来处理HTTP请求并转发给它。

第三步:配置 Nginx

我们需要一个 Nginx 配置文件来处理HTTP请求、转发给WordPress、并最终启用HTTPS。

在 nginx/conf.d/ 目录下,创建一个名为 app.conf 的文件。

  • 1
nano nginx/conf.d/app.conf

将以下配置完整地复制粘贴进去。这个配置暂时只监听80端口,用于我们下一步申请SSL证书。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
server {
listen80;
server_name anjir.top www.anjir.top;  # 请替换为你的域名

# 用于 Let's Encrypt 域名验证
location /.well-known/acme-challenge/ {
root /var/www/certbot;
    }

# 其他所有请求暂时重定向到https(证书申请成功后生效)
location / {
return301 https://$host$request_uri;
    }
}

第四步:首次启动并申请SSL证书

现在,我们的准备工作已经就绪,可以启动服务并申请证书了。

  1. 启动基础服务

    在 my_website 目录下,执行:

    docker compose up -d --build nginx wordpress db

    这个命令会构建并启动 Nginx, WordPress 和 DB 服务。由于 app.conf 只配置了80端口,现在Nginx已经准备好接受 Let's Encrypt 的验证了。


  • 申请SSL证书

    执行以下命令,使用 Certbot 容器来申请证书。请将 YOUR_EMAIL@example.com 换成你自己的邮箱、anjir.top换成你自己的域名

    docker compose run --rm certbot certonly --webroot -w /var/www/certbot --email YOUR_EMAIL@example.com --agree-tos --no-eff-email -d anjir.top -d www.anjir.top

    如果一切顺利,你会看到成功的信息,并且证书文件会被保存在 certbot/conf 目录中。


  • 生成SSL 配置文件

    两个用于加强安全性的 SSL 配置文件:

    options-ssl-nginx.conf:包含推荐的 SSL/TLS 协议和加密套件。
    ssl-dhparams.pem:Diffie-Hellman 参数,用于增强密钥交换的安全性。

    下载 options-ssl-nginx.conf 文件

    curl -sSLo ./certbot/conf/options-ssl-nginx.conf https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf

    生成 ssl-dhparams.pem 文件

    openssl dhparam -out ./certbot/conf/ssl-dhparams.pem 2048

    注意: 这个命令的执行过程会打印一些点(.)和加号(+),并且可能需要一到两分钟的时间,请耐心等待它完成,不要中断。



  • 第五步:更新 Nginx 配置以启用 HTTPS 及优化

    证书已经到手,现在我们来更新 Nginx 配置,开启 HTTPS、强制跳转、并加入性能和安全优化。

    再次编辑 nginx/conf.d/app.conf 文件:

    • 1
    nano nginx/conf.d/app.conf

    删除旧的全部内容,然后将下面这份最终版配置完整地复制粘贴进去:

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    # 1. Nginx 性能优化:限流和缓存
    #------------------------------------------------
    # 定义一个名为 "one" 的请求限制区域,基于客户端IP地址,每1MB内存可存储约16000个状态。
    # 速率为每秒10个请求(10r/s)。
    limit_req_zone$binary_remote_addr zone=one:10m rate=10r/s;

    # 定义 FastCGI 缓存路径和规则
    # 路径在宿主机的 ./nginx/cache
    # levels=1:2 表示两级目录结构
    # keys_zone=WORDPRESS:10m  缓存元数据区,名为WORDPRESS,大小10m
    # inactive=60m  60分钟未被访问的缓存将失效
    # max_size=1g  最大缓存空间为1g
    fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:10m inactive=60m max_size=1g;
    fastcgi_cache_key"$scheme$request_method$host$request_uri";


    # 2. HTTP (80) 强制跳转到 HTTPS (443)
    #------------------------------------------------
    server {
    listen80;
    server_name anjir.top www.anjir.top; # 请替换为你的域名

    # 对于 Let's Encrypt 续期验证,依然保留
    location /.well-known/acme-challenge/ {
    root /var/www/certbot;
        }

    location / {
    return301 https://anjir.top$request_uri# 统一跳转到不带www的https域名
        }
    }

    # 3. HTTPS (443) 主服务配置
    #------------------------------------------------
    server {
    listen443 ssl; 
    http2on;
    server_name anjir.top www.anjir.top; # 请替换为你的域名

    # SSL 证书配置
    ssl_certificate /etc/letsencrypt/live/anjir.top/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/anjir.top/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    root /var/www/html;
    index index.php index.html index.htm;

    # www 跳转到 非www
    if ($host = www.anjir.top) {
    return301 https://anjir.top$request_uri;
        }

    # 添加自定义头信息,方便调试
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # 缓存例外规则:不缓存后台、登录用户和特定页面
    set$skip_cache0;
    if ($request_method = POST) { set$skip_cache1; }
    if ($query_string != "") { set$skip_cache1; }
    if ($request_uri~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") { set$skip_cache1; }
    if ($http_cookie~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") { set$skip_cache1; }


    location / {
    try_files$uri$uri/ /index.php?$args;
        }

    # PHP-FPM 处理
    location~ .php$ {
    try_files$uri =404;
    fastcgi_split_path_info ^(.+.php)(/.+)$;
    # 连接到WordPress FPM容器的9000端口
    fastcgi_pass wordpress:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;

    # 应用请求限流
    limit_req zone=one burst=5 nodelay;

    # 应用缓存
    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid20030210m# 对200 302状态码缓存10分钟
    fastcgi_cache_valid4041m;
    fastcgi_cache_bypass$skip_cache;
    fastcgi_no_cache$skip_cache;
        }

    # 拒绝访问隐藏文件,如 .htaccess
    location~ /. {
    deny all;
        }
    }

    重启 Nginx 使配置生效:

    • 1
    docker compose restart nginx

    第六步:完成 WordPress 安装

    现在,用浏览器访问 https://anjir.top

    你应该能看到:

    1. 浏览器地址栏有一个小锁标志,表示 HTTPS 已生效。
    2. WordPress 的安装界面。

    按照界面提示,选择语言,然后填写您的站点标题、管理员用户名、密码等信息。数据库信息部分,你不需要填写,因为我们已经通过环境变量配置好了。

    点击安装,几秒钟后,您的网站就正式上线了!


    第七步:设置 SSL 证书自动续期

    Let's Encrypt 证书有效期为90天,我们必须设置自动续期。

    1. 打开 Crontab 编辑器:

      crontab -e

  • 添加续期任务:
    在文件末尾添加以下一行,然后保存退出。

    3 * * * cd /root/my_website && docker compose run --rm certbot renew && docker compose exec nginx nginx -s reload

    注意: 请务必将 /root/my_website 替换为您 my_website 目录的绝对路径!您可以通过 pwd 命令在 my_website 目录下查看。

    这个任务的含义是:每天凌晨3点检查并续期SSL证书,成功后平滑重载Nginx。Certbot 很智能,只有在证书快到期时才会真正执行续期。



    到这里,我们的网站就搭建好了,接下来就只需要一些优化了。


    未经允许不得转载:无花果 » AI教我用Docker搭建WordPress个人网站(中)

    觉得文章有用就打赏一下文章作者

    支付宝扫一扫打赏

    微信扫一扫打赏