Skip to content
Go back

使用 Docker 部署 MySQL + WordPress 并安装 OneNav 一为导航

| 0 Views Edit page

前言

账单发来的时候才发现还有个 steam.cash 域名,原本以为都抛完了。恰巧看到一为导航打折,索性就把域名利用起来做个导航页吧。
用的是闲置的斯巴达 2H2G 云服务器,系统为 Ubuntu 20.04,将会安装 Docker 并运行 MySQL 和 WordPress 容器,并使用 acme.sh 申请 SSL 证书,算是很完整的一次实践了。


方案概述

  1. 安装 Docker 环境
  2. 运行 MySQL 容器
  3. 运行 WordPress 容器
  4. 访问页面安装 WordPress
  5. 安装 Nginx
  6. 安装 acme.sh
  7. 申请和安装 SSL 证书
  8. 安装 OneNav 一为导航

操作步骤

一、安装 Docker 环境

参考:Ubuntu 20.04 从官方源安装最新的 Docker

二、运行 MySQL 容器

映射关系:

宿主机端口容器内端口备注
33063306数据库连接端口
宿主机目录容器内目录备注
/var/log/mysql/var/log/mysqlMySQL 日志文件
/rab/docker/mysql/data/var/lib/mysqlMySQL 数据文件
/rab/docker/mysql/config/etc/mysqlMySQL 配置文件
# 创建映射用的目录
mkdir -vp /rab/docker/mysql/data
mkdir -vp /rab/docker/mysql/config
# 启动容器
docker run -d \
  --name mysql \
  --privileged=true \
  --restart=unless-stopped \
  -p 3306:3306 \
  -v /var/log/mysql:/var/log/mysql \
  -v /rab/docker/mysql/data:/var/lib/mysql \
  -v /rab/docker/mysql/config:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD="EnM4K=b):k@U*Nr9Y" \
  mysql:5.7

之后进入容器创建下 wordpress 数据库:

docker exec -it mysql /bin/bash

在容器内登录数据库:

mysql -u root -p

之后输入密码,然后创建数据库:

create database wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO 'root'@'localhost' IDENTIFIED BY 'EnM4K=b):k@U*Nr9Y';
flush privileges;
show databases;

之后退出 MySQL 命令行,再退出容器回到宿主机。

三、运行 WordPress 容器

WordPress 前端映射到了宿主机的 8080 端口。
通过 --link mysql 连接到 MySQL 容器,这样 WordPress 进程默认访问 localhost:3306 的时候就能连接到数据库了。

# 创建映射用的目录
mkdir -vp /rab/docker/wordpress/html
# 启动容器
docker run -d \
  --name wordpress \
  --restart=unless-stopped \
  -p 8080:80 \
  -v /rab/docker/wordpress/html:/var/www/html \
  -e WORDPRESS_DB_NAME=wordpress \
  -e WORDPRESS_DB_USER=root \
  -e WORDPRESS_DB_PASSWORD="EnM4K=b):k@U*Nr9Y" \
  --link mysql \
  wordpress:latest

之后进入容器修改下 upload_max_filesizepost_max_size 的值:

docker exec -it wordpress /bin/bash
# 设置 PHP 上传文件大小并创建配置文件
echo "upload_max_filesize = 20M" > /usr/local/etc/php/conf.d/uploads.ini
# 设置 PHP POST 数据大小
echo "post_max_size = 20M" >> /usr/local/etc/php/conf.d/uploads.ini

然后退出容器回到宿主机,之后再重启下 WordPress 容器:

docker restart wordpress

这里如果不设置 upload_max_filesizepost_max_size 的话,WordPress 上传文件大小会受限制,同时在后续操作时可能会出现 上传的文件大小超过 php.ini 文件中定义的 upload_max_filesize 值。 错误。

四、访问页面安装 WordPress

由于已经指定了数据库连接,因此这里配置下用户密码即可,站点信息之后都能修改。
图片就不放了。

如果出现 Error establishing a database connection 错误的话,可能是你数据库连接信息填错了,也可能是表没有创建或是权限有问题,请参照我上面的流程进行修复。

五、安装 Nginx

参考:Installing Prebuilt Ubuntu Packages
之后隐藏默认证书的时候需要用到新的配置项。

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
  http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
  | sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
  | sudo tee /etc/apt/preferences.d/99nginx
sudo apt update
sudo apt install nginx
systemctl enable nginx
systemctl start nginx

六、安装 acme.sh

# 安装所需软件
apt-get install curl
apt-get install socat
# 安装 acme
curl https://get.acme.sh | sh
# 添加软链接
ln -s  /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
# 切换 CA 机构
acme.sh --set-default-ca --server letsencrypt

七、申请和安装证书

先修改下 Nginx 的默认配置文件 /etc/nginx/conf.d/default.conf

mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
vi /etc/nginx/conf.d/default.conf

文件内容:

# 非域名访问返回 500 错误
server {
    listen      80;
    listen      [::]:80;
    server_name _;

    location / {
        return      500;
    }

    # 特殊的证书认证用的路径
    location /.well-known/acme-challenge/ {
        # acme.sh --webroot 模式,认证文件生成后放置的路径
        root /var/acme/webroot/;
    }
}

# 非域名访问防止发送 SSL 证书
server {
    listen      443 ssl default_server;
    server_name _;
 
    ssl_protocols           TLSv1.2 TLSv1.3;
    # 启用拒绝 TLS 握手
    ssl_reject_handshake    on;
    # SSL Session 缓存,不设置的话无缓存配置不生效
    ssl_session_cache       shared:SSL:10m;
    ssl_session_timeout     10m;

    # log 位置自行替换
    access_log  /var/log/nginx/host.access.log;
}

重启下 Nginx:

nginx -s reload
service nginx restart

然后申请下证书:

# 申请证书
acme.sh --issue -d steam.cash --webroot /var/acme/webroot/ --force
mkdir -vp /etc/nginx/ssl/steam.cash/
# 安装证书
acme.sh --install-cert -d steam.cash \
  --fullchain-file /etc/nginx/ssl/steam.cash/certificate.crt \
  --key-file /etc/nginx/ssl/steam.cash/private.key  \
  --reloadcmd "service nginx force-reload"

然后在 /etc/nginx/conf.d/ 目录里创建个 steam.cash 域名用的配置文件:

vi /etc/nginx/conf.d/steam.cash.conf

文件内容:

server {
    listen      80;
    server_name steam.cash;

    # 强制跳转 HTTPS
    location / {
        return 301 https://$server_name$request_uri;
    }

    # 设置证书认证用的路径
    location /.well-known/acme-challenge/ {
        # acme.sh --webroot 模式,认证文件生成后放置的路径
        root /var/acme/webroot/;
    }
}

server {
    listen      443 ssl;
    server_name steam.cash;

    # SSL 配置
    ssl_certificate             /etc/nginx/ssl/steam.cash/certificate.crt;
    ssl_certificate_key         /etc/nginx/ssl/steam.cash/private.key;
    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                 ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

    location / {
        proxy_pass  http://127.0.0.1:8080;
        # 防止出现 413 Request Entity Too Large 的问题
        client_max_body_size 20m;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

之后再重启下 Nginx:

nginx -s reload
service nginx restart

如果出现 nginx: [emerg] unknown "connection_upgrade" variable 错误的话,需要修改下 nginx.conf

vi /etc/nginx/nginx.conf

http 代码段中添加下面内容:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

这步做完,访问你的网址 https://steam.cash 应该就能看到 SSL 生效的 WordPress 页面了:
WordPress 页面

八、安装 OneNav 一为导航

一为导航官网:https://www.iotheme.cn
安装教程:主题如何上传至网站?

首先当然需要进行购买和授权:
填入授权域名
然后下载主题包:
点击下载按钮
就能得到一个类似 onenav.xxxxx.42xxxxxxxxxxxxxxxxxxxxxx65==.zip 的文件。
回到 WordPress 后台,点击 外观 -> 主题 -> 安装新主题 -> 上传主题,选择刚刚下载的主题包上传并安装:
上传主题
上传完成后,点击立即安装:
安装完成
等待安装完成后,启用主题:
启用主题
之后到主题设置处填入授权码(激活码): 填入授权码
授权完成后,回到主页就能看到主题生效了:
主题生效

主题自定义和内容填充可以参考官方文档:One Nav 主题开始使用,新手教程

涉及生产数据,之后的操作就不掩饰了,结束。


参考资料:


Edit page