前言
账单发来的时候才发现还有个 steam.cash 域名,原本以为都抛完了。恰巧看到一为导航打折,索性就把域名利用起来做个导航页吧。
用的是闲置的斯巴达 2H2G 云服务器,系统为 Ubuntu 20.04,将会安装 Docker 并运行 MySQL 和 WordPress 容器,并使用 acme.sh 申请 SSL 证书,算是很完整的一次实践了。
方案概述
- 安装 Docker 环境
- 运行 MySQL 容器
- 运行 WordPress 容器
- 访问页面安装 WordPress
- 安装 Nginx
- 安装 acme.sh
- 申请和安装 SSL 证书
- 安装 OneNav 一为导航
操作步骤
一、安装 Docker 环境
参考:Ubuntu 20.04 从官方源安装最新的 Docker
二、运行 MySQL 容器
映射关系:
| 宿主机端口 | 容器内端口 | 备注 |
|---|---|---|
| 3306 | 3306 | 数据库连接端口 |
| 宿主机目录 | 容器内目录 | 备注 |
|---|---|---|
| /var/log/mysql | /var/log/mysql | MySQL 日志文件 |
| /rab/docker/mysql/data | /var/lib/mysql | MySQL 数据文件 |
| /rab/docker/mysql/config | /etc/mysql | MySQL 配置文件 |
# 创建映射用的目录
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_filesize 和 post_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_filesize和post_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 页面了:

八、安装 OneNav 一为导航
一为导航官网:https://www.iotheme.cn
安装教程:主题如何上传至网站?
首先当然需要进行购买和授权:

然后下载主题包:

就能得到一个类似 onenav.xxxxx.42xxxxxxxxxxxxxxxxxxxxxx65==.zip 的文件。
回到 WordPress 后台,点击 外观 -> 主题 -> 安装新主题 -> 上传主题,选择刚刚下载的主题包上传并安装:

上传完成后,点击立即安装:

等待安装完成后,启用主题:

之后到主题设置处填入授权码(激活码):

授权完成后,回到主页就能看到主题生效了:

主题自定义和内容填充可以参考官方文档:One Nav 主题开始使用,新手教程
涉及生产数据,之后的操作就不掩饰了,结束。
参考资料: