前言
经过一番研究,终于把这个 WordPress 部署上了~
网上的教程都说先部署 LAMP 或者 LNMP 然后再搭建 WordPress,但是作为一个懒人,我最终采用的是 Docker 部署的方案,而且 MariaDB 数据库也是直接在同一个 Docker 中跑的。虽然显得很不专业,但确实是一个方便快捷的方案。只不过以后要是想更换 Container 可能就没那么容易了。暂且先这样吧。 当然了,这个过程也踩了几个坑,简单记录一下。
数据库连接
默认的 WordPress Docker 是基于 Debian 的,没有 MySQL,只能安装 MariaDB 数据库的,这到不是什么大问题。 问题是安装并按官方手册创建数据库、注册用户之后,这个 WordPress 死活连接不上。
研究了半天,合着要写 127.0.0.1,不能写 localhost。可能是因为 localhost 被解析成 ipv6 了?不懂 hhh
HTTPS+Nginx 的困扰
由于是在 Docker 中跑的 WordPress,为了加上 HTTPS 免得浏览器提示不安全,我在服务器最前端套了一个 Nginx(其实本来所有对外的 HTTP 服务也本来就有一层 Nginx,也算不上新增的)。然后这个 WordPress 就和 Nginx 打起来了……情况如下
- Nginx 代理的时候将 443 转发到 127.0.0.1:4000,合理。
- WordPress 为了内部能正常重定向至子页面,需要设置 URL 为 https://blog.pythame.com/ ,合理。
- WordPress 会自动检测 URL 为 HTTPS,如果访问来自 HTTP 协议则会重定向,合理。
然后这几个叠加起来的效果就是:首页能正常访问,但只要点任何一个按钮,都会因为多次重定向被浏览器拦截。看 Network 发现是 https://.../ 对自己的循环重定向,这不合理。就很魔幻。
尝试了给 Nginx 加代理的头,但是问题仍然存在。 于是最后的解决方案非常暴力,在 wp-config.php 的开头加入下面代码,强行修改了 WordPress 对 HTTPS 检测的相关 php 代码,不论来自什么地方的访问都直接被认为是 HTTPS 就行了。反正 Docker 开的端口也是 localhost,只有通过 Nginx 才能访问到,也无所谓。
define('WP_HOME','https://blog.pythame.com');
define('WP_SITEURL','https://blog.pythame.com');
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'){
$_SERVER['HTTPS']='on';
}
if(isset($_SERVER['HTTP_X_FORWARDED_HOST'])){
$_SERVER['HTTP_HOST']=$_SERVER['HTTP_X_FORWARDED_HOST'];
}
回坑:果然人不能犯懒
之前我犯懒就 MySQL 部署在 Container 里,终于还是由于太难以管理而重构了。所有的设置都重新弄了一遍,果然不能和前人的程序设计方法较劲……