基于Docker的WordPress快速部署

前面的话

在有了前面的 Docker 的 PaaS 的管理,在这里一切变得简单起来了,写好 Compose 的文件,一个简简单单的 stack deploy 就可以直接跑起了这个服务栈,美哉美哉。

而且作为一个综合的建站的项目,涉及到的东西,还是相当的多的,从前面的建站,到后面的优化部分,笔者也算是投入了比较多的时间,这里总结整个过程,以及各种遇到的问题。另外这里的 compose 的文件都是可以直接使用的。 意味着,你也可以很轻松的搭建起一个 基于 Docker 的 wordpress 平台
(你所看到的内容是笔者因为没有开自动保存,第二次敲上去的 ?)

快速部署

这个,官方给出的 docker-compoose.yml 的文件,这里直接进行使用。使用 docker stack 的命令,就可以自己进行部署,简单高效。这里的 栈的构成,有两个服务,其中一个 是 mysql 数据库,另一个部分是 Apache(带wordpress 以及 PHP环境的)。

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: ${MYSQL_DATABASE_PASSWORD}
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     image: wordpress:latest
     ports:
       - 80 # 暴露 容器 80
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306   # 容器内的 hostname
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

volumes:
    # 数据持久化用
    db_data:

这里是 Centos 下面安装 Nginx 的一个小小的 Tips,因为官方的源好像是没有Nignx的。

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum install -y nginx

安装完成之后自直接使用 Nginx 来进行反代的配置,访问器反代的端口,理应可以看到安装界面(关于如何配置 Nignx 的反代,可以在本站进行搜索)

Touble Shooting

这里记下来一个踩的坑,在完成 反代设置之后,直接进行访问,发现会得到 500 的错误,这里查看日志,得到以下的问题
Nginx 报错 (13: Permission denied) while connecting to upstream

借助搜索引擎,得到这个是一个较为共性的问题,其原因是 LinuxSE 导致的(唉,这些本来提供安全的功能,还有防火墙之类的东西倒是带来了不少的麻烦,)
(所以,听到的最多的回答就是 “关了它”)

在 StackOverflow 里面的帖子如下

13: Permission denied while connecting to upstream:nginx

以及这里的一条命令的解决方法。

setsebool httpd_can_network_connect on -P

至此应该是没什么大问题了,乖乖的安装 吧

自定义配置

内外网访问

由于服务器用的是自己的物理主机,需要把服务映射到外网去。所以这里的就是关于内外网访问的设置。
网上的大多数的方案都是改数据库,或者直接 在 setting 的界面,把站点改为外网的URL。
这样不仅觉得很没有美感,而且问题出现了,很难支持多域名访问(CNAME 当我没说),而且我内网的访问,也要在外面绕一圈,多亏啊
file


所以这里,在网上找了找类似的设置方法,这里找到了一个比较优雅的设置方法,直接在 wp-config.php 里面进行设置。
博文链接如下:

外网如何访问内部WordPress网站

简单来说,直接在配置文件的后面配置下面的一php的宏就OK了

define( 'WP_CACHE', true );
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);

内容其实也挺有意思,通过 php 里面的全局变量,打到动态设置 这些配置的作用。妙哉


由于这里使用 Docker 进行部署和发布,如果一直使用这种改配置文件的方法,显得不太优雅,所以

当你发现不知道怎么办的时候,就求助官方文档了

于是去看了看 wp 的dockerhub 官网:

https://hub.docker.com/_/wordpress?tab=description

果不其然,真是让我找的了这个部分,这个宏的配置将会被追加到配置文件中去。

  • -e WORDPRESS_CONFIG_EXTRA=... (defaults to nothing, non-empty value will be embedded verbatim inside wp-config.php — especially useful for applying extra configuration values this image does not provide by default such as WP_ALLOW_MULTISITE; see docker-library/wordpress#142 for more details)

https://github.com/docker-library/wordpress/pull/142
Great idea, why not merge it?


所以这里得到了更加优雅的解决方法,直接在我们的compose 文件里面添加我们的补充的宏就好了:

WORDPRESS_CONFIG_EXTRA: |
    /* Multisite */
    define( 'WP_CACHE', false );
    define('WP_SITEURL', 'http://' . $$_SERVER['HTTP_HOST']);
    define('WP_HOME', 'http://' . $$_SERVER['HTTP_HOST']);

这里说是有个坑,这个配置要在间上面的原始的解决方案来源。因为页面会有缓存,那么我们的站点路径也不会被更新,所以这里disable掉。


这里还有个坑,我竟然还去啥啥的提了issue。这里的$符号在Compose 文件里面,会被转义。使用 $$ 符号,避免被转义

Nignx 反代后端地址问题

在完成上面的主机配置之后,又遇到了一个问题:在外网进行映射访问的时候,发现可以进主页,而且其他的资源的url,统统的是我本地的hostname, 当时我就很奇怪了。这个什么情况,怎么后面服务器的内容跑到这里来了?

不过,可能也是直觉,立马去 nginx 去看了日志,发现了一些端倪,这个url的host和我设置的nginx里面的upstream的值是一样的。
这样就懂了,我直接进行了代理,没有进行host的proxy,所以导致了后端 php 的$_SERVER['HOST'] 得到的是我们这个反代的。解决方案在 nignx 的配置里面改就好:

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 $scheme;

可以参考链接:

https://blog.51cto.com/wangxiaoke/2175991


db多节点共享

这里说是共享,可能是比较的不准确,这里的共享,应该指的是主机之间的复用。
因为这里出了一点小状况:

Swarm集群里面的一个节点被拔了网线,所以这个服务肯定会漂移到另一台主机上,但是,可以看一开始的compose 就会发现:有问题,因为使用了 Volume 来做的数据持久化。这个卷只会存在本机。所以导致,服务漂完之后数据全没有了。

为了解决上面的问题,这里就需要实现数据库的数据共享了,怎么个共享法呢?也挺俗的,就是 NFS

volumes:
    db_data:
      driver_opts:  
        type: "nfs4"
        o: "addr=192.168.*.*,nolock,soft,rw"
        device: ":/srv/nfs/*_db"
    wp_data:

关于怎么在 Cent 上面使用 nfs 的可以参考下面文章操作:

https://qizhanming.com/blog/2018/08/08/how-to-install-nfs-on-centos-7

记得在 /etc/exports 里面把目的文件夹暴露出来

其实这个 WordPress 折腾了蛮久,想想才回来写这些东西。
后面会有一篇专门来优化的,

孤立系统自发地朝着热力学平衡方向──最大熵状态──演化

留下点什么吧