记录在 Docker 中的搭建 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;
就是这些啦
因为今天一天没课,所以就这么一点东西,昨天晚上搞到了两点多。不停地百度,总算搞定了。下面就是等域名备案完成把博客迁移过来了。 本来还计划着写一个可视化的面板,来操控服务器上的站点,自动生成配置文件什么的,但是想想其实还是命令行用得爽,就此作罢。其实就是因为懒
喜欢这篇文章?为什么不打赏一下呢?