搭建 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,例如:
- [mysqld] init_connect = 'SET collation_connection = utf8_unicode_ci'init_connect = 'SET NAMES utf8'character - set - server = utf8collation - server = utf8_unicode_ciskip - character - set - client - handshake[client]
- default - character - set = utf8[mysql]
- default - character - set = utf8
用 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 也是如此,这里我们主要是修改其连接哪个数据库,通常这四个环境变量配置好即可。
- -e WORDPRESS_DB_HOST=... -e WORDPRESS_DB_USER=... -e WORDPRESS_DB_PASSWORD=... -e WORDPRESS_DB_NAME=...
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 文件,在此文件中输入以下配置项:
- php_value upload_max_filesize 64Mphp_value post_max_size 64Mphp_value max_execution_time 300php_value max_input_time 300
这里把上传文件的大小增加到 64M。
再启动 docker 容器,上传并安装新主题即可。
三、接着,多半会发现这个站点太慢了,体验很差,我们希望网站速度更快一点。
1、用浏览器的 debug 模式可以发现,最慢的请求从 url 看都是获取 gravatar 头像,请求之所以慢与墙有关(提供头像服务的机器网络不稳定)。最简单的解决办法是在 wp-content/themes/your-theme-using 目录下,在 functions.php 文件的结尾加上以下几行:
- function dmeng_get_https_avatar($avatar) {
- $avatar = str_replace(array("www.gravatar.com", "0.gravatar.com", "1.gravatar.com", "2.gravatar.com"), "secure.gravatar.com", $avatar);
- return $avatar;
- }
- add_filter('get_avatar', 'dmeng_get_https_avatar');
2、增加一台 nginx,域名直接指向 nginx 所在的机器,由 nginx 将动态请求反向代理给 wordpress 容器。而静态内容由 nginx 处理。
此时我们可能会遇到网站无法访问的情况,在 nginx 的日志里可以看到是 301 重定向过多导致。解决办法还是在上面的 functions.php 文件的结尾加上一行:
- remove_filter('template_redirect', 'redirect_canonical');
我们还可能遇到上传新的主题文件时得到 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 上加入
- log_bin=mysql-bin
再执行:
- mysqldump --databases yourdb --user=youruser -hyourhost --password --master-data > transfer.sql
先用 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 不支持的操作。将其中最上面的两行删掉:
- CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.000001',
- MASTER_LOG_POS = 191500;
- CREATE DATABASE
- /*!32312 IF NOT EXISTS*/
- `yourdb`
- /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */
- ;
再执行:
- mysql -u youruser -h yourhost yourdb -p < transfer.sql
即完成数据库的迁移。
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 就没有这么便利了。
最终架构如上所示。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: