记录在 Docker 中的搭建 WordPress 的小尝试

记录在 Docker 中的搭建 WordPress 的小尝试

技术 1400 字 / 3 分钟
AI 总结 以下AI总结内容由腾讯混元大模型生成

本文主要记录了作者在 Docker 中搭建 WordPress 的过程,包括解决 PHP 扩展、Nginx 文件类型错误解析漏洞、MySQL 天坑、权限问题以及 Nginx 配置等方面的内容。最终,作者成功地将 WordPress 从旧服务器迁移到了自己的阿里云学生机,并解决了所有遇到的问题。

  1. Docker 安装与配置:作者之前使用宝塔面板管理网站,但觉得不够高级,因此选择使用 Docker。在 Docker 中安装 PHP 时,作者通过进入 PHP 容器和执行特定命令来安装扩展,如mysqli和pdo_mysql。

  2. 解决 Nginx 错误:在安装 WordPress 时,作者遇到了 Nginx 文件类型错误解析漏洞,导致网站无法正常运行。通过修改 PHP 配置文件,作者解决了这个问题。

  3. MySQL 8 天坑:作者在尝试使用 MySQL 8 时遇到了问题,最终决定将其替换为 MySQL 5.6。在这个过程中,作者利用了 Docker 中容器的链接关系,顺利地迁移了数据库。

  4. 权限问题:在安装 WordPress 和配置 Nginx 时,作者遇到了权限不足的问题。通过修改文件权限和用户组,作者解决了这些问题。

  5. Nginx 配置:作者对 Nginx 进行了一些配置优化,包括启用 URL 重写、去除 index.php、开启 HTTPS 以及限制 IP 访问。

总结: 本文详细记录了作者在 Docker 中搭建 WordPress 的过程,包括解决各种技术和配置问题。最终,作者成功地将 WordPress 迁移到了自己的阿里云学生机,并确保了网站的稳定性和安全性。

事情是这样的

我的这个博客 Light Cube,从 2017 年 3 月迁移到老薛主机以来,速度和稳定性越来越差。因此我想将其迁移到我阿里云的学生机上。 想着自己都是个大学生了,如果再用宝塔面板这种可视化界面未免就有点 low 了。 因此,我选择了 Docker,这一选择让我又爱又恨。爱它的操作便捷,恨它的配置奇葩。 趁着这会儿 github.red 域名还在备案,我先自己尝试一下。

PHP 开启 Mysqli 扩展

Docker 中的原生 PHP 镜像是不带任何扩展的纯净版,我们可以随便写一个phpinfo()来看一下,扩展少得可怜。 然而,Docker 中官方 PHP 镜像安装扩展的方法与正常在 Linux 上的是不同的。或者说,在 Docker 上更为方便。 首先先进入 PHP 容器:

docker exec -it php bash

切换到相关目录下:

cd /usr/local/bin

之后就很舒服了,想装什么装什么,我这里以 MySQL 为例:

./docker-php-ext-install pdo_mysql
./docker-php-ext-install mysqli

解决 Nginx 文件类型错误解析漏洞

这是刚开始弄的时候突然跳出来的问题——所有的站都挂了,也不知道是为什么会这样,好像是和 PHP 的超全局变量$_SERVER['PHP_SELF']有关。 问了下百度,解决的办法是修改 PHP 的配置文件 php.ini,加入如下内容:

cgi.fix_pathinfo=1
doc_root=

MySQL 8 的一个天坑

就在前几天,杭电助手的小伙伴就找我,说他在写 PHP 时,一直连不上 MySQL 数据库。 我根据错误提示百度发现,在 MySQL 8 的版本中,采用了caching_sha2_password的身份验证机制。但是 PHP 7 却不支持。 百度上的办法都试过一遍了,发现都不行。最后决定——卸掉 MySQL 8,换成 MySQL 5.6。 这里就面临一个问题,这意味着我得将原来的 MySQL 容器给rm掉,然后新建新的 MySQL:5.6 容器。但是 PHP 容器是和 MySQL 容器link过的。因此我担心我 PHP 容器那边是不是会受到影响也要修改。 但是转念一想,当初在 Docker 中建 PHP 容器时,仅仅只是--link mysql这样连接过,如果我新 MySQL 的容器名还是mysql,是不是就可以了呢? 事实上 Docker 确实没有让我失望。只要 Docker 能--link时相同名称的容器就行。 其实后来我用docker inspect php7查看 PHP 容器的配置也能发现,Docker 中连接两个容器是这样的:

"Links": [
                "/mysql:/php7/mysql"
            ],

并不是以Container ID来表示的,而是以Container Name,就很舒服。

权限!权限!

关于权限的问题我也遇到了。 首先是在安装 WordPress 时无法自动创建wp-config.php的配置文件,提示说要我手动创建。我便怀疑是不是没有写入权限。 那么切到站点根目录下,提权:

sudo chown -R www-data:www-data
sudo usermod -u 1000 www-data
sudo groupmod -g 1000 www-data

同时,我用 sftp 上传文件时,也提示没有写入权限,那么同样,把需要上传文件的目录改一下权限,可能有点危险,但是真的只能改成 777 才行:

sudo chmod 777 uploads

Nginx 的一些配置

开启 URL 重写,去除 index.php

放在location / {}里:

try_files $uri $uri/ /index.php?$args;

我记得没有这么简单的啊……就很奇怪……

开启 HTTPS

首先先是在 https://freessl.org 申请 3 个月的 SSL 通配符证书。(对,就是通配符!) 之后用 sftp 上传到服务器上,在 Nginx 中开启监听 443 端口:

listen 443;

开启 SSL:

ssl on;
ssl_certificate  /usr/share/nginx/cer/full_chain.pem;
ssl_certificate_key /usr/share/nginx/cer/private.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
=ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

强制跳转到 HTTPS:

if ($server_port !~ 443){
	rewrite ^(/.*)$ https://$host$1 permanent;
}

还剩一点微小的东西

因为是搭建的 WordPress 测试站点,后台密码用的也是弱口令,害怕被日,所在 Nginx 里限制了一下 IP,仅能通过我 VPS 的代理登录:

allow  45.78.27.91;
deny   all;

就是这些啦

因为今天一天没课,所以就这么一点东西,昨天晚上搞到了两点多。不停地百度,总算搞定了。下面就是等域名备案完成把博客迁移过来了。 本来还计划着写一个可视化的面板,来操控服务器上的站点,自动生成配置文件什么的,但是想想其实还是命令行用得爽,就此作罢。其实就是因为懒

谢谢老板 Thanks♪(・ω・)ノ


喜欢这篇文章?为什么不打赏一下呢?