====== 使用 Docker 配置 VPS ======
今天我正式把自己的网页使用 Docker 来管理配置。并且,把域名里的子目录全部改成了二级域名的格式,因为用同一套 Nginx 给不同的子目录做配置实在是太麻烦了,不如通过二级域名反代到不同的本地服务上,更加清晰、优雅。 --- //[[hi@liuf.net|刘丰]] 2024/08/13 09:47//
===== 服务器配置 =====
我在一台Linode新的VPS实例上进行操作实验,测试成功后在目前部署在腾讯云的服务器上面进行了配置。两者的操作系统都是 Debian 12(测试过 Ubuntu 24.04 出过问题),登录后先更新系统,创建普通用户。
如果需要配置服务器时区,可以使用[[vpsnotes#修改时区|这里]]的命令。
===== 安装 Docker =====
Docker 在软件仓库有多个版本,我最终选择了官网上的[[https://docs.docker.com/engine/install/debian/#install-using-the-repository|安装方式]]:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
===== 配置 Nginx Proxy Manager =====
Nginx Proxy Manager(NPM)是一个通过 web 前端进行 Nginx 配置的工具,我这次刚刚知道。有了它就不需要自己编写 Nginx 的配置文件了,这还不算厉害,它可以自动配置 Let's Encrypt 的加密证书就让我很震惊了。因为我之前几次配置失败,很多就是 SSL 配置不好的原因。
[[https://elinzy.com/archives/5558853a-cadf-432c-9c55-5cff20eb69ad|这篇文章]]写得非常详细,我就是按照里面的方法进行安装的。
首先创建服务的配置文件夹:mkdir -p ~/docker/npm
在这个文件夹里面创建 Docker Compose 配置文件:
services:
app:
image: 'chishin/nginx-proxy-manager-zh:release'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
# network_mode: "host"
我是用的汉化的版本,因此镜像名称与官方网站上的不一样。据网站上说://中文镜像并没有重新构建后端代码,由[[https://github.com/xiaoxinpro/nginx-proxy-manager-zh/blob/develop-zh/docker/Dockerfile-zh|Dockerfile-zh]]文件可以得知,中文镜像基于官方镜像替换前端代码来实现的,所以中文版本的全部功能与官方版本完全相同,只是显示界面的文字不同的区别。//
最后在同一文件夹中启动服务:sudo docker compose up -d
正常情况下,访问 ''http://liuf.net:81'' 就可以进入 NPM 的管理后台,第一次登录的用户名是''admin@example.com'',密码是''changme'',进去后会让你设置名称、邮箱与管理员密码。**但是**,我在腾讯云上面配置好后遇到了无法访问的情况,最终发现是腾讯云默认有防火墙,只开通了几个端口。在腾讯云的后台把81端口开放后就可以访问了。
==== 配置通配符证书 ====
NPM可以给每一个创建的子域名申请SSL证书,但是更推荐为自己的根域名申请一个通配符证书。一般来说,我的经验是进入NPM后第一件事,先申请证书。[[https://akau.cn/8108.html|这篇文章]]中说的挺详细,可以参考执行。我遇到的问题就是选中了使用DNS认证后,选择我进行域名解析的供应商DNSPod,之后需要填写认证信息。邮件是我的电子邮箱,下面的token一定不要与DNSPod中的腾讯云API弄混了,我一开始就犯了这个错误,导致一直不通过。做好正确的id与token配置后,就可以顺利进行了。此外,我看网上的案例,域名那里要填''*.liuf.net, liuf.net''两个,我一开始忘记了不带星的,但也没有遇到问题。后来还是按照网上说的,带星的不带星的都放上去了。我还没有找到明确的这样做的原因,但印象里之前很早配置VPS的时候这样弄过,好像为了规避什么问题,所以我也这样做了。
==== 配置 NPM 前端入口 ====
为了方便使用并且提升安全性,配置个NPM的前端入口。在域名解析那里加一个''npm.liuf.net''的二级域名,解析到服务器的IP地址,然后在NPM后台新增一个代理服务,在*详细内容*选项卡中,配置域名为''npm.liuf.net'',协议默认为''http''即可,转发主机配''0.0.0.0'',转发端口设''81''。下方的缓存资源、阻止常见漏洞、支持WebSockets三个选项都打开。在*SSL*选项卡中,SSL证书选择刚创建的''*.liuf.net, liuf.net'',下方的强制SSL,支持HTTP/2选项卡都打开,之后点保存,即可通过''npm.liuf.net''这个域名来访问NPM管理后台。
===== 配置静态页面 =====
新建一个代理服务,*详细内容*标签页,域名填''liuf.net'',协议默认''http'',转发主机IP填''0.0.0.0'',转发端口填''80'',下面三个开关都选中;*SSL*标签页,选择之前创建的通配符证书,选中下面的''强制SSL''和''支持HTTP/2''两个开关;*高级*标签页,填入如下自定义配置:
location / {
root /data/static;
}
location ~* ^/blog/ {
rewrite ^/blog/(.*)$ https://blog.liuf.net/$1 permanent;
}
location ~* ^/wiki/ {
rewrite ^/wiki/(.*)$ https://wiki.liuf.net/$1 permanent;
}
第一块是静态页面的路径,之后记得创建''~/docker/npm/data/static''目录,静态内容都放在里面。后两块是之前博客URL的跳转。填好后点保存。
===== 配置 WordPress =====
创建运行配置文件夹''~/docker/wordpress'',并在里面创建''docker-compose.yml'':
services:
db:
image: mysql:8.0 # arm架构的机器请将mysql:5.7改为mysql:oracle
# container_name: wordpress-db
restart: unless-stopped
command: --max-binlog-size=200M --expire-logs-days=2 # 使用mysql 8.0的小伙伴建议使用
environment:
MYSQL_ROOT_PASSWORD: rootpassword # 按需修改
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: dbpassword # 按需修改
volumes:
- './db:/var/lib/mysql'
networks:
- default
app:
image: wordpress:latest
# container_name: wordpress-app
restart: unless-stopped
ports:
- 4145:80 # 按需修改。与防火墙开放端口一致。
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: dbpassword # 按需修改
volumes:
- './app:/var/www/html'
links:
- db:db
depends_on:
- redis
- db
networks:
- default
redis:
image: redis:alpine
# container_name: wordpress-redis
restart: unless-stopped
volumes:
- ./redis-data:/data
networks:
- default
networks:
default:
name: wordpress
里面有三处密码的地方可以修改,一个是MySQL实例的root密码,两个是wordpress数据库的访问密码。其实都是在这一个文件里面,改动的问题不大。最后执行命令创建并启动服务:
sudo docker compose up -d
之后访问''liuf.net:4145''就能看到WordPress的安装界面了。不过这个时候不要操作,不然WordPress会记录当前的网址,这是我们不希望的。我们先配置好了Nginx反代,之后用正式的域名进入安装。
==== 配置 NPM 反向代理 ====
NPM中创建一个新代理服务,*详细内容*页面里,域名填''blog.liuf.net'',协议选默认''http'',转发主机IP填''172.17.0.1'',转发端口填''4145''与docker的配置文件中一致,下面的三个开关都打开;在*SSL*页面中选上我们创建的通配符证书,打开强制与''支持HTTP/2''两个开关,之后点保存。
这个转发主机的IP地址要填写Docker服务的,我一开始没仔细看,填了127.0.0.1,完全不通过,发现之后就没问题了。这个IP地址可以用这个命令来查询:ip addr show docker0
==== 安装并配置 WordPress ====
访问''https://blog.liuf.net'',安装WordPress。调整docker实例中的PHP上传文件大小限制,否则无法导入之前WordPress的导出文件。[[https://blog.csdn.net/liangdingguo/article/details/127488661|这个页面]]写的挺详细,我就是参照它来操作的。
首先,查看实例的id,通过这个命令获得:sudo docker ps
之后进入这个实例:sudo docker exec -it <实例id> /bin/bash
因为我们要编辑配置文件,而实例中没有编辑器,所以先安装 Neovim:
apt update
apt install neovim
需要先刷新软件仓库才能安装。
之后复制 PHP 配置文件:cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
修改这个文件里的两处内容:
upload_max_filesize = 20M #文件大小限制
post_max_size = 80M #post大小限制
按 Ctrl+D 退出实例,重启实例:sudo docker restart <实例id>
之后可在WordPress进行导入操作。而且在这一步,不知道从哪个版本开始,支持自动导入资源,原本的图片都从之前的服务器复制了过来,并导入了WordPress进行管理,网址也正常。然后照着之前安装并启用插件、模板,并完成微调。我的WordPress使用了如下插件:
* Akismet 反垃圾评论:垃圾评论保护
* Parsedown for WordPress
* WP-Syntax
* 年度归档
* 经典编辑器
* Redis Object Cache
最后一个插件是这次新装的,根据[[https://blognas.hwb0307.com/linux/docker/238|这篇文章]]中的说明进行了配置。
我的WordPress继续使用GeneratePress模板,从后台安装即可。我习惯使用霞鹜文楷,在WordPress后台——外观——主题文件编辑器中,编辑''主题页眉(header.php)''文件,在''
此外,Umami Analytics的跟踪代码也可以插在字体配置代码的后面。
其他的调整就手动进行吧,比如favicon配置,在WordPress后台很多都可以直接设置了。
===== 配置 DokuWiki =====
因为没涉及数据库,DokuWiki更加简单。首先创建配置目录''~/docker/doku'',并在里面创建''docker-compose.yml''文件:
services:
dokuwiki:
image: dokuwiki/dokuwiki:stable
ports:
- "4292:8080"
environment:
PHP_TIMEZONE: Asia/Shanghai
volumes:
- ./storage:/storage
之后运行命令创建并启动实例:sudo docker compose up -d
然后在NPM中创建代理,与上面一样,除了端口号是4292,就不赘述了。
最后想办法把之前DokuWiki的''conf''、''data''、''lib''三个文件夹复制到创建的''storage''文件夹下面就可以了,简单粗暴。或许有更细致的方法,我没有尝试。至少我这么操作之后,之前全部的内容、配置什么的都过来了。