网站优化之OS升级+Dockerization

当时构建这个网站时选择的ECS是基于CentOS 6.5的,所以真的是好几年前的事情了。虽然我一直维护着OS的升级(后台写了个脚本自己更新),一路从6.5升到了6.10。可是最近越来越多的工具在CentOS 6上跑不了了,于是还是准备动手升级。

首先想到的是软件方案,也就是直接升OS。查了很多资料,写得天花乱坠,其实是不可以的。貌似只有CentOS 6.5可以升到7,而之后6的版本都会遇到问题。希望和我有同样需求的人不要再在这个上面呢浪费时间,写得天花乱坠的人,其实都没有真的敲击过那些命令。

所以不如重装。云平台的好处之一就是可以快速地重新部署你机器的基础设施,就跟Docker一样。我的博客数据都是放到数据盘的(我有两块硬盘,一块是系统盘,一块是数据盘),而我博客的架构是旧三样:nginx+php+mariaDB,只需要再把nginx和php的配置目录都备份一份即可。

更换OS的过程,从在云平台上点击算起,也就几十秒。重新登陆后,新的OS就已经是CentOS 7.7了。

接下来就是将博客重新部署回来。

而这次,我不打算一步一步重新安装那些组件,而是使用Docker来做。


第一步,安装docker和docker-compse。

我的建议是不要通过yum来做,因为yum装的版本比较低。当然如果你不想用更高的版本,用yum装是很方便的。我是通过《Get Docker CE for CentOS》和《Install Docker Compose》这两篇文章的步骤安装的docker和docker-compose。

第二步,编写docker-compose.yml。

首先想,要几个组件。其实wordpress有不同的dockerfile,其中一个是wordpress+apache2+php的版本,如果你用了这个版本,那你只再需要一个mysql或者mariaDB的dockerfile就够了。

因为我很喜欢nginx,而且在之前的时间里,我也花了一些心思优化了nginx(和SSL),我希望这些成果能够保留下来。因此我的方案是使用wordpress+php的版本,加上一个nginx,再加上mariaDB。

仅供参考:docker-compose-example.yml

第三步,调试。注意一点的是,由于以前组件之间相连,使用的是unix socket或者localhost或者127.0.0.1,这些在Docker的网络里,最好直接用名称。再有,nginx配置文件里的路径也要写在docker环境里的路径,而不是主机环境下的路径了。

在调试的过程中,发生了一件很诡异的事情:用户登陆失败,提示错误:Cookies因预料之外的输出被阻止。这个问题可以说搞了我好久,因为我不知道什么叫”预料之外的输出”……网上有不少文章,说php.ini中没有打开session output啦,说functions.php中有多于字符啦。但是我都试了,没有解决。

其实这篇文章《How to Fix WordPress Login Page Refreshing and Redirecting Issue》算是比较详细的了。不过我觉得我的方法更直接一些,不要瞎猜了,直接在wp-config.php中奖WP_DEBUG设成true,一下子就能看到哪里有错。

仅供参考:

打开Debug后,发现报这个错:

很明显,错误集中在主题的masony.php这个文件的第102行。

打开文件一看,果然,一个莫名其妙的换行出现在文件最后:

删除它,问题解决。

最后别忘记把打开的DEBUG调试关掉,如果用了Cache的话,别忘记把Cache也清除。

第四步,设置FTP。

FTP是只用来给wordpress用来安装插件、升级自身之类操作用的。

尽管wordpress不支持用sftp,但是其支持ftps,因此照着这篇文章《How to secure VSFTPD FTP Server using a self-signed SSL/TLS certificate in CentOS 7 – FTPS》来配置即可。

中间又遇到了一个问题:用户名密码都对,但就是返回“530 Login incorrect.的错误。

查了很多文档,也都是说大于做,不过终于让我找到一篇自己人的博,把这个问题说得很透彻《ubuntu vsftpd 530 Login incorrect 根本原因和解决方案》:

按照其说得方法,解决。


最后说一点题外话,两个。一个是如今Nginx已经支持TLS1.3了,所以我在配置文件中启用了TLS1.3;第二个是CBC的cipher已经不安全了,因此我给在cipher list上也把它们去掉了。

如今在Qualys上的评分已经非常好了: