利用Docker部署Nginx配置反向代理实现二级域名访问WordPress

利用Docker部署Nginx配置反向代理实现二级域名访问Wordpress-Luninousail ' Blog

最近把Wordpress的80端口腾了出来,起因是百度云的域名不支持二级域名的隐性URL转发,这就意味着一个域名只能绑定一个系统,不然就只能用域名:端口的形式访问其他系统,那也太丑了。

于是最后就决定自己用Nginx反向代里来实现二级域名转发,好处是一个域名可以反复使用,而且好看。本来以为不过就是用Docker拉个镜像回来,一运行,一配置就搞定的事,结果没想到里面坑贼多,愣是让我昨天晚上搞到两点多,早上一起来继续踩坑,直到中午才算全部搞定。

这里简单介绍一下Nginx,Nginx是一个轻量级的反向代理Web服务器,其特点是占有内存少,并发能力强,主要应用场景是大流量下用来充当负载均衡的角色,以及像我今天要做的用来转发请求的反向代理服务器。

正式开始

一、使用Docker拉取Nginx容器并运行

第一步很简单,使用命令获取容器然后运行:

docker pull nginx
docker run --name nginx -p 80:80 -d nginx

如果运行成功的话,这时访问服务器的80端口,会出现Nginx提示的成功页面。

利用Docker部署Nginx配置反向代理实现二级域名访问Wordpress-Luninousail ' Blog

二、编写Nginx配置文件

第一步很简单,但是从第二步开始各种问题接踵而至,因为我用的是Docker,其沙盒封闭的特性虽然很方便,但在修改内部文件的时候就极其麻烦了,而且Nginx中的容器内是没有打包Vim编辑器的,这意味着什么呢,就是要你一个文字工作者在一台没有world甚至没有记事本的电脑上工作一样,这个配置文件的修改就很麻烦了。

由于我是第一次配置Nginx,没什么经验,也不知道配置的对不对,经常花了好大的力气把配置文件放进容器内重启后,容器就崩了,然后又要找问题改配置文件再传进去,网上的很多文章直接拿来用会出各种问题,最后经过很多次实验才获得一个比较完善能跑的配置文件。

这里有三种编辑配置文件的方法:

  1. 在容器外编辑完后拷贝到容器内部覆盖原有的配置文件
  2. 在容器内部下载Vim编辑器,直接修改配置文件
  3. 用docker的-v参数把配置文件挂载到本地修改

其实更推荐第三种挂载的方法,但我个人对Docker和Linux用的确实也不太熟,挂载了好几次也没有顺利一次过,后面索性放弃,用了最吃力的第一种方法。

在宿主主机内新建文件default.conf

 server {
             listen       80;
             server_name  www.blog.你的wordpress域名.com;
 
             proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Server $host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             location / {
                     proxy_pass http://ip地址:端口号; 
                     proxy_connect_timeout 600;
                     proxy_read_timeout 600;
	     proxy_redirect     off;
        	     proxy_set_header   Host             $host;
                     proxy_set_header   X-Real-IP        $remote_addr;
                     proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                 }

         }

 server {
             listen       80;
             server_name  www.你的域名.com;
 
             proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Server $host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             location / {
                     proxy_pass http://ip地址:端口号; 
                     proxy_connect_timeout 600;
                     proxy_read_timeout 600;
                 }
         }

这里讲解几个关键参数:

listen:监听的端口

server_name:要转发的域名

proxy_pass:要转发到的目标地址

然后把配置文件拷贝到容器内部,同名文件会自动覆盖,然后重启容器:

docker cp default.conf 容器id:/etc/nginx/conf.d
docker kill 容器id
docker start 容器id

之后查看容器状态,如果Nginx容器没有崩溃自动退出的话,就意味启动成功了。

三、对Wordpress的改造

到这里理论上来说Nginx的反向代理服务器已经配置成功了,但是如果我们直接如果二级域名来访问Wordpress的话,会发现无法直接访问,这时我想起了之前的文章中写过的Wordpress会自动拦截非配置域名,于是我直接修改数据库的配置后果然可以访问了。

但新的问题又出现了:访问的页面乱七八糟的,样式文件全部丢失无法加载。我在网上查了资料,最后得出结论:Wordpress原生是不支持反向代里的。我们通过二级域名转发到Wordpress的ip地址和端口后,系统只能识别出自身所在的地址,并不能以我们的二级域名作为路径来加载静态文件,所以会出现样式丢失的现象。

所以这里我们需要对Wordpress的源码进行改造,使其支持反向代理。另外其实也需要对配置文件进行修改的,不过上面的文件是我已经修改过的版本,所以这里就不提及了。

首先我们需要进入Wordpress容器内部,修改wp-config.php源码:

docker exec -it 容器id /bin/bash
vim wp-config.php

在其中加入获取转发的地址代码:

if ( ! empty( $_SERVER['HTTP_X_FORWARDED_HOST'] ) ) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}

然后重启容器,通过二级域名访问,你就会惊讶地发现大部分样式已经恢复了,但到这里其实还差一步,因为我的wordpress搭建了已经有一段时间了,所以里面有很多静态文件使用地还是旧域名地地址,所以我们还需要使用Search-Replace-DB插件来把数据库内全部旧地址替换为新地址,这样才不会造成访问时图片丢失。

利用Docker部署Nginx配置反向代理实现二级域名访问Wordpress-Luninousail ' Blog

四、发现的问题与总结

到这里,通过Nginx转发二级域名实现多系统访问的代理服务器就算是搭建完成了,中间遇到了一些问题,这些问题在最后做出一个汇总,起到一个记录的作用。

4.1 Nginx部署成功后502 Bad Gateway错误

在第一次Nginx部署成功后有很长一段时间,不管访问那个域名都会报一个502 Bad Gateway错误,我查了很多资料,根据上面的方法改了很多东西,结果都不对,用公网ip却可以访问,最后我突然想到会不会是百度云的锅,查了一下果然是,在转发的本地地址那里不能使用本地id127.0.0.1,而需要使用百度云自己的一个本地ip地址,更换后成功访问。

4.2 防火墙拦截端口问题

防火墙会拦截Wordpress和数据库之间的接口,所以有时候会发现Wordpress报一个数据找不到之类的异常,这时候需要我们在防火墙中给端口开白名单或者直接关闭防火墙。

4.3 转发的域名设置问题

在跟着网上的文章走的时候发现的一个坑,上面顶级域名用的是www.xxx.com,二级域名直接就用了blog.xxx.com,然后我也就这样配了,结果二级域名只能跳转到顶级域名所指向的地址,最后尝试将二级域名换成www.blog.xxx.com后,成功跳转。推测应该是浏览器会自动加上www,如果没有在二级域名前配置的话,会自动被顶级域名的转发拦截下来。

五、附录

5.1参考文章

Docker容器部署 Nginx服务

Docker 进入容器,并在容器内执行命令

简单解决Docker中的镜像没有vim的问题

docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

Linux 命令之删除命令

vim复制粘贴命令

Linux防火墙开放某端口号

Docker nginx部署二级域名访问多个web项目

怎样把wordpress 部署在反向代理的后面?

5.2使用插件

Better Search Replace

本文系作者 @ 原创发布在 Luninousail ' Blog。未经许可,禁止转载。

喜欢()
评论 (0)
183 文章
4 评论
25 喜欢
Top