阿里云搭建wordpress生产级CMS网站实践

搭建cms内容站点时,wordpress是一个很好的选择,不用做任何开发就可以通过配置、插件获得丰富的功能。用docker容器技术部署运维都非常简单,特别是对于wordpress这种我们无需做任何开发的组件。而出于低成本考虑,公有云都是一个最佳选择,这里我选择阿里云。为了提速,wordpress前会有一个nginx作为负载均衡和web加速服务器,将静态内容都由nginx处理。出于高可靠性,我选用阿里云的容器服务(目前免费),由它来管理所有容器。而多容器间的磁盘目录共享,阿里云提供了oss映射和nas盘,oss盘的速度太慢,而nas盘IO与云盘相当,可以作为第一选择。数据库为了可靠性,如果没有独立的DB运维人员,就选择rds mysql好了(目前单机版RDS刚上线,相比双机mysql便宜很多)。

一、最初我们验证方案时,总是先从最简单的做起,功能满足要求即可。

1、我们购买好ECS(如果是经典网络一定要含公网带宽,否则接下来用到阿里云容器服务时你会悲催的发现,目前阿里云容器要求集群内的经典网络节点必须含有公网带宽, 否则该ECS无法加入集群中。VPC网络就没有这个问题。在可见的一段时间内,阿里云可能都不会修复这个问题。),操作系统如果是centos7.0或者7.2,高内核版本支持docker就更简单了。

2、数据库在centos7.0以上版本时,mariadb比较方便(出于性能考虑,docker容器的db不推荐为生产环境下的数据库)。yum install这个数据库,修改/etc/my.cnf,使其支持utf-8,例如:

 

 

 

用service mariadb start启动数据库。

 

2、用create user命令创建好用户,create database创建好db,grant命令赋予权限,例如:

create database yourdb;
CREATE USER youruser IDENTIFIED BY 'yourpass';
GRANT ALL PRIVILEGES ON yourdb.* TO youruser;
flush privileges;

3、用docker pull wordpress命令拉下官方最新版本的image,然后用docker run将其启动。-p端口映射到主机的80端口上。注意,很多image都会通过提供环境变量来修改配置,而wordpress也是如此,这里我们主要是修改其连接哪个数据库,通常这四个环境变量配置好即可。

 

 

 

4、接下来我们将购买的域名在阿里云的云解析页面上,配置到该公网IP上。(wordpress里需要配置域名,直接使用域名比IP方便)。

5、在页面上打开域名,显示wordpress的安装站点页面。根据提示傻瓜化的安装这个wordpress,接下来我们就可以体验下wordpress强大的CMS功能了。

 

二、接下来,我们需要一个更美观的站点,而wordpress提供主题自定义功能。我们可以在google上找到很多免费或者收费的主题。接下来美化这个站点,使之符合功能需求。

1、首先找到符合要求的主题,下载后一般是一个zip文件。

2、在wordpress的/wp-admin页面下进入管理界面,由外观->主题->添加->上传主题页面里,点击选择文件,将zip主题包上传。

通常在这个步骤中,我们可能会看到上传失败的结果。提示上传文件过大(特别是你下载的zip主题包达到几十M的时候)。这是php服务默认允许的上传文件过小所致。要想解决,首先得改image的配置。此时,我们首先要重新运行docker,把容器的/var/www/html目录映射到主机目录中(用-v 主机目录:容器目录,这个volumes命令可以把容器的磁盘内容映射到主机目录中供我们修改)。我们在映射目录下创建.htaccess文件,在此文件中输入以下配置项:

 

 


这里把上传文件的大小增加到64M。

 

再启动docker容器,上传并安装新主题即可。

 

三、接着,多半会发现这个站点太慢了,体验很差,我们希望网站速度更快一点。

1、用浏览器的debug模式可以发现,最慢的请求从url看都是获取gravatar头像,请求之所以慢与墙有关(提供头像服务的机器网络不稳定)。最简单的解决办法是在wp-content/themes/your-theme-using目录下,在functions.php文件的结尾加上以下几行(参见http://www.dmeng.net/wordpress-replace-gravatar-host.html):

 

 



2、增加一台nginx,域名直接指向nginx所在的机器,由nginx将动态请求反向代理给wordpress容器。而静态内容由nginx处理。

此时我们可能会遇到网站无法访问的情况,在nginx的日志里可以看到是301重定向过多导致。解决办法还是在上面的functions.php文件的结尾加上一行:

 

 



 

我们还可能遇到上传新的主题文件时得到413错误,这是nginx拒绝所致,记得在nginx.conf里加上client_max_body_size 60M;

 

3、nginx还可以配成http2,但后面得用阿里云的slb防单点。

 

四、一台访问速度和功能都满足我们需求的CMS站点出现了,接下来,我们开始解决可靠性问题。首先,我们需要把单点数据库改为RDS数据库(如果你的数据库有人全职维护那就不需要)。购买一个rds实例,建议与你的ECS在同一个可用区(同一机房内,带宽高又稳定)。目前RDS单实例对于使用wordpress作为站点的公司来说应该够了吧?

1、在web站点上初始化root用户密码(注意,阿里云的RDS用户权限比自建的小了很多!)。

2、加上访问白名单。通常我们是ECS内网访问数据库(便宜安全),所以将ECS内网IP加入白名单。

3、迁移数据。这里我悲催了,阿里云RDS提供的迁移工具只能是mysql对mysql迁移,而我之前用的是相似的mariadb,迁移工具执行失败,提工单后售后反馈暂时不支持。

不同种类数据库的迁移这种情况下,用sql导入肯定是可行的。于是准备用mysqldump把mariadb中数据库的数据导出sql文件,出现错误:

mysqldump: Error: Binlogging on server not active

在my.cnf上加入

 

 


再执行:

 

 

 


先用root登上RDS,建数据库建用户。再导入时发现还是不行:

 

ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

这是生成的sql文件里有RDS不支持的操作。将其中最上面的两行删掉:

 

 


再执行:

 

 


即完成数据库的迁移。

 

4、最后将docker wordpress容器通过环境变量指向RDS数据库。

 

五、数据库单点解决掉后,再来解决wordpress container容器的单点与运维。这里有个待解决的问题是wordpress容器如果有多个实例,且跨ECS主机,那么就需要共享磁盘去映射容器中的/var/www/html目录(特别是其中包括uploads上传文件的目录)。

1、首先,我们要利用阿里云容器将dockoer容器运维起来的优势,将wordpress放在容器服务里运行。

2、其次,阿里云容器支持OSS或者NAS盘映射到集群内每一台ECS机器上某个目录。即,小学英语单词如果我们配置数据卷支持OSS和NAS(当然需要先购买这两种服务),集群内每个ECS都将自动的多出/mnt/acs_mnt/nas和/mnt/acs_mnt/ossfs目录,方便我们每个contain容器进行映射。

这里需要注意,如果是oss映射为磁盘,必须在其他参数里增加“-o umask=000",否则docker容器每次新生成的文件其权限是有问题的,无法访问,这个BUG阿里云可能以后会解决吧。

另外,大家会强烈的感受到用oss去映射/var/www/html目录网站就会非常慢,这是因为oss本身的时延就高,而改成nas盘就会好多了。(但oss盘比nas盘便宜很多)

当然,用oss可以非常方便的使用cdn,nas就没有这么便利了。


 

最终架构如上所示。

转载于:https://www.cnblogs.com/zhanglixina/p/9592879.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息驱动 微服务器,消息驱动的微服务-Spring Cloud Stream整合RocketMQ

系列文章导航: Spring Cloud Alibaba微服务解决方案常用MQ产品的选择目前主流的MQ产品有kafka、RabbitMQ、ActiveMQ、RocketMQ等。在MQ选型时可以参照这篇文章选择合适的MQ产品。RocketMQ及控制台搭建RocketMQ的搭建可以参考这篇文章。RocketMQ控制台的搭建可以参考这篇文章。R…

低并发编程

大家好,我是闪客,感谢 写代码的篮球球痴 提供的平台让我在这里给大家介绍自己,这是我的公众号卡片。为了防止大家看到这里就点击了返回按钮,我先放一张图勾引一下您。这是我公众号做的第一张动图,好多读者当时说被这张…

Redhat的Linux产品版本AS/ES/WS的联系与区别

Redhat有两大Linux产品系列,其一是免费的Fedora Core系列主要用于桌面版本,提供了较多新特性的支持。另外一个产品系列是收费的Enterprise系列,这个系列分成:AS/ES/WS等分支,他们都是redhat企业级Linux,简称…

day34进程相关

进程1 什么是进程 进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念 进程vs程序 程序:一堆代码 进程:程序的执行的过程 进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统其它所有的概念都是围绕进程来 操作系统理论: …

总结一些调试的心得,ES7243

这两天在调试一个与语音ADC芯片,也遇到了一些问题,到目前位置也解决了问题,所以想说一下嵌入式调试的一些心得,如果大家在调试设备的时候遇到问题,可以回头来看看这篇文章,可能会得到一些启发。我调试的系统…

电信无线网服务器是什么,怎样使用路由器共享电信天翼无线网络

准备工作:1.我们是四台笔记本共享:型号分别是联想thinkpad,联想非thinkpad,宏基,还有一台老爷dell(奔三 700MHZ 够老爷了吧?装的还是windows2000的系统)2. 路由器一台:腾达路由器,4孔的(TP-lin…

nls_lang.sh: 114: [[: not found

在ubuntu 10.10桌面版上安装oracle官网下载的oracle-xe-universal_10.2.0.1-1.0_i386.deb。 安装时需要加大swap分区的大小到1G以上,可以用这些命令增加dd if/dev/zero of/tmpswap bs1M count200 mkswap /tmpswap swapon /tmpswap 然后配置,在运行/etc/…

web存储机制localStorage和sessionStorage

https://www.cnblogs.com/yaoyuqian/p/7901052.html web存储包括两种:sessionStorage 和 localStorage(都是限定在文档源级别,非同源文档间无法共享) 1.sessionStorage 数据放在服务器上(IE不支持)严格用于…

“元宇宙” 是什么东西?

最近元宇宙的概念很火,所以转发一篇文章给大家看看。每当一个新东西出来的时候,有的人觉得这个是个好东西,也有人嗤之以鼻,觉得这个就是用来割韭菜的。就拿比特币来说,比特币有什么价值?他的价值无非就是操…

分布式系统服务器要求,浅谈分布式系统

分布式系统的由来软件系统的架构一直以来随着技术的发展和市场的需求进行着不断的演进。最初,各行业业务相对比较简单,对系统的要求也不高,软件系统的架构均采用单一应用架构,此时单台服务器即可满足系统的要求。之后,…

OCP Java 自测

一个朋友准备去考OCP Java认证,即原来的SCJP。心血来潮也想测测自己什么水平。找了本McGraw.Hill.OCP.Java.SE.6.Programmer.Practice.Exams,开盘就是两套自测题。14个题目,给了42分钟,按书中说法是过了8个就可以去考了。掐上秒表…

内核该怎么学?Linux进程管理工作原理(代码演示)

前言:Linux内核里大部分都是C语言。建议先看《Linux内核设计与实现(Linux Kernel Development)》,Robert Love,也就是LKD。Linux是一种动态系统,能够适应不断变化的计算需求。Linux计算需求的表现是以进程的通用抽象为中心的。进程可以是短期…

个人博客开通

点此链接 欢迎来访 ---by wolf96转载于:https://www.cnblogs.com/zhanlang96/p/9610864.html

如果访问云服务器上的文件,如果访问云服务器上的文件

如果访问云服务器上的文件 内容精选换一换WinSCP工具可以实现在本地与远程计算机之间安全地复制文件。与使用FTP上传代码相比,通过 WinSCP 可以直接使用服务器账户密码访问服务器,无需在服务器端做任何配置。通常本地Windows计算机将文件上传至Linux服务…

solaris下用户不能正常登录CDE界面的解决办法

使用过solaris系统的人,有时可能会碰到以普通用户不能正常登录CDE界面的问题,或者输入用户名和口令后,又回到登录框的现象,针对这些问题,建议按下面的步骤进行操作: 1.无法正常登录可能是由于CDE的不正确设…

int *p = *******a是什么鬼?

这是在朋友圈里面看到有人调侃的一个C语言题目,这里拿出来分享给大家看看。1我们知道int a 120; int* p &a;这样我们可以给指针p赋值。指针很多初学者学习的时候会觉得一脸懵逼,我们只要明白几个关键的东西,会让我们对指针理解更深入一…

[GO]匿名字段

package mainimport ("fmt" )type Person struct {name stringsex byteage int }type Student struct {Person //只有名字,没有字段,这里student相当于继承了person的所有字段,就有点像是继承了id intaddr string }func main() …

你见过的MCU最高GPIO翻转频率是多少?

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率。上一篇文章 《聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法》,痞子衡从原理上介绍了 i.MXRT1xxx 系列里普通 GPIO 和 …

django中的admin组件之自定义组件的增删改查的完善

昨天我们将自定义列放在类我们自定义的Bookconfig配置类内,但是这样就写死了,因为当我们访问publish表的时候应该也有这样的自定义列,所以我们应该将我们的自定义列放在默认的配置表里面。应该怎么做? 当我们的自定义列挪到默认配…

“制造商和技术支持商”

1.用优化工具。 2.system32中的OEMINFO.ini和OEMLOGO.bmp文件 转载于:https://blog.51cto.com/honglingjin2011/537680