通过之前的操作,我已成功的把域名 anjir.top
和 www.anjir.top
通过A记录解析到了服务器的公网 IP 地址,服务器也安装好了Docker
和 Docker Compose
。接下来,就是用AI教我的网站配置完成个人网站的搭建。本篇文章主要记录:我实操后确认可行,整理好的、可复用的建站过程。
简单7个步骤
- 创建项目目录结构
- 编写 Docker Compose 核心文件
- 配置 Nginx
- 首次启动并申请SSL证书
- 更新 Nginx 配置以启用 HTTPS 及优化
- 完成 WordPress 安装
- 设置 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
说明:
-
我们定义了 db
,wordpress
,nginx
,certbot
四个服务。 volumes
将我们宿主机的目录挂载到容器内,这样数据(数据库、网站文件、证书)就持久化了,即使容器被删除,数据依然在。 networks
创建了一个内部桥接网络 app-network
,让容器之间可以通过服务名(如db
,wordpress
)进行通信,非常安全。-
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证书
现在,我们的准备工作已经就绪,可以启动服务并申请证书了。
-
启动基础服务
在
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 文件
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
。
你应该能看到:
-
浏览器地址栏有一个小锁标志,表示 HTTPS 已生效。 -
WordPress 的安装界面。
按照界面提示,选择语言,然后填写您的站点标题、管理员用户名、密码等信息。数据库信息部分,你不需要填写,因为我们已经通过环境变量配置好了。
点击安装,几秒钟后,您的网站就正式上线了!
第七步:设置 SSL 证书自动续期
Let's Encrypt 证书有效期为90天,我们必须设置自动续期。
-
打开 Crontab 编辑器:
crontab -e
添加续期任务:
在文件末尾添加以下一行,然后保存退出。
0 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个人网站(中)