如何使用 Docker Compose 安装 WordPress

介绍

WordPress是一个免费的和开源的 内容管理系统(CMS)建立在一个 MySQL的数据库与 PHP的处理。由于其可扩展的插件架构和模板系统,其大部分的管理可以通过Web界面进行。这就是为什么WordPress在创建不同类型的网站时是一个受欢迎的选择,从博客到产品页面到电子商务网站。

运行 WordPress 通常需要安装 LAMP(Linux, Apache, MySQL,和 PHP)或 LEMP(Linux, Nginx, MySQL,和 PHP)堆栈,这可能耗时。然而,使用工具如 DockerDocker Compose,您可以简化设置您喜爱的堆栈和安装 WordPress 的过程。而不是手动安装单个组件,您可以使用 images,这将标准化图书馆,配置文件和环境变量等东西。然后,在 containers 中运行这些图像,这是在共享操作系统上运行的孤立过程。此外,通过使用 Compose,您可以协调多个容器 - 例如应用数据库和环境 -

在本教程中,您将建立一个多容器的WordPress安装。您的容器将包括MySQL数据库、Nginx网络服务器和WordPress本身。您还将通过获得TLS/SSL证书(Let's Encrypt)来保护您的安装,以便您想要的域名与您的网站相关联。最后,您将设置一个 cron工作来更新您的证书,以便您的域名保持安全。

前提条件

要遵循本教程,您将需要:

一旦你已经设置了一切,你已经准备好开始第一步。

步骤 1 – 定义 Web 服务器配置

在运行任何容器之前,您的第一步是为您的 Nginx Web 服务器定义配置。您的配置文件将包含一些特定的 WordPress 位置块,以及一个位置块,以便将 Let's Encrypt 验证请求直接发送到 Certbot 客户端进行自动证书更新。

首先,为您的WordPress设置创建一个项目目录. 在这个例子中,它被称为WordPress。如果你想:

1mkdir wordpress

然后导航到目录:

1cd wordpress

接下来,为配置文件创建一个目录:

1mkdir nginx-conf

使用「nano」或您最喜歡的編輯器開啟檔案:

1nano nginx-conf/nginx.conf

在此文件中,添加一个服务器块,为您的服务器名称和文档根指令,以及位置块,以指导Certbot客户端对证书,PHP处理和静态资产请求的请求。

将以下代码添加到文件中. 请确保用自己的域名更换 your_domain:

 1[label ~/wordpress/nginx-conf/nginx.conf]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        server_name your_domain www.your_domain;
 7
 8        index index.php index.html index.htm;
 9
10        root /var/www/html;
11
12        location ~ /.well-known/acme-challenge {
13                allow all;
14                root /var/www/html;
15        }
16
17        location / {
18                try_files $uri $uri/ /index.php$is_args$args;
19        }
20
21        location ~ \.php$ {
22                try_files $uri =404;
23                fastcgi_split_path_info ^(.+\.php)(/.+)$;
24                fastcgi_pass wordpress:9000;
25                fastcgi_index index.php;
26                include fastcgi_params;
27                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
28                fastcgi_param PATH_INFO $fastcgi_path_info;
29        }
30
31        location ~ /\.ht {
32                deny all;
33        }
34
35        location = /favicon.ico { 
36                log_not_found off; access_log off; 
37        }
38        location = /robots.txt { 
39                log_not_found off; access_log off; allow all; 
40        }
41        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
42                expires max;
43                log_not_found off;
44        }
45}

我们的服务器块包含以下信息:

指南: **

  • 听着': 这让 Nginx 在端口 80 上收听, 这将允许您使用 Certbot [webroot 插件] ([ LINK0] ) 来获取您的证书请求 。 请注意, 您是_ not_ 包括端口443' , 但是, 一旦您成功获得您的证书, 您将更新您的配置以包含 SSL 。
  • 服务器' : 这定义了您的服务器名称和用于向服务器请求的服务器块 。 在此行中,请务必用自己的域名来取代您的域名。 *index': 此指令定义了处理服务器请求时用作索引的文件 。 您修改了这里的默认优先级顺序, 将 index.php 移动到 index.html' 前面, 以便 Nginx 尽可能优先使用名为 index.php' 的文件 。 *根': 此指令为您服务器的请求命名了 **root ** 目录 。 此目录为/var/www/html',根据您WordPress Dockerfile中的指示,在建设时创建为挂载点。 这些 Dockerfile 指令也确保 WordPress 发布中的文件被挂载到此卷. (英语)

区块链位置:**

*地点~.众所周知/挑战': 此位置块将处理向 '. well- name' 目录提出的请求, Certbot 将在此放置一个临时文件, 以验证您域名的 DNS 解析到您的服务器 。 在此配置到位后, 您可以使用 Certbot 的 Webroot 插件来获取您的域证书 。 *地点/': 在这个位置块中,使用 try_files 指令来检查符合单个URI请求的文件。 然而,你不会将一个404未找到的 状态作为默认,而是会将控制权传递给WordPress的'index.php'文件,并附上请求参数. *地点~\.php$': 这个位置块将处理PHP处理,并将这些请求代理到您的wordpress容器。 由于您的 WordPress Docker 图像将基于 [php: fpm' 图像] (https://github.com/docker-library/php/blob/e63194a0006848edb13b7eff5a7f9d790d679428/7.2/alpine3.9/fpm/Dockerfile), 您也会在此块中包含针对 [FastCGI 协议] (https://en.wikipedia.org/wiki/FastCGI] 的配置选项 。 Nginx需要一个独立的PHP处理器来处理PHP请求. 在这种情况下,这些请求将由php-fpm'处理器处理,该处理器与php:fpm'图像一起。 (英语)

此外,这个位置块包括FastCGI特定的指令、变量和选项,将向WordPress应用程序发送代理请求,在您的WordPress容器中运行,为解析请求URI设置偏好索引,并解析URI请求。

  • 位置 ~ /\.ht:此块将处理 .htaccess 文件,因为 Nginx 不会为它们提供服务。 deny_all 指令确保 .htaccess 文件永远不会向用户提供服务。
  • location = /favicon.ico, location = /robots.txt:这些块确保不会登录到 /favicon.ico 和 `/robots.txt' 的请求。

有关 FastCGI 代理的更多信息,请参阅 理解和实施 Nginx 中的 FastCGI 代理. 有关服务器和位置块的信息,请参阅 理解 Nginx 服务器和位置块选择算法

完成编辑后保存并关闭文件. 如果您使用了nano,请按CTRL+X,Y,然后按ENTER

有了 Nginx 配置,您可以继续创建环境变量,在运行时传输到您的应用程序和数据库容器。

第2步:定义环境变量

您的数据库和WordPress应用程序容器需要在运行时访问某些环境变量,以便您的应用程序数据存储并可访问您的应用程序. 这些变量包括敏感和非敏感信息:MySQL root 密码和应用程序数据库用户和密码的敏感值,以及应用程序数据库名称和主机的非敏感信息。

相反,在您的 Docker Compose 文件中设置所有这些值 - 主要文件包含有关您的容器将如何运行的信息 - 将.env 文件中的敏感值设置并限制其流通,这将防止这些值被复制到您的项目存储库并公开曝光。

在您的主要项目目录中, ~/wordpress,打开名为 .env 的文件:

1nano .env

您在此文件中设置的机密值包括MySQL root 用户的密码,以及WordPress将使用的用户名和密码来访问数据库。

将以下变量名称和值添加到文件中. 请记住为每个变量提供 ** 自己的值** :

1[label ~/wordpress/.env]
2MYSQL_ROOT_PASSWORD=your_root_password
3MYSQL_USER=your_wordpress_database_user
4MYSQL_PASSWORD=your_wordpress_database_password

包含了 root 管理帐户的密码,以及您的应用程序数据库的首选用户名和密码。

保存并关闭文件,当你完成编辑。

因为你的.env 文件包含敏感信息,所以你想确保它包含在你的项目的.gitignore 和.dockerignore 文件中。

如果您打算使用 Git 进行版本控制,则 将当前工作目录初始化为存储库git init:

1git init

然后创建并打开.gitignore 文件:

1nano .gitignore

將「.env」添加到檔案中:

1[label ~/wordpress/.gitignore]
2.env

保存并关闭文件,当你完成编辑。

同样,在.dockerignore 文件中添加 `.env' 也是一个很好的预防措施,以便在您使用此目录作为构建背景时,它不会最终落入您的容器中。

打开文件:

1nano .dockerignore

將「.env」添加到檔案中:

1[label ~/wordpress/.dockerignore]
2.env

下面,您可以任意添加与应用程序开发相关的文件和目录:

1[label ~/wordpress/.dockerignore]
2.env
3.git
4docker-compose.yml
5.dockerignore

保存并关闭文件,当你完成。

有了敏感信息,您现在可以继续在docker-compose.yml文件中定义您的服务。

步骤 3 — 使用 Docker Compose 定义服务

您的docker-compose.yml文件将包含您的设置的服务定义. Compose 中的 service 是一个运行容器,并且服务定义会指定每个容器将如何运行的信息。

使用 Compose,您可以定义不同的服务来运行多容器应用程序,因为 Compose 允许您将这些服务连接到共享网络和卷中。这将对您当前的设置有帮助,因为您将为您的数据库,WordPress 应用程序和 Web 服务器创建不同的容器。

要开始,创建并打开docker-compose.yml文件:

1nano docker-compose.yml

添加以下代码来定义您的 Compose 文件版本和db数据库服务:

 1[label ~/wordpress/docker-compose.yml]
 2version: '3'
 3
 4services:
 5  db:
 6    image: mysql:8.0
 7    container_name: db
 8    restart: unless-stopped
 9    env_file: .env
10    environment:
11      - MYSQL_DATABASE=wordpress
12    volumes: 
13      - dbdata:/var/lib/mysql
14    command: '--default-authentication-plugin=mysql_native_password'
15    networks:
16      - app-network

db服务定义包含以下选项:

  • 图像': 这告诉了Compose要拉出什么图像来创建容器. 您将 misql: 8.0 图像( https://github.com/docker-library/mysql/blob/130bd8e46a3da1adfc1732a08c70673e20aa5977/8.0/Dockerfile )贴在这里, 以避免随着 misql:latest` 图像的不断更新而出现未来冲突。 欲了解更多关于版本打针和避免依赖性冲突的信息,请读关于Dockerfile Best Practices的多克文档.
  • `容器-名称' : 在此指定容器的名称 。
  • 重新开始 : 这定义了容器重启策略 。 默认为`否',但您已设置容器重新启动,除非它被手动停止。
  • env_file' : 此选项告诉 Compose 您想要从一个名为 . env 的文件中添加环境变量, 位于您的构建上下文 。 在这种情况下,构建上下文是您的当前目录 。 *环境': 此选项允许您在 .env 文件中定义的环境变量之外添加额外的环境变量 。 您将把 MYSQL_DATABASE 变量设置为 wordpress 为您的应用程序数据库提供名称。 由于这是非敏感信息,因此可以直接将其纳入"docker-compose.yml"文件. *`数量 ' : 在这里,你正在将一个被命名的[卷 (https://docs.docker.com/storage/volumes/)称为"dbdata"(dbdata)到容器上的"/var/lib/mysql"目录. 这是关于大多数分布的 MySQL 的标准数据目录.
  • 命令: 此选项指定一个命令来覆盖图像的默认 [CMD 指令] (https://docs.docker.com/engine/reference/builder/#cmd) 。 在此特定情况下, 您会在 Docker 图像的标准 ['mysqld' 命令] (https://dev.mysql.com/doc/refman/8.0/en/mysqld.html] 中添加一个选项, 启动容器上的 MySQL 服务器 。 这个选项-default-authentation-plugin=mysql_native_password',将-default-authentation-plugin'系统变量设置为`mysql_native_password',指定了对服务器的新认证请求的认证机制。 由于 PHP 和 因此您的 WordPress 图像 [不会支持] (https://github.com/docker-library/wordpress/issues/313) [MySQL 更新认证默认] (https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/),您必须进行此调整,以便认证您的应用程序数据库用户.
  • 网络: 此选项指定您的应用程序服务将加入 app- network 网络, 您将在文件底部定义 。 (英语)

接下来,在你的db服务定义下,添加你的wordpress应用程序服务的定义:

 1[label ~/wordpress/docker-compose.yml]
 2...
 3  wordpress:
 4    depends_on: 
 5      - db
 6    image: wordpress:5.1.1-fpm-alpine
 7    container_name: wordpress
 8    restart: unless-stopped
 9    env_file: .env
10    environment:
11      - WORDPRESS_DB_HOST=db:3306
12      - WORDPRESS_DB_USER=$MYSQL_USER
13      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
14      - WORDPRESS_DB_NAME=wordpress
15    volumes:
16      - wordpress:/var/www/html
17    networks:
18      - app-network

在此服务定义中,您正在命名容器并定义重新启动策略,就像您在db服务中一样。

  • `依赖': 此选项可确保您的容器按依赖性的顺序开始, " 字压 " 容器从 " db " 容器开始。 您的WordPress应用程序依赖于您的应用程序数据库和用户的存在,因此表达此依赖顺序将使您的应用程序能够正常启动.
  • 图像 : 对于这个设置,您正在使用 [5.1.1-fpm-alpine' WordPress 映像 (https://github.com/docker-library/wordpress/blob/07958d19ed465fb7fe50626be740d88a2c2260a7/php7.2/fpm-alpine/Dockerfile) 。 如[步骤1](https://andsky.com/tech/tutorials/how-to-install-wordpress-with-docker-compose#step-1-defining-the-web-server-configuration)所讨论,使用此图像可确保您的应用程序将拥有Nginx处理PHP处理所需的php-fpm'处理器。 这也是出自[Alpine Linux]项目(https://alpinelinux.org/)的 " 阿尔卑斯山 " 图像,将有助于使您的整体图像尺寸降低。 关于使用 " 阿尔卑斯 " 图像的利弊,以及这样做对您的应用是否合理,请审查[Docker Hub WordPress 图像页(https://hub.docker.com/_/wordpress)图象变体 部分的全部讨论。
  • env_file' : 您再次指定您想要从您的 . env 文件取出值, 因为您在此定义了您的应用程序数据库用户和密码 。 *环境': 在这里,您正在使用您在 .env' 文件中定义的值, 但正在将它们分配到 WordPress 图像所期望的可变名称 : WORDPRESS-DB_USER'和WORDPRESS-DB-PASWORD'。 您还在定义一个 WORDPRESS_DB_HOST , 它将是运行在 MySQL 默认端口 db 容器上的 MySQL 服务器 。 您的 WORDPRESS_DB_NAME 将与 MySQL 服务定义中为您的 MYSQL_DATABASE指定的值相同 :文字压力'. *`卷': 您正在将一卷名为 " 文字压力 " 的书刊刻在[由WordPress图像所创建的] (https://github.com/docker-library/wordpress/blob/07958d19ed465fb7fe50626be740d88a2c2260a7/php7.2/fpm-alpine/Dockerfile#L53)。 这样使用一个命名的音量,您就可以与其他容器共享您的应用程序代码 。
  • 网络: 你还在应用网络 ' 网络中增加了文字压力 ' 容器。 (英语)

接下来,在WordPress应用程序服务定义下,为您的Webserver Nginx服务添加下面的定义:

 1[label ~/wordpress/docker-compose.yml]
 2...
 3  webserver:
 4    depends_on:
 5      - wordpress
 6    image: nginx:1.15.12-alpine
 7    container_name: webserver
 8    restart: unless-stopped
 9    ports:
10      - "80:80"
11    volumes:
12      - wordpress:/var/www/html
13      - ./nginx-conf:/etc/nginx/conf.d
14      - certbot-etc:/etc/letsencrypt
15    networks:
16      - app-network

在这里,你正在命名你的容器,并使其依赖于WordPress容器的起始顺序. 你也在使用一个alpine图像 - 这个 `1.15.12-alpine’ Nginx 图像

本服务定义还包括以下选项:

  • port: 这揭示了端口 80 来启用你在你的 nginx.conf 文件中定义的配置选项在 Step 1
  • volumes:在这里,你定义了命名的卷组合和 bind monts:
  • wordpress:/var/www/conf.d:这将将你的 WordPress 应用程序代码插入 /var/www/html 目录,您将其设置为您的 Nginx 服务器块中的 root 目录。
  • ./nginx-conf:/cet/nginx/conf.d: 这将把主机上的 Nginx 配置目录插入到

您还将此容器添加到应用网络网络中。

最后,在您的webserver定义下,为certbot服务添加您最后的服务定义。

 1[label ~/wordpress/docker-compose.yml]
 2  certbot:
 3    depends_on:
 4      - webserver
 5    image: certbot/certbot
 6    container_name: certbot
 7    volumes:
 8      - certbot-etc:/etc/letsencrypt
 9      - wordpress:/var/www/html
10    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain

这个定义告诉Compose从Docker Hub中提取 certbot/certbot 图像,它还使用命名的卷与 Nginx 容器共享资源,包括在 certbot-etc 中的域证书和密钥以及在 wordpress 中的应用程序代码。

再次,您使用了depends_on来指定certbot容器应该在webserver服务运行后启动。

您还包括了一个命令选项,该选项指定一个子命令以容器的默认命令certbot运行。

  • " 网根 " : 这告诉Certbot使用webroot插件将文件放入webroot文件夹进行认证. 这个插件依赖于HTTP-01验证方法,它使用HTTP请求来证明Certbot可以从响应给定域名的服务器获取资源. *`网根路-路径': 此选项指定了 Webroot 目录的路径 。
  • 电子邮件: 您喜欢的邮件注册和恢复。
  • `-同意 ' : 这说明您同意ACME的订户协议。 电子邮件: 这告诉 Certbot 您不想与 [电子边境基金会] (https://www.eff.org/ (EFF) 共享您的电子邮件 。 随便你省省吧
  • -Stage' : 这告诉Certbot,你想要使用Let's Enterpressing的环境来获得测试证书. 使用此选项可以测试您的配置选项并避免可能的域请求限制. 关于这些限制的更多信息,请读作让我们加密`速率限制文件
  • -d': 这使得您可以指定您想要应用到您的请求中的域名 。 在这种情况下,你包括你的域'和`www.your_domain'。 一定要用自己的域名来取代这些域名. (英语)

certbot服务定义下,添加您的网络和体积定义:

 1[label ~/wordpress/docker-compose.yml]
 2...
 3volumes:
 4  certbot-etc:
 5  wordpress:
 6  dbdata:
 7
 8networks:
 9  app-network:
10    driver: bridge

您的顶级密钥定义了卷certbot-etc,wordpressdbdata。当Docker创建卷时,卷的内容被存储在主机文件系统上的一个目录中,即/var/lib/docker/volumes/,由Docker管理。

用户定义的桥梁网络应用网络允许您的集装箱之间进行通信,因为它们位于同一个 Docker 主机上。这简化了应用程序内部的流量和通信,因为它打开了同一个桥梁网络上的所有集装箱之间的端口,而不会暴露任何端口到外部世界。

以下是完整的「docker-compose.yml」文件:

 1[label ~/wordpress/docker-compose.yml]
 2version: '3'
 3
 4services:
 5  db:
 6    image: mysql:8.0
 7    container_name: db
 8    restart: unless-stopped
 9    env_file: .env
10    environment:
11      - MYSQL_DATABASE=wordpress
12    volumes: 
13      - dbdata:/var/lib/mysql
14    command: '--default-authentication-plugin=mysql_native_password'
15    networks:
16      - app-network
17
18  wordpress:
19    depends_on: 
20      - db
21    image: wordpress:5.1.1-fpm-alpine
22    container_name: wordpress
23    restart: unless-stopped
24    env_file: .env
25    environment:
26      - WORDPRESS_DB_HOST=db:3306
27      - WORDPRESS_DB_USER=$MYSQL_USER
28      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
29      - WORDPRESS_DB_NAME=wordpress
30    volumes:
31      - wordpress:/var/www/html
32    networks:
33      - app-network
34
35  webserver:
36    depends_on:
37      - wordpress
38    image: nginx:1.15.12-alpine
39    container_name: webserver
40    restart: unless-stopped
41    ports:
42      - "80:80"
43    volumes:
44      - wordpress:/var/www/html
45      - ./nginx-conf:/etc/nginx/conf.d
46      - certbot-etc:/etc/letsencrypt
47    networks:
48      - app-network
49
50  certbot:
51    depends_on:
52      - webserver
53    image: certbot/certbot
54    container_name: certbot
55    volumes:
56      - certbot-etc:/etc/letsencrypt
57      - wordpress:/var/www/html
58    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain
59
60volumes:
61  certbot-etc:
62  wordpress:
63  dbdata:
64
65networks:
66  app-network:
67    driver: bridge

保存并关闭文件,当你完成编辑。

有了服务定义,您已经准备好启动容器并测试您的证书请求。

步骤 4 – 获取SSL证书和凭证

docker-compose up 命令启动您的容器,以您指定的顺序创建和运行您的容器. 通过添加 -d 旗,命令将在背景中运行 dbwordpresswebserver 容器:

1docker-compose up -d

以下输出确认您的服务已创建:

1[secondary_label Output]
2Creating db ... done
3Creating wordpress ... done
4Creating webserver ... done
5Creating certbot   ... done

使用 docker-compose ps,检查您的服务的状态:

1docker-compose ps

一旦完成,您的db,wordpresswebserver服务将是Up,而certbot容器将以0状态消息离开:

1[secondary_label Output]
2  Name Command State Ports       
3-------------------------------------------------------------------------
4certbot certbot certonly --webroot ... Exit 0                      
5db docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
6webserver nginx -g daemon off;             Up 0.0.0.0:80->80/tcp 
7wordpress docker-entrypoint.sh php-fpm Up 9000/tcp

对于db,wordpresswebserver服务的状态列中的Upcertbot容器的0以外的输出状态意味着您可能需要使用docker-compose logs(https://docs.docker.com/engine/reference/commandline/compose_logs/)命令检查服务日志:

1docker-compose logs service_name

现在您可以检查您的证书是否已安装在webserver容器上,使用 docker-compose exec:

1docker-compose exec webserver ls -la /etc/letsencrypt/live

一旦您的证书请求成功,以下是输出:

1[secondary_label Output]
2total 16
3drwx------    3 root root 4096 May 10 15:45 .
4drwxr-xr-x 9 root root 4096 May 10 15:45 ..
5-rw-r--r--    1 root root 740 May 10 15:45 README
6drwxr-xr-x 2 root root 4096 May 10 15:45 your_domain

现在您知道您的请求将成功,您可以编辑certbot服务定义,以删除--staging旗帜。

打开docker-compose.yml:

1nano docker-compose.yml

查找包含certbot服务定义的文件部分,然后在命令选项中替换--staging旗,以--force-renewal旗,这会告诉Certbot您想要要求一个与现有证书相同的域的新证书。

 1[label ~/wordpress/docker-compose.yml]
 2...
 3  certbot:
 4    depends_on:
 5      - webserver
 6    image: certbot/certbot
 7    container_name: certbot
 8    volumes:
 9      - certbot-etc:/etc/letsencrypt
10      - certbot-var:/var/lib/letsencrypt
11      - wordpress:/var/www/html
12    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain
13...

您现在可以运行docker-compose up来重新创建certbot容器. 您还将包括--no-deps选项,以告知Compose可以跳过启动webserver服务,因为它已经运行:

1docker-compose up --force-recreate --no-deps certbot

以下输出表示您的证书请求成功:

 1[secondary_label Output]
 2Recreating certbot ... done
 3Attaching to certbot
 4certbot      | Saving debug log to /var/log/letsencrypt/letsencrypt.log
 5certbot      | Plugins selected: Authenticator webroot, Installer None
 6certbot      | Renewing an existing certificate
 7certbot      | Performing the following challenges:
 8certbot      | http-01 challenge for your_domain
 9certbot      | http-01 challenge for www.your_domain
10certbot      | Using the webroot path /var/www/html for all unmatched domains.
11certbot      | Waiting for verification...
12certbot      | Cleaning up challenges
13certbot      | IMPORTANT NOTES:
14certbot      |  - Congratulations! Your certificate and chain have been saved at:
15certbot      |    /etc/letsencrypt/live/your_domain/fullchain.pem
16certbot      |    Your key file has been saved at:
17certbot      |    /etc/letsencrypt/live/your_domain/privkey.pem
18certbot      |    Your cert will expire on 2019-08-08. To obtain a new or tweaked
19certbot      |    version of this certificate in the future, simply run certbot
20certbot      |    again. To non-interactively renew *all* of your certificates, run
21certbot      |    "certbot renew"
22certbot      |  - Your account credentials have been saved in your Certbot
23certbot      |    configuration directory at /etc/letsencrypt. You should make a
24certbot      |    secure backup of this folder now. This configuration directory will
25certbot      |    also contain certificates and private keys obtained by Certbot so
26certbot      |    making regular backups of this folder is ideal.
27certbot      |  - If you like Certbot, please consider supporting our work by:
28certbot      | 
29certbot      |    Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
30certbot      |    Donating to EFF:                    https://eff.org/donate-le
31certbot      | 
32certbot exited with code 0

有了您的证书,您可以继续修改您的 Nginx 配置以包括 SSL。

步骤 5 — 更改 Web 服务器配置和服务定义

在您的 Nginx 配置中启用 SSL 将包括将 HTTP 重定向添加到 HTTPS,指定您的 SSL 证书和关键位置,并添加安全参数和标题。

由于您将重新创建Web服务器服务以包括这些添加,您现在可以停止它:

1docker-compose stop webserver

在修改配置文件之前,请使用curl从 Certbot 获取推荐的 Nginx 安全参数:

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

此命令将将这些参数保存到名为options-ssl-nginx.conf的文件中,位于nginx-conf目录中。

接下来,删除您之前创建的 Nginx 配置文件:

1rm nginx-conf/nginx.conf

创建并打开文件的另一个版本:

1nano nginx-conf/nginx.conf

将下列代码添加到文件中,以将 HTTP 重定向到 HTTPS,并添加 SSL 凭证、协议和安全标题。

 1[label ~/wordpress/nginx-conf/nginx.conf]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        server_name your_domain www.your_domain;
 7
 8        location ~ /.well-known/acme-challenge {
 9                allow all;
10                root /var/www/html;
11        }
12
13        location / {
14                rewrite ^ https://$host$request_uri? permanent;
15        }
16}
17
18server {
19        listen 443 ssl http2;
20        listen [::]:443 ssl http2;
21        server_name your_domain www.your_domain;
22
23        index index.php index.html index.htm;
24
25        root /var/www/html;
26
27        server_tokens off;
28
29        ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
30        ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
31
32        include /etc/nginx/conf.d/options-ssl-nginx.conf;
33
34        add_header X-Frame-Options "SAMEORIGIN" always;
35        add_header X-XSS-Protection "1; mode=block" always;
36        add_header X-Content-Type-Options "nosniff" always;
37        add_header Referrer-Policy "no-referrer-when-downgrade" always;
38        add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
39        # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
40        # enable strict transport security only if you understand the implications
41
42        location / {
43                try_files $uri $uri/ /index.php$is_args$args;
44        }
45
46        location ~ \.php$ {
47                try_files $uri =404;
48                fastcgi_split_path_info ^(.+\.php)(/.+)$;
49                fastcgi_pass wordpress:9000;
50                fastcgi_index index.php;
51                include fastcgi_params;
52                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
53                fastcgi_param PATH_INFO $fastcgi_path_info;
54        }
55
56        location ~ /\.ht {
57                deny all;
58        }
59
60        location = /favicon.ico { 
61                log_not_found off; access_log off; 
62        }
63        location = /robots.txt { 
64                log_not_found off; access_log off; allow all; 
65        }
66        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
67                expires max;
68                log_not_found off;
69        }
70}

HTTP 服务器块将 Certbot 更新请求的 webroot 指定到 .well-known/acme-challenge 目录,还包括一个 重写指令,该目录将 HTTP 请求转移到 root 目录到 HTTPS。

HTTPS 服务器块允许sslhttp2。 有关 HTTP/2 如何在 HTTP 协议上迭代以及它可以对网站性能带来哪些好处的更多信息,请阅读《如何在 Ubuntu 18.04 上使用 HTTP/2 支持设置 Nginx》的介绍。

此区块还包括您的 SSL 证书和密钥位置,以及您保存到「nginx-conf/options-ssl-nginx.conf」的推荐 Certbot 安全参数。

此外,还包括一些安全标题,这些标题将允许您在 SSL LabsSecurity Headers服务器测试网站上获得 A 评级。这些标题包括 X-Frame-Options, X-Content-Type-Options, Referrer Policy, Content-Security-PolicyX-XSS-Protection

你的索引指令也位于这个块中,就像在 步骤 1中讨论的其他WordPress特定的位置块一样。

完成编辑后,保存并关闭文件。

在重建网页服务器服务之前,您需要为您的网页服务器服务定义添加一个443端口映射。

打开您的docker-compose.yml文件:

1nano docker-compose.yml

webserver服务定义中,添加以下端口绘制:

 1[label ~/wordpress/docker-compose.yml]
 2...
 3  webserver:
 4    depends_on:
 5      - wordpress
 6    image: nginx:1.15.12-alpine
 7    container_name: webserver
 8    restart: unless-stopped
 9    ports:
10      - "80:80"
11      - "443:443"
12    volumes:
13      - wordpress:/var/www/html
14      - ./nginx-conf:/etc/nginx/conf.d
15      - certbot-etc:/etc/letsencrypt
16    networks:
17      - app-network

以下是编辑后完整的docker-compose.yml文件:

 1[label ~/wordpress/docker-compose.yml]
 2version: '3'
 3
 4services:
 5  db:
 6    image: mysql:8.0
 7    container_name: db
 8    restart: unless-stopped
 9    env_file: .env
10    environment:
11      - MYSQL_DATABASE=wordpress
12    volumes: 
13      - dbdata:/var/lib/mysql
14    command: '--default-authentication-plugin=mysql_native_password'
15    networks:
16      - app-network
17
18  wordpress:
19    depends_on: 
20      - db
21    image: wordpress:5.1.1-fpm-alpine
22    container_name: wordpress
23    restart: unless-stopped
24    env_file: .env
25    environment:
26      - WORDPRESS_DB_HOST=db:3306
27      - WORDPRESS_DB_USER=$MYSQL_USER
28      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
29      - WORDPRESS_DB_NAME=wordpress
30    volumes:
31      - wordpress:/var/www/html
32    networks:
33      - app-network
34
35  webserver:
36    depends_on:
37      - wordpress
38    image: nginx:1.15.12-alpine
39    container_name: webserver
40    restart: unless-stopped
41    ports:
42      - "80:80"
43      - "443:443"
44    volumes:
45      - wordpress:/var/www/html
46      - ./nginx-conf:/etc/nginx/conf.d
47      - certbot-etc:/etc/letsencrypt
48    networks:
49      - app-network
50
51  certbot:
52    depends_on:
53      - webserver
54    image: certbot/certbot
55    container_name: certbot
56    volumes:
57      - certbot-etc:/etc/letsencrypt
58      - wordpress:/var/www/html
59    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain
60
61volumes:
62  certbot-etc:
63  wordpress:
64  dbdata:
65
66networks:
67  app-network:
68    driver: bridge

保存并关闭文件,当你完成编辑。

重建Web服务器服务:

1docker-compose up -d --force-recreate --no-deps webserver

点击查看docker-compose ps的服务:

1docker-compose ps

输出应该表明您的db,wordpresswebserver服务正在运行:

1[secondary_label Output]
2  Name Command State Ports                  
3----------------------------------------------------------------------------------------------
4certbot certbot certonly --webroot ... Exit 0                                           
5db docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp                     
6webserver nginx -g daemon off;             Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
7wordpress docker-entrypoint.sh php-fpm Up 9000/tcp

随着您的容器运行,您可以通过 Web 界面完成您的 WordPress 安装。

步骤 6 – 通过 Web 界面完成安装

随着容器运行,通过WordPress Web接口完成安装。

在您的网页浏览器中,导航到您的服务器的域名. 请记住用自己的域名替换 your_domain:

1https://your_domain

选择您想要使用的语言:

WordPress Language Selector

点击 继续 后,您将登陆主设置页面,在那里您需要为您的网站选择一个名称和用户名。这里选择一个值得记住的用户名(而不是admin)和一个强大的密码是一个好主意。

最后,您需要输入您的电子邮件地址并决定是否想阻止搜索引擎索引您的网站:

WordPress Main Setup Page

点击页面底部的 安装WordPress 将带您到一个登录提示:

WordPress Login Screen

一旦登录,您将可以访问WordPress管理仪表板:

WordPress Main Admin Dashboard

当您的 WordPress 安装完成后,您可以采取步骤确保您的 SSL 证书自动更新。

第7步:更新证书

Let's Encrypt 证书有效期为 90 天. 您可以设置一个自动更新过程,以确保它们不会过期。 这样做的一种方法是使用「cron」编程工具创建工作。

首先,打开一个名为 `ssl_renew.sh 的脚本:

1nano ssl_renew.sh

将以下代码添加到脚本中,以更新您的证书并重新加载您的 Web 服务器配置。

1[label ~/wordpress/ssl_renew.sh]
2#!/bin/bash
3
4COMPOSE="/usr/local/bin/docker-compose --no-ansi"
5DOCKER="/usr/bin/docker"
6
7cd /home/sammy/wordpress/
8$COMPOSE run certbot renew --dry-run && $COMPOSE kill -s SIGHUP webserver
9$DOCKER system prune -af

此脚本首先将docker-compose二进制分配给一个名为COMPOSE的变量,并指定了--no-ansi选项,该选项将运行docker-compose命令而无 ANSI 控制字符

  • docker-compose run:这将启动一个 certbot 容器,并忽略在你的 certbot 服务定义中提供的 命令。 使用 certonly子命令而不是renew子命令,这将更新即将到期的证书。 还包含了--dry-run` 选项来测试你的脚本。
  • docker-compose kill:这将向 webserver 容器发送一个 SIGHUP 信号来重新加载 Nginx 配置。

然后运行 docker system prune来删除所有未使用的容器和图像。

完成编辑后关闭文件,使用以下命令使其可执行:

1chmod +x ssl_renew.sh

接下来,打开您的 root crontab 文件以在指定间隔运行更新脚本:

1sudo crontab -e

如果这是你第一次编辑这个文件,你将被要求选择一个编辑器:

 1[secondary_label Output]
 2no crontab for root - using an empty one
 3
 4Select an editor. To change later, run 'select-editor'.
 5  1. /bin/nano        <---- easiest
 6  2. /usr/bin/vim.basic
 7  3. /usr/bin/vim.tiny
 8  4. /bin/ed
 9
10Choose 1-4 [1]:
11...

在这个文件的底部,添加下面的行:

1[label crontab]
2...
3*/5 * * * * /home/sammy/wordpress/ssl_renew.sh >> /var/log/cron.log 2>&1

这会将工作间隔设置为每五分钟,这样你就可以测试你的更新请求是否按预期工作了。

五分钟后,检查cron.log,确认更新请求是否成功:

1tail -f /var/log/cron.log

下面的结果证实了成功的更新:

 1[secondary_label Output]
 2- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 3** DRY RUN: simulating 'certbot renew' close to cert expiry
 4**          (The test certificates below have not been saved.)
 5
 6Congratulations, all renewals succeeded. The following certs have been renewed:
 7  /etc/letsencrypt/live/your_domain/fullchain.pem (success)
 8** DRY RUN: simulating 'certbot renew' close to cert expiry
 9**          (The test certificates above have not been saved.)
10- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

在您的终端中输入CTRL+C

例如,要在中午每天运行脚本,你会修改文件的最后一行,如下:

1[label crontab]
2...
30 12 * * * /home/sammy/wordpress/ssl_renew.sh >> /var/log/cron.log 2>&1

您还需要从您的ssl_renew.sh脚本中删除--dry-run选项:

1[label ~/wordpress/ssl_renew.sh]
2#!/bin/bash
3
4COMPOSE="/usr/local/bin/docker-compose --no-ansi"
5DOCKER="/usr/bin/docker"
6
7cd /home/sammy/wordpress/
8$COMPOSE run certbot renew && $COMPOSE kill -s SIGHUP webserver
9$DOCKER system prune -af

你的cron工作将确保你的 Let's Encrypt 证书不会过期,当它们符合条件时,你也可以 设置 Logrotate 实用程序的日志旋转来旋转和压缩你的日志文件。

结论

在本教程中,您使用 Docker Compose 创建了使用 Nginx 网页服务器的 WordPress 安装。作为此工作流的一部分,您获得了您想要与您的 WordPress 网站相关联的域的 TLS/SSL 证书。

作为改善网站性能和失业的额外步骤,您可以参阅以下有关交付和备份WordPress资产的文章:

如果您对使用 Kubernetes 探索集装箱化工作流感感兴趣,您还可以查看:

【如何在Kubernetes上使用头盔设置WordPress】(https://andsky.com/tech/tutorials/how-to-set-up-wordpress-with-mysql-on-kubernetes-using-helm)

Published At
Categories with 技术
comments powered by Disqus