2024年11月20日
前言
本篇文章适宜有一定IT技术基础的童鞋,力求用不折磨的方式快速部署wordpres,技术小白或者大佬也可以选择性食用。
环境配置:
- Ubuntu22.04
- 2核2g3M 阿里云ESC
- 防火墙安全组开放80,443,8888端口
之后是一个非常长的前言,主要讲为什么选择用这套方案部署wordpress,如果不感兴趣可以直接跳过,看下面的部署过程~
1、为何选用wordpress?
最近很不满自己的的streamlit弄的web,本来想打通前后端,然后自己写个博客站出来,还能部署一些自己的服务之类的。但是学完了flask之后,衡量一下利弊,决定还是重操旧业,使用wordpress(简称wp)来建站。
- 自己并不是走代码这条路的,就算自学了前后端,也不会对职业生活带来好的影响。
- 前后端的框架一直都在进化,这样之后要不停花时间去更新代码,精力够吗?
博客博客,何以博客?如果今后真有一些网友来访问咱博客,也不会在乎前端用了多先进的框架,后端优化的方法多么的鬼斧神工。说白了,博文有用,人家才来。
我也上网看了很多自建站的案例,非常多的优秀站点在维护了2-3年之后就荒废了,我并不想步其后尘。使用现成的方案,只要内容还在,就算wordpress在某个时刻瞬间倒闭,我的博客也能以另一种形态重新被整顿起来。
2、为何选用docker-compose来部署?
我认为,优雅地部署一种服务需要有以下几点:资源占用少,兼容性强,可拓展性强。
为何不手搓?
我考虑过,作为一种长久的服务,我干脆直接手装wordpress?然后我看了大量的文章,好用的真的是少之甚少,给几份粪作案例:
- 在ECS实例上搭建WordPress网站_云服务器 ECS(ECS)-阿里云帮助中心 # 只有Centos一个系统的案例,而且nginx的配置文件还是截图的…
- 云服务器 手动搭建 WordPress 个人站点(Linux)-实践教程-文档中心-腾讯云 # 没提php的部署,可能是Centos自带了…
这两份甚至是官方文档,全都自动忽略php的配置。什么意思,我ubuntu系统没有人权了?网上的妖魔鬼怪那就更多了。wordpress的依赖有:
- apache(或者nginx,但是nginx对php的兼容性要低一点,一般不推荐)
- php(古早web语言,据说很慢,我不太懂)
- mysql
不同系统有不同的装法,而且有一定的先后要求。我之前搞完,结果apache的配置出问题了,重装apache,结果php直接失效…我又不是技术大佬,完全没耐心也没必要查清楚其根源…
另外,如果之后涉及到更新,那就是这几个依赖依次更新了…到时候哪个环节出问题了,就又要排查回退乱七八糟了…
手动装所有依赖确实折磨,不优雅!PASS!
为何不用托管商?
很多情况下,成本最低的方案就是直接全套交给现成的服务商来做,自己就直接接收一个完成的wp就可以。比如我在网上其实看到很多人用什么宝塔面板直接安装现成的wp,而且后续还能直接图形界面安装ssl证书,那可真是高效啊!实际上我认为小白应该直接采取这套方案,甚至本文也不该撰写,直接用这套好了。
我的考虑主要是,在一些自己能够cover的配置上不希望被别人所控制。服务商给的配置方案稳定是稳定,但是也经常更新落后,而且如果自己需要定制的话,可能会因为修改某些配置导致整个站崩溃或者怎么样,毕竟自己不清楚服务商定制的细节,到时候报错也会一头雾水。
还有一个考虑,就是使用高度定制的配置服务可能会占据额外的算力资源,对于我这种穷酸服务器配置来说,自然应该是越精简越好。
所以容器化?
docker-compose依托于docker,但凡做成了镜像,就能实现跨系统的服务部署,任何依赖都会在容器中得以解决,上面提到的三种依赖都能被一个配置文件完美解决!但是也有缺点,就是如果想搞点自定义的玩意,就要进出容器,并且考虑数据持久化等事宜了。还好,本文构建wordpress并不是想深度定制化,因此还是很适宜用容器化技术。
最近mac mini m4性价比非常高,我寻思等毕业后搞一个,如果我是docker做的话,就可以做到无痛迁移~
利用docker-compose启用wp
1、安装docker环境
要实现docker-compose部署需要下载docker和docker-compose,这不是本文的重点,因此一句带过,以ubuntu系统举例,终端输入:
apt-get update
apt-get install docker-ce
然后安装docker-compose
pip install docker-compose
2、改写docker-compose文件
docker-compose.yml
文件是指导docker-compose进行一站式部署的配置文件,官方给我们了一个基本的配置文件,来源:https://hub.docker.com/_/wordpress
为了之后维护的方便,还是要小改一下,细节如下:
version: '3.1'
# 来自【<https://hub.docker.com/_/wordpress】官方给予的dockercompose文档,将其小改一下>
services:
wordpress:
image: wordpress
restart: always
ports:
- 8888:80 # 之后需要用nginx反向代理,因此占用本地8888端口
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: aaa # 这几个字段可以随便自定义,但是要与下面mysql的配置一致
WORDPRESS_DB_PASSWORD: bbb
WORDPRESS_DB_NAME: ccc
volumes:
- /opt/wordpress:/var/www/html # wordpress的主要数据都在这个文件夹中,必须要映射
db:
image: mysql:8.0
restart: always
ports:
- 3306:3306 # 开启mysql的端口,方便后续外部连接维护
environment:
MYSQL_DATABASE: ccc
MYSQL_USER: aaa
MYSQL_PASSWORD: bbb
MYSQL_ROOT_PASSWORD: aaaaa # 官方使用随机密码,我们这里自定义一个root密码,方便后续维护数据库
volumes:
- /opt/wordpress_db:/var/lib/mysql # 数据持久化
volumes:
wordpress:
db:
将其保存为xxx.yml,放在服务器中自定义的目录位置,然后cd过去,使用以下命令启动它。
docker-compose -f xxx.yml up -d
-f 的含义是指定文件
-d 的含义是后台运行,不加的话该终端结束容器即停止。
还有一些命令或许用得到
docker-compose -f xxx.yml down/restart
上述命令用以关闭/重启由xxx.yml配置文件产生的容器。
之后访问 公网ip:8888,就可以执行图形界面安装了!—— 好耶!站点成立!
启用SSL
说实话,上面那套是十分简单的,这个才是最折磨…如果不开启ssl,访问网站的时候一直有个不安全提示,非常不优雅。但是使用容器化技术启用wp,也没法用一般的方式启用ssl,具体的研究细节我放在后记中,这里直接介绍使用nginx反向代理的方式来启用ssl。
1、准备工作
- 需要先申请到ssl证书
这些网上有一堆教程,也有一些傻瓜式操作,我放在后记中慢慢讲。我之前看阿里云有活动,有个一块钱买一年的证书,我就直接下单了。然后控制台将其下载下来,nginx需要两个文件,我的长这样:qzq.world.key qzq.world.pem
将其放在服务器的自定义目录下,我放到了这个路径:/root/ssl/nginx_ssl
- 安装nginx
ubuntu上使用如下命令:
apt-get update
apt-get install nginx
service nginx start
完成后访问公网ip应该能看到nginx的信息,这时nginx就算部署成功
2、配置nginx以启用ssl
这套方案主要的流程是:
用户访问 nginx 80端口 → nginx ssl加密后转发到本机 8888端口(也就是wp容器映射到端口)→ wp处理请求后,原路返回给用户。
相当于为了加ssl多设立了一个中转,好处是可以完全不动容器中已经配置好的环境,坏处自然是稍占一些算力资源。
主要参考:https://www.cnblogs.com/larks-islands/p/18249974
配置nginx文件,位置应该在/etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name qzq.world www.qzq.world;
client_max_body_size 20M; # 添加这一行解锁nginx上传文件的上限,后面有用
return 301 https://www.qzq.world$request_uri; #所有到达这里请求,返回一个301永久重定向响应,将HTTP重定向到HTTPS,并带上原始请求的URI($request_uri
}
server {
listen 443 ssl http2; #在443端口上监听HTTPS,并使用HTTP/2协议
server_name www.qzq.world;
client_max_body_size 20M; # 和上方一起配置才能解锁上传上限。
ssl_certificate "/root/ssl/nginx_ssl/qzq.world.pem"; #配置SSL证书,你自己的路径
ssl_certificate_key "/root/ssl/nginx_ssl/qzq.world.key"; #配置SSL秘钥
location / {
proxy_pass <http://localhost:8888>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
然后重启nginx,直接访问公网ip
nginx -s reload
service nginx restart
ssl就直接被装上了!此时,wordpress的基本配置已经就绪,可以写文章和自定义站点了,cheers!
3、nginx配置的后话
其实很多网上的教程都认为上述的配置还需要一些修改才能启用ssl,比如https://www.cnblogs.com/larks-islands/p/18249974提到要修改wp-config.php:
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false){
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
}
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}
define('WP_HOME','<https://starless.site/>');
define('WP_SITEURL','<https://starless.site/>');
然后很怪啊,我访问主页的时候,网页的样式全部丢失,用开发者工具看看,css文件的加载报错ssl_connection_error。
然后我又去网上找,有说要修改.htaccess
文件的,我改了,然后直接给我报错「重定向次数过多」。
然后我继续找,还有往functions.php中添加函数的,加了,没用。这里就不贴这些文章的地址了…
结果,最后我自己研究,发现完全不管wp的配置文件反而有用…欲哭无泪了。
这就是黑盒使用的问题,毕竟不清楚技术细节,就不知道啥时候wp更新到已经可以自启ssl了,只能去寻找可靠的消息源,或者根据自己的使用经验慢慢实验。
wordpress的进阶配置
到此为止你已经拥有一个健康优雅的wp站了,可以自己去捣鼓。这个章节主要来讲我捣鼓博客站的思路与方案,如君需要,可以自取~
1、主题选择
一开始我是在Wp的主题市场找自定义主题,毕竟20多年老字号了,主题市场的几个巨头稳定性和效率肯定是高的吧?毕竟经过市场检验的吧?但是至少现在不是这样。
我找了两个知名主题模板,Astra和Kadence,前者以强大的可编辑性著称,后者以高速响应著称。当然,这也只是我网上文章获得的结果。但从结果上来说,他们都慢的和老奶奶过马路一样,并且会擅自改动系统给你的默认主题,就算你不满意之后把它们删了,主题也再也回不来了。
太不优雅了!
至于这俩主题为什么这么慢,可能是我这硬件太寒碜了(不过后台检测,cpu占用也没超过50过,内存则一直占用20-30%左右,也没爆满);也可能是因为他们官网服务器在国外,导致资源加载之类的非常慢。无论是什么原因,都给我造成了不好的使用体验,出局!
后来又找了一下,发现其实可以自己安装自定义主题,很可惜的是,我找到的大多数主题已经停止维护了,参考:
唯一找到的还在维护的主题是:
下载其发行版,然后进入wp的后台页面,选择上传主题进行安装。这里遇到了个问题,就是上传文件限制,主题文件有3mb,而服务器限制2mb的upload_max_filesize
。
如何提高wp上传限制?
ps:上面我们为nginx提高了上传限制,如果没做的话nginx处也需要改。
参考:WordPress--解决上传的文件尺寸超过php.ini的问题
方案1:修改.htaccess文件
.htaccess文件的位置:在wp根目录下(wp-admin同级目录)
改成这样
...
</IfModule>
php_value upload_max_filesize 300M
php_value post_max_size 300M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300
# END WordPress
然后source .htaccess,亲测有效。还有一种方法是修改wp-config.php文件,尝试了一下似乎是没效果,因此就不贴出原文章地址了。
这里要稍微提一嘴,由于我们是用docker进行部署的,因此wp根目录所在的位置,是我们自定义的映射位置。拿官方给的docker-compose.yml文件举例,其中有:
...
volumes:
- wordpress:/var/www/html # 左边是本地目录的位置,右边是容器目录的位置
也就说,wordpress的根目录就在本地的/wordpress中。
2、Wordpress加速
Wordpress系统并不复杂,因此2核2g的小型云服务器完全能cover其算力资源需求。但是因为是老外开发的,好多api之类的都调的外网,这就让其经常性地卡顿…反正不处理非常影响使用体验,以下是网上找的各种方法,经过这么一折腾网站响应速度已经能够接受了。
禁用谷歌字体
刚进入wordpres的控制面板会感觉操作异常缓慢,打开服务器监控后台我也没见多少cpu占用,因此可以确定是io问题,上网找了一下:WordPress国内打开速度慢的常见最立竿见影的解决办法 - 知乎
在国内的服务器上,wp打开速度慢是老大难的问题了。其中最常见的就是google字体加载问题导致的网站访问巨慢无比。F12可以看到,在https://fonts.googleapis.com这一栏,wp是加载不了的,因为被墙了。
因此需要这么一个插件[Disable Google Fonts],在插件市场下载安装即可,效果立竿见影。
配置Gravatar
ps:如果你使用了kratos主题,会自带一个Gravatar加速,就可以跳过这步了
禁用了谷歌字体后访问网站是比较快了,但是网站的后台依然非常慢,这是因为加载后台时wp总是会去Gravatar拉取你的头像,这个网站国内又是访问不了的类型,因此总是要等到timeout…
- 使用插件
网上看到有两种方法,第一种修改php文件:Wordpress中的两个小技巧:自定义上传头像、后台登录地址修改。 - 知乎
上面那种应该兼容性最强,但是操作比较麻烦,第二种就是下载插件:如何禁用 Wordpress 中的 Gravatar 头像 - 知乎
然鹅我发现文中提到的Disable User Gravatar已经两年没维护了,官网也没了…
反正知根知底就行,随便找个能定义头像的插件,我找的是**Simple Local Avatars,**启用之后本地头像也无法正常显示,但是后端速度却飞快…(第二安装的时候,不知道为啥突然能用了,阿这…)
如果是强迫症的话,估计还是不满意,毕竟要一直盯着自己头像的图片裂开不是什么好事,那确实还有一些别的办法。
- 修改代码
如果能不到这步的话最好还是不要随便修改配置的代码,毕竟这样可迁移性就会差,但还是贴一下我找到的几个亲测可用的修改文件的方法:
【Wordpress教程】Wordpress头像无法显示无法更换,免插件添加自定义设置上传头像功能_wordpress头像不显示-CSDN博客 # 修改主题文件中的funtions.php
文件,直接定义了一个自定义头像的功能出来,所以代码也非常的长…
配置wordpress:解决头像不显示问题(wordpress 6.2) - 刘宏缔的架构森林 - 博客园 # 这位也是修改主题文件中的funtions.php
文件,但是是为Gravatar配置了镜像站,精简管用,坏处是头像还是不能显示。
后记
这里就稍微记载一下debug之路,以防有来者和我一样不清不楚捣鼓两三天…
1、纯手搓的方案记录
纯手挫是真的不适合对web技术一知半解的人…为了开ssl我修改这修改那,然后网页暴毙了,也不清楚是哪个地方出现了问题,只好开始回退。对于docker-compose来说,就是简单的删光数据再起一次的事情。这里不讲细节,我也不懂,就贴一下写的比较好的源
2、开启ssl的方法
说实话,在还没捣鼓之前,我完全不觉得这是一件多么难的事情,直到失败了N次重新部署了N次之后才开始冷静考虑…
① 使用插件
wp毕竟以它的插件繁荣闻名于世,区区一个开启ssl的小需求,确实有对应的插件能够解决,然而我尝试的两个插件Really Simple SSL
和WP Encryption
都无法开启一键部署。推测原因可能是因为docker内部的环境和手搓的不一样。Really Simple SSL
倒是可以方便地申请一个ssl证书,但是插件这个方法估计是没办法用在容器化部署上的。
②进入容器内部使用安装脚本
ps:如果想这么做,docker-compose中记得开放wp的443端口。
毕竟我自己认为还算小有一些技术功底,wp的镜像其实集成了apache2,php和wp本体三个部分,挂载ssl必然就修改修改apache2的一些配置文件就好了。
- 尝试1:使用certbot一键部署
在网上找解决方案的时候发现了这么一个脚本,据说能够使用命令行一站式地完成从申请到部署ssl,贴一个他们的官网:Certbot Instructions | Certbot
但是docker环境毕竟比较特殊,不太清楚能不能用。我从头到尾走了一遍,结果是网页再也打不开了,尝试链接数据库去修改条目,没能救回来…重新部署一次 (ㄒoㄒ)
然后我又看到另外一种使用certbot的方式,贴一下源:How to Install WordPress with Apache and Let's Encrypt SSL on Ubuntu 20.04 - SnapShooter Tutorials 然后重蹈覆辙…重新部署一次 (ㄒoㄒ)
还有湾湾同学写的文章:WordPress / 多重架站三:設定 SSL 加密連線 (以 Apache 為例) – Charles Note
实际上这种方式也只能解决近渴,后来我考虑到,进入docker容器进行各种操作之后,下次restart后其实都会消失,这是docker容器化技术的特性,因此不推荐这么搞。
③进入容器内部纯手搓部署ssl
反正经过步骤2后我有点不信邪,找了一堆配置apache部署ssl的文章,都尝试了一下
好像找不到历史记录了…反正外面怎么整里面就怎么整,全失败回炉重造
④大彻大悟
所以我为啥一定要进容器里捣鼓阿!最后洗澡的时候灵光一现,想到了小学二年级了解过的反代方式…讲真,说那么多就是docker内部的环境最好不要动,人家搞成docker的容器化形式,就希望你用它的外部接口,内部环境依赖它整好给你,保准稳定,不太懂这些去乱改铁出事的…
3、急救措施
在配置ssl的过程中,经常有文章指出最后一步应该进网页后台,设置 - 常规 中将 WordPress 地址(URL)
修改成https的前缀,然后点击保存。如果执行这一步之前其实ssl并没有被正确配置,那么恭喜你——再也进不了网页后台了…
贴个方法:安装SSL之后 WordPress网站打不开该怎么办 数据库修改登录网址 - 知乎
所以之前docker-compose文件中应当开启mysql的3306端口,这样方便我们直接链接上数据库挽回一些配置。随便找一个网上说的mysql图形界面,然后连上数据库,找到wp-option这个表,修改,apply,搞定!
文章评论
网站搞的不错,路过学习。
@修愚 本站第一个评论,感谢你~
我的博客没有用容器,直接在vps建立。
@土狼妹妹 我去了解了解 vps~