wordpress简介
WordPress是一个免费的开源内容管理系统CMS建立在具有PHP处理功能的MYSQL数据库上。凭借其可扩展的插件体系结构和模板系统,以及其大部分管理都可以通过Web界面完成的事实,当创建从博客到产品页面再到电子商务网站的各种类型的网站时,WordPress是一种流行的选择。
运行WordPress通常涉及安装LAMP(Linux,Apache,MySQL和PHP)或LEMP(Linux,Nginx,MySQL和PHP)堆栈,这可能很耗时。但是,通过使用诸如Docker和Docker Compose之类的工具,您可以简化设置首选堆栈和安装WordPress的过程。您可以使用images来标准化诸如库,配置文件和环境变量之类的图像,而不是手动安装单个组件,并在容器中运行这些图像,在共享操作系统上运行的隔离进程。此外,通过使用Compose,您可以协调多个容器(例如,一个应用程序和数据库)以相互通信。
在本教程中,您将构建多容器WordPress安装。您的容器将包括一个MySQL数据库,一个Nginx Web服务器和WordPress本身。您还可以通过“加密”获取要与站点关联的域的TLS / SSL证书来保护安装。最后,您将设置一个cron
工作来续订证书,以便您的域保持安全。
先决条件
要遵循本教程,您将需要:
- 安装Docker以及Docker-compose
- git
步骤1 —定义Web服务器配置
在运行任何容器之前,我们的第一步将是为Nginx Web服务器定义配置。我们的配置文件将包括一些WordPress特定的位置块,以及将“加密”验证请求定向到Certbot客户端以进行自动证书更新的位置块。
首先,为您的WordPress设置创建一个名为的项目目录,wordpress
并导航至该目录:
mkdir wordpress && cd wordpress
接下来,为配置文件创建目录:
mkdir nginx-conf
在此文件中,我们将添加一个服务器块,其中包含用于我们的服务器名称和文档根的指令,以及用于指示Certbot客户端对证书,PHP处理和静态资产请求的指令的位置块。
将以下代码粘贴到文件中。确保kubemaster.top
用您自己的域名替换:
touch nginx-conf/nginx.conf
然后编辑配置文件:
server {
listen 80;
server_name kubemaster.top www.kubemaster.top;
index index.php index.html index.htm;
root /var/www/html;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
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;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
我们的服务器块包含以下信息:
指令:
listen
:这告诉Nginx监听port80
,这将允许我们使用Certbot的webroot插件来进行证书请求。请注意,我们尚未包括端口443
-成功获得证书后,我们将更新配置以包括SSL。server_name
:这定义了您的服务器名称和用于请求服务器的服务器块。确保kubemaster.top
在此行用您自己的域名替换。index
:index
伪指令定义了在处理对服务器的请求时将用作索引的文件。我们在此处修改了默认的优先级顺序,将其移到了优先级的index.php
前面,index.html
以便Nginxindex.php
在可能的情况下对调用的文件进行优先级排序。root
:我们的root
指令将根目录命名为对我们服务器的请求。这个目录中,/var/www/html
被作为挂载点的创建由我们的指示在构建时的WordPress Dockerfile。这些Dockerfile指令还确保将WordPress版本中的文件安装到该卷上。
定位块:
location ~ /.well-known/acme-challenge
:此位置块将处理对.well-known
目录的请求,Certbot将在该目录中放置一个临时文件,以验证我们域的DNS可以解析到我们的服务器。有了此配置后,我们将能够使用Certbot的webroot插件来获取我们域的证书。location /
:在此位置块中,我们将使用try_files
指令检查与单个URI请求匹配的文件。Not Found
但是,我们不会使用默认参数返回404状态,而是将控制权传递给WordPress的index.php
文件。location ~ \.php$
:此位置块将处理PHP处理并将这些请求代理到我们的wordpress
容器。因为我们的WordPress Docker映像将基于该php:fpm
映像,所以我们还将在此块中包含特定于FastCGI协议的配置选项。Nginx需要一个独立的PHP处理器来处理PHP请求:在我们的示例中,这些请求将由映像php-fpm
随附的处理器处理php:fpm
。此外,此位置块包括特定于FastCGI的指令,变量和选项,这些指令会将请求代理到运行在我们wordpress
容器中的WordPress应用程序,设置已解析请求URI的首选索引以及解析URI请求。location ~ /\.ht
:此块将处理.htaccess
文件,因为Nginx无法提供文件。该deny_all
指令确保.htaccess
文件永远不会提供给用户。location = /favicon.ico
,location = /robots.txt
:这些块确保对/favicon.ico
和的请求/robots.txt
都不会被记录。location ~* \.(css|gif|ico|jpeg|jpg|js|png)$
:此块关闭了静态资产请求的日志记录,并确保这些资产具有很高的可缓存性,因为它们的服务成本通常很高。
准备Docker-compose配置清单
version: '3'
services:
db:
image: mysql:8.0
container_name: db
restart: unless-stopped
env_file: .env
environment:
- MYSQL_DATABASE=wordpress
volumes:
- dbdata:/var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
networks:
- app-network
wordpress:
depends_on:
- db
image: wordpress:5.2.1-fpm-alpine
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=$MYSQL_USER
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
- WORDPRESS_DB_NAME=wordpress
volumes:
- wordpress:/var/www/html
networks:
- app-network
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /webserver/nginx18/config:/etc/nginx
- wordpress:/var/www/html
- /webserver/nginx18/data:/usr/share/nginx
- certbot-etc:/etc/letsencrypt
networks:
- app-network
volumes:
certbot-etc:
wordpress:
dbdata:
networks:
app-network:
driver: bridge
以上部署了wordpress
、mysql
、nginx
三个服务,这三个服务的数据均是通过volume
提供,因此我们需要对这些目录进行备份,分别为:
- wordpress
- dbdata
[root@10-255-20-45 wordpress]# docker inspect wordpress_wordpress
[
{
"CreatedAt": "2021-05-08T16:18:45+08:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "wordpress",
"com.docker.compose.version": "1.26.2",
"com.docker.compose.volume": "wordpress"
},
"Mountpoint": "/var/lib/docker/volumes/wordpress_wordpress/_data",
"Name": "wordpress_wordpress",
"Options": null,
"Scope": "local"
}
]
[root@10-255-20-45 wordpress]# docker inspect wordpress_dbdata
[
{
"CreatedAt": "2021-05-08T16:12:46+08:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "wordpress",
"com.docker.compose.version": "1.26.2",
"com.docker.compose.volume": "dbdata"
},
"Mountpoint": "/var/lib/docker/volumes/wordpress_dbdata/_data",
"Name": "wordpress_dbdata",
"Options": null,
"Scope": "local"
}
]
然后将wordpress的代码数据提交到git
cd /var/lib/docker/volumes/wordpress_wordpress/_data
git init
git remote add origin https://github.com/marionxue/wp.git
git add .
git submodule add https://github.com/LuRenJiasWorld/wp-settings-api-class.git wp-content/plugins/wp-editormd/vendor/lurenjiasworld/wp-settings-api-class
git commit -am "init wordpress site"
git config --global user.email "marionxue@qq.com"
git config --global user.name "marionxue"