每个人可能都在使用Wordpress写博客。之前,他们买了一个VPS部署一个一键式的L/WAMP程序来完成整个部署。部署可能容易,但操作起来比较费力。前两天虫虫的博客VPS出问题,导致数据丢失,需要重新部署。在本次部署中,为了追求安全性,采用了docker容器方式,网站升级为全站HTTPS。本站支持TLS1.3协议,最大程度提升性能。本文介绍整个部署过程,供大家参考和优化。概述本站采用Docker方式部署,使用两个容器,一个是mysql5.7数据库容器,一个是apache(2.4.25)、php(7.3.6)、Wordpress(5.2.2)容器,容器组件都是最新版本。为了安全,即使一个容器映射到宿主机的127.0.0.1端口,也不直接对外提供服务。宿主机容器部署nginx***1.17版本反向代理,nginx对外提供https服务:使用TLS1.3协议,证书是Let'sEncrypt的免费SSL应用,可以一键申请证书并免费更新3个月。整个架构结构如下:VPS及容器环境准备VPS基础环境为centos7.2,默认为vi。我们换成vimyuinstallvim挂载VPS数据盘来初始化VPS数据盘。请注意,该磁盘是外部磁盘。当VPS改变,重新初始化的时候,数据不会丢失,一般是sdb,比如冲冲的磁盘,创建一个60G的分区,格式化fdisk/dev/sdbmkfs.ext4/dev/sdb1进行挂载,我们设置挂载目录到/datamkdir/datamount/dev/sdb1/data修改/etc/fstab实现自动重启挂载:查看磁盘UUIDd179868b-6fb9-414c-8901-b990f7c586bdecho'UUID="d179868b-6fb9-414c-8901-b990f7c586bd"/dataext4defaults00'>>abmount/f通过dumpe2fs或blkida测试fstab配置,如果没有提示就正确,如果有错误就会显示出来,比如我们在UUID前面加一个1,测试信息如下:更换防火墙,关闭selinux系统的默认防火墙firewalld,先修改成比较熟悉的iptables:yuminstalliptablesiptables-servicessystemctldisablefirewalldsystemctlstopfirewalldsystemctlenableiptablessystemctlstartiptableselinux配置太复杂,我们先暂时关闭(正式生产环境不建议进行此操作):setenforce0需要修改其配置文件才能保持关闭状态,这样重启后就不会再次加载了。perl-i-lpe's/SELINUX=enforcing/SELINUX=disabled/g'/etc/selinux/config方法更改ssh安全配置。对于VPS,修改了系统默认的ssh端口22,禁止root登录。方法是修改/etc/ssh/sshd_config,找到Port,去掉前面的注释#,把22改成其他端口,比如12322:在Port12322上加一行“PermitRootLoginno”,禁止root登录:添加证书提前登录,然后禁止密码登录方法“PasswordAuthenticationno”:防火墙新开sshd端口,并删除22端口iptables-IINPUT-ptcp-mstate--stateNEW-mtcp-dport12322-jACCEPT重启sshd服务systemctlrestartsshd.service用新端口证书访问服务器,如果没有问题:删除22端口iptables-DINPUT-ptcp-mstate--stateNEW-mtcp-dport22-jACCEPT保存防火墙规则systemctlsavesshd.service添加epel和源码管理工具yuminstalllepel-releaseyuminstall-yyum-utilsdockerandcontainerdeploymentadddockersourceinstalldockerserviceyuminstalldocker-cedocker-composesystemctlenabledockersystemctlstartdockerenabledocker报错“SELinuxisnotsupportedwiththeoverlay2graphdrive...false”在此过程中被报告。原因是Linux内核中的SELinux不支持overlay2graphdrive。解决方法是修改docker配置文件/etc/sysconfig/docker--selinux-enabledis--selinux-enabled=false典型错误如下:fatalmsg="Errorstartingdaemon:errorini初始化图形驱动程序:“/var/lib/docker”包含几个有效的图形驱动程序:devicemapper、overlay;Pleasecleanuporexplicitlychoosestoragedriver(-s)”是docker初始化数据有问题导致的,只需清理/var/lib/docker/目录下的文件“rm-rf/var/lib/docker/”,然后重启就OK拉取docker应用镜像dockerpullwordpressdockerpullmysql:5.7.25迁移docker数据目录systemctlstopdocker.servicemv/var/lib/docker/data/dockervim/usr/lib/systemd/system/docker.service找到ExecStart并添加其参数:"--graph/data/docker":重新加载配置文件systemctldaemon-reload重启docker服务systemctlrestartdocker.service创建应用数据目录首先是数据库mysql目录:mkdir-p/data/web/datachown-R999:999/data/web/data网站目录:mkdir/data/web/webappschown-R33:33/data/web/webapps启动应用容器mysql容器:dockerrun--namemysql-hmysql--restart=always-eMYSQL_ROOT_PASSWORD=wp12345-p127.0.0.1:13306:3306-v/data/web/data:/var/lib/mysql-dmysql:5.7.25否上面强调的参数表示mysqlRoot初始化密码,需要根据实际情况修改wordpress应用容器dockerrun-hwordpress--namewordpress--restart=always--linkmysql:mysql-p2880:80-v/data/web/webapps:/var/www/html-dwordpress注意上面的粗体表示连接到mysqlcontainer,注意两个服务的启动顺序,现有的mysql,wordpress放弃连接这个数据库,宿主机映射的端口为2880。数据迁移上面两个容器启动后,wordpress部署就完全完成了,现在通过浏览器访问http://ip:2880就可以进入wordpress安装界面了。可以通过web安装wordpress并进行配置。有可能会报错数据库连接错误:提示信息说明数据库服务没有创建wordpress数据库。这时候需要连接mysql容器:dockerexec-itmysql/bin/bash在容器中执行mysql-uroot-p输入上面mysql的密码,wp12345在mysql命令行创建数据库wordpresscreatedatabasewordpress;然后你可以再次访问它。注意这里要保存系统设置的密码,或者改成自己的密码。经过以上步骤,就可以使用新版本的wordpress服务了:安装后,需要迁移历史数据,主要是两部分数据:数据库数据和上传的文件数据。上传文件数据迁移:这部分迁移非常简单。将之前保存的目录下wp-content下的uploads目录中的上传数据全部复制过来就可以了。数据库迁移:数据库迁移,如果wordpress版本相同,可以直接将之前保存的数据文件导入到新数据库中。如果版本不同,需要注意版本差异,否则会报错,只能导入wp-post和wp-comments这两个表的数据。通过wordpress导入导出功能:如果你之前通过wordpress的导出插件导出过历史数据,你可以放心使用它导入所有数据。结合uploads目录导入文件,可以完整还原历史数据。具体方法:点击“工具”-“导入”:点击本页面WordPress下的立即安装,先安装插件。安装后点击“插件”:点击“启用”。然后回到“工具”-“导入”:点击“运行导入器”。在弹出的页面中,选择之前保存的xml文件,然后点击“上传导入”按钮,选择需要迁移的用户,点击“提交”按钮。根据保存文件的大小,此步骤可能需要很长时间。***会显示如下页面,表示导入完成:文章页面:迁移问题迁移目前遇到问题是的,启用插件后,前台无法显示文章列表和内容。我还不知道解决办法。我临时安装了另一个代码高亮插件“Enlighter”。总结:本文我们在部署中使用docker容器的方式对Wordpress站点进行了重新部署迁移,涉及VPS基础设置、docker容器环境及安装、应用容器安装、Wordpress历史数据迁移。限于篇幅,我们的整体文章将分两部分进行介绍。本文第二部分将介绍nginx编译安装支持TLS1.3、站点https设置和wordpresshttps的问题及解决方法。
