Docker安装wordpress 开启HTTPS访问

2022-11-26 23:17:00

丢了之后又回来,开始搭建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容器,打开网站刷新,看是不是已经完成。

标签: ,,,,
Category:折腾笔记