丢了之后又回来,开始搭建wordpress,当下已经流行什么都用docker,简单方便。教程来自网络,只是自己做个笔记方便以后使用。
总体思路就是通过docker搭建nginx、mysql、wordpress,为节省端口使用nginx反代,有php配置需求也可以以nginx思路搭建php。
1、准备 docker-compose.yml 文件
在 /home/docker 路径下新建 wordpress 文件夹,用于存放搭建 WordPress 容器的相关文件。
# 新建并进入 /home/docker/wordpress 文件夹
mkdir -p /home/docker/wordpress
cd /home/docker/wordpress
# 新建 docker-compose.yml 文件,使用 vi 命令创建编辑文件,vi 的具体使用方法请自行搜索
vi docker-compose.yml
version: '3.1'
services:
nginx:
image: nginx:stable-alpine
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf/conf.d:/etc/nginx/conf.d:ro
- ./nginx/conf/nginxconfig.io:/etc/nginx/nginxconfig.io:ro
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/html:/usr/share/nginx/html:rw
- ./nginx/log:/var/log/nginx:rw
- ./nginx/ssl:/etc/ssl:ro
networks:
- default
mf_wp:
image: wordpress
restart: always
# ports:
# - 8080:80
environment:
WORDPRESS_DB_HOST: mf_db
WORDPRESS_DB_USER: dbuser
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: mofeide
volumes:
- ./mofei/html:/var/www/html
networks:
- default
mf_db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: mofeide
MYSQL_USER: dbuser
MYSQL_PASSWORD: 123456
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./mofeide/db:/var/lib/mysql
networks:
- default
networks:
default:
基于官方 docker-compose.yml 文件修改而来,主要修改了三个地方,一是为两个容器设置了网络,使其处于同一个子网,并与其他网络隔离开来,二是使用挂载主机目录的方式对容器数据进行持久化储存,方便以后管理和迁移,三是注释了 WordPress 容器的端口绑定,默认使用容器的 80 端口,后续在子网内可以直接使用容器名字访问 WordPress。
2、准备 nginx 容器来反代 WordPress
前文中的 docker-compose.yml 文件设置了三个容器,分别为 nginx,WordPress 和其使用的 Mysql。nginx 的作用是作为前端的反向代理服务器,用于响应用户的网络访问请求,并将对应的网络请求进行代理转发。当然我们本可以直接将 WordPress 容器的 80 端口暴露给外网,但是这样一来则无法在同一个 IP 地址下部署多个网站,也难以对网站进行 HTTPS 配置等操作,因此我们使用 nginx 来作为 Web 服务器,处理 Web 响应,进行代理和转发。
使用 nginx 容器时,我们同样使用挂载主机目录的方式来使用 Docker,方便对 nginx 的配置文件进行修改。为了达到可以使用挂载主机目录的方式来使用 nginx,我们首先需要在自己本地拥有一份默认的 nginx 配置文件,因此我们先使用一个临时的 nginx 容器,来获取默认的配置。
# 建立 nginx 配置文件夹
cd /home/docker/wordpress
mkdir -p nginx/conf
# 新建一个临时 nginx 容器
docker run --name nginx_temp -p 80:80 -d nginx:stable-alpine
# 将 nginx 默认配置拷贝到主机上的配置文件夹(手动copy也行)
docker container cp nginx_temp:/etc/nginx/conf.d ./nginx/conf/
docker container cp nginx_temp:/etc/nginx/nginx.conf ./nginx/conf/
# 停止删除临时 nginx 容器
docker container stop nginx_temp
docker container rm nginx_temp
获取了 nginx 的默认配置以后,我们就可以启动容器了。nginx 的基本配置位于 /home/docker/wordpress/nginx/nginx.conf,网站配置文件位于 /home/docker/wordpress/nginx/conf.d 目录。
3、启动容器
在 /home/docker/wordpress 目录下,使用 docker-compose up 命令即可将三个容器启动。容器启动后,接下来我们配置 nginx 来访问 WordPress。
4、配置 nginx 并开启 HTTPS 访问 WordPress
根据前文的设置,我们已经配置好了所有需要的容器,但是目前还不能通过公网访问到我们的 WordPress 网站,因为容器建立的 WordPress 网站我们把它放在了 Docker 的子网络中,没有和公网 IP 进行绑定,因此我们需要配置 nginx 来进行公网 Web 请求的代理和转发。
设置 nginx 来反向代理 WordPress。在 /home/docker/wordpress/nginx/conf.d 目录下新建 WordPress 网站的配置文件,名字为 ethanblog.com.conf,把以下内容拷贝到此配置文件中:
server {
listen 80;
listen [::]:80;
server_name .mofei.de;
location / {
proxy_pass http://mf_wp;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
}
重启nginx容器,此时可以正常访问域名。
至此,你就可以通过自己的域名访问通过 Docker 搭建的 WordPress 网站了,如果你不追求配置 HTTPS 访问,那么现在就可以设置 WordPress 的安装过程并开始写博客了。
5、为 Docker 搭建的 WordPress 获取 HTTPS 证书
以下为获取ssl证书:
安装 Acme 脚本
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --register-account -m mofei88828@qq.com ##使用邮箱注册
三种验证方式,自行选择
80 端口空闲的验证申请
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 Acme.sh 还能假装自己是一个 WebServer, 临时监听在 80 端口, 完成验证
~/.acme.sh/acme.sh --issue -d mydomain.com --standalone
Nginx 的方式验证申请
这种方式需要你的服务器上面已经部署了 Nginx 环境,并且保证你申请的域名已经在 Nginx 进行了 conf 部署。(被申请的域名可以正常被打开)
~/.acme.sh/acme.sh --issue -d mydomain.com --nginx
http 的方式验证申请
这种方式需要你的服务器上面已经部署了网站环境。(被申请的域名可以正常被打开)
原理:Acme 自动在你的网站根目录下放置一个文件, (这个文件可以被互联网访问)来验证你的域名所有权,完成验证. 然后就可以生成证书了.
实例代码:(后面的路径请更改为你的 网站根目录 绝对路径 )
~/.acme.sh/acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/ , 请不要直接使用此目录下的证书文件。 正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置,比如下面的代码
~/.acme.sh/acme.sh --installcert -d mofei.de --key-file /home/docker/wordpress/nginx/ssl/mofeide.key --fullchain-file /home/docker/wordpress/nginx/ssl/mofeide.crt
上面的 /root/private.key 以及 /root/cert.crt 是把密钥和证书安装到 /home/docker/wordpress/nginx/ssl/ 目录,并改名为 mofeide.key 和 mofeide.crt。(一定要放在映射目录里,不要随便放!!我在这里坑了好久)
目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心。
对于获取的 HTTPS 证书,我们将其复制到 nginx 容器挂载的主机目录下以备用:(注意看是映射目录)
cp -rf /etc/letsencrypt/archive/* /home/docker/wordpress/nginx/ssl/
同时,在 /home/docker/wordpress/nginx/ssl/ 目录下生成一份 dhparam.pem 文件备用:(注意看是映射目录,使用moz工具推荐模版需要此文件)
curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam.pem
更新 Acme 脚本,升级 Acme.sh 到最新版本
~/.acme.sh/acme.sh --upgrade
查看acme域名
acme.sh list
6、开始 nginx 配置 HTTPS 访问
获取HTTPS证书后,在nginx下配置HTTPS访问,将SSL配置为 on,参考moz推荐ssl配置。
以下为我的配置
# generated 2022-11-25, Mozilla Guideline v5.6, nginx 1.22.1, OpenSSL 1.1.1k, intermediate configuration, no OCSP
# https://ssl-config.mozilla.org/#server=nginx&version=1.22.1&config=intermediate&openssl=1.1.1k&ocsp=false&guideline=5.6
server {
listen 80;
listen [::]:80;
location / {
return 301 https://mofei.de$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name .mofei.de;
location / {
proxy_pass http://mf_wp;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
ssl_certificate /etc/ssl/mofeide.crt;
ssl_certificate_key /etc/ssl/mofeide.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /etc/ssl/dhparam;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
}
重启nginx容器,打开网站刷新,看是不是已经完成。