QZQ的小世界!

  • 首页
你好!
这里是QZQ的博客站!
  1. 首页
  2. 未分类
  3. 正文

我在2024年用docker-compose优雅地在Ubuntu云服务器上部署了wordpress,并开启了SSL…

2025年4月4日 83点热度 0人点赞 0条评论

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、准备工作

  1. 需要先申请到ssl证书

这些网上有一堆教程,也有一些傻瓜式操作,我放在后记中慢慢讲。我之前看阿里云有活动,有个一块钱买一年的证书,我就直接下单了。然后控制台将其下载下来,nginx需要两个文件,我的长这样:qzq.world.key qzq.world.pem

将其放在服务器的自定义目录下,我放到了这个路径:/root/ssl/nginx_ssl

  1. 安装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%左右,也没爆满);也可能是因为他们官网服务器在国外,导致资源加载之类的非常慢。无论是什么原因,都给我造成了不好的使用体验,出局!

后来又找了一下,发现其实可以自己安装自定义主题,很可惜的是,我找到的大多数主题已经停止维护了,参考:

个人博客主题分享(WordPress) – Echo小窝

唯一找到的还在维护的主题是:

下载其发行版,然后进入wp的后台页面,选择上传主题进行安装。这里遇到了个问题,就是上传文件限制,主题文件有3mb,而服务器限制2mb的upload_max_filesize。

如何提高wp上传限制?

ps:上面我们为nginx提高了上传限制,如果没做的话nginx处也需要改。

参考:WordPress--解决上传的文件尺寸超过php.ini的问题

方案1:修改.htaccess文件

.htaccess文件的位置:在wp根目录下(wp-admin同级目录)

改成这样

```plain text
...

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文件举例,其中有:

```yaml
...
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来说,就是简单的删光数据再起一次的事情。这里不讲细节,我也不懂,就贴一下写的比较好的源

  • 基于 Apache PhP MySQL 搭建 WordPress - 知乎

  • 阿里云服务器部署WordPress (保姆级教程) - 知乎

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的文章,都尝试了一下

  • Apache + WordPress + SSL 完全指南 - Jerry_Jin - 博客园

好像找不到历史记录了…反正外面怎么整里面就怎么整,全失败回炉重造

④大彻大悟

所以我为啥一定要进容器里捣鼓阿!最后洗澡的时候灵光一现,想到了小学二年级了解过的反代方式…讲真,说那么多就是docker内部的环境最好不要动,人家搞成docker的容器化形式,就希望你用它的外部接口,内部环境依赖它整好给你,保准稳定,不太懂这些去乱改铁出事的…

3、急救措施

在配置ssl的过程中,经常有文章指出最后一步应该进网页后台,设置 - 常规 中将 WordPress 地址(URL)修改成https的前缀,然后点击保存。如果执行这一步之前其实ssl并没有被正确配置,那么恭喜你——再也进不了网页后台了…

贴个方法:安装SSL之后 WordPress网站打不开该怎么办 数据库修改登录网址 - 知乎

所以之前docker-compose文件中应当开启mysql的3306端口,这样方便我们直接链接上数据库挽回一些配置。随便找一个网上说的mysql图形界面,然后连上数据库,找到wp-option这个表,修改,apply,搞定!

[文章导入自 http://qzq-go.notion.site/14449a7b4e7580e5b6efd396d68d0932 访问原文获取高清图片]

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: IT技术 技术随笔
最后更新:2025年4月3日

QZQ

一只涉猎广泛的技术爱好者,绝赞养猫中~

点赞
< 上一篇
下一篇 >

归档

  • 2025 年 4 月
  • 2025 年 3 月
  • 2025 年 2 月
  • 2025 年 1 月
  • 2024 年 12 月
  • 2024 年 11 月

分类

  • 技术
  • 未分类

COPYRIGHT © 2024 QZQ的小世界!. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang