基于docker+nginx反向代理部署多站点

测试所需环境

为了测试反向代理是否成功,需要在服务器中至少创建三个容器,一个容器用于反向代理,两个容器作为站点服务器进行部署,本测试用到的两个站点分别是blog、crm。

本测试在windows 10中安装虚拟机,并预先在虚拟机中安装了CentOS 7的操作系统和docker,这里假设CentOS 7宿主机的IP地址为192.168.86.136。

操作步骤

准备工作,在宿主机中创建几个目录,用于存放反向代理服务器和站点的挂载目录:

cd /usr/local/src/
mkdir -p dockerConfig/{nginxMaster,nginxBlog,nginxCrm}

docker的准备工作,拉取一个nginx镜像,并启动一个测试用的nginx容器:

docker pull nginx:1.17.10
docker run -it --name nginx-test -d nginx:1.17.10

将需要用到的配置文件、html文件等拷贝到宿主机,便于在以后的步骤中进行挂载:

# 拷贝容器内的文件到反向代理服务器宿主机目录
docker cp nginx-test:/etc/nginx/nginx.conf /usr/local/src/dockerConfig/nginxMaster/nginx.conf
docker cp nginx-test:/etc/nginx/conf.d/ /usr/local/src/dockerConfig/nginxMaster/conf.d/
docker cp nginx-test:/usr/share/nginx/html/ /usr/local/src/dockerConfig/nginxMaster/html/
docker cp nginx-test:/var/log/nginx/ /usr/local/src/dockerConfig/nginxMaster/logs

# 拷贝容器内的文件到blog站点宿主机目录
docker cp nginx-test:/etc/nginx/nginx.conf /usr/local/src/dockerConfig/nginxBlog/nginx.conf
docker cp nginx-test:/etc/nginx/conf.d/ /usr/local/src/dockerConfig/nginxBlog/conf.d/
docker cp nginx-test:/usr/share/nginx/html/ /usr/local/src/dockerConfig/nginxBlog/html/
docker cp nginx-test:/var/log/nginx/ /usr/local/src/dockerConfig/nginxBlog/logs

# 拷贝容器内的文件到crm站点宿主机目录
docker cp nginx-test:/etc/nginx/nginx.conf /usr/local/src/dockerConfig/nginxCrm/nginx.conf
docker cp nginx-test:/etc/nginx/conf.d/ /usr/local/src/dockerConfig/nginxCrm/conf.d/
docker cp nginx-test:/usr/share/nginx/html/ /usr/local/src/dockerConfig/nginxCrm/html/
docker cp nginx-test:/var/log/nginx/ /usr/local/src/dockerConfig/nginxCrm/logs

在上一步中,也可以仅从容器中拷贝一份文件到一个宿主机目录,然后直接从宿主机中复制到其他的站点目录即可。测试容器使用完成后,即可删除:

docker container rm -f nginx-test

接下来针对反向代理服务器和各站点创建不同的容器,让其分别挂载宿主机上对应目录的配置文件,在此需要特别留意宿主机与容器之间的端口映射,在后续的配置过程中需要用到。

  1. 创建反向代理服务器容器
docker run -it \
--name nginx-master \
-p 80:80 \
-v /usr/local/src/dockerConfig/nginxMaster/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/src/dockerConfig/nginxMaster/conf.d/:/etc/nginx/conf.d/ \
-v /usr/local/src/dockerConfig/nginxMaster/html/:/usr/share/nginx/html/ \
-v /usr/local/src/dockerConfig/nginxMaster/logs/:/var/log/nginx/ \
-d nginx:1.17.10 
  1. 创建blog站点容器
docker run -it \
--name nginx-blog \
-p 8081:80 \
-v /usr/local/src/dockerConfig/nginxBlog/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/src/dockerConfig/nginxBlog/conf.d/:/etc/nginx/conf.d/ \
-v /usr/local/src/dockerConfig/nginxBlog/html/:/usr/share/nginx/html/ \
-v /usr/local/src/dockerConfig/nginxBlog/logs/:/var/log/nginx/ \
-d nginx:1.17.10 
  1. 创建crm站点容器
docker run -it \
--name nginx-crm \
-p 8082:80 \
-v /usr/local/src/dockerConfig/nginxCrm/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/src/dockerConfig/nginxCrm/conf.d/:/etc/nginx/conf.d/ \
-v /usr/local/src/dockerConfig/nginxCrm/html/:/usr/share/nginx/html/ \
-v /usr/local/src/dockerConfig/nginxCrm/logs/:/var/log/nginx/ \
-d nginx:1.17.10 

修改反向代理服务器配置,使其实现反向代理功能,需要注意宿主机的ip地址和端口号,端口号要跟之前创建容器时分配的端口号相对应:

cd /usr/local/src/dockerConfig/nginxMaster/conf.d/
mv default.conf master.conf
vim master.conf

# 将如下内容替换至master.conf文件中
server {
    listen       80;
    # blog站点的域名
    server_name docker8.blog.localhost.com;
    location / {
       # 宿主机ip地址:blog容器对应宿主机的端口
       proxy_pass http://192.168.86.136:8081/;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {
    listen       80;
    server_name docker8.crm.localhost.com;
    location / {
       proxy_pass http://192.168.86.136:8082/;
      }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启反向代理服务器容器,使配置文件生效:

docker container restart nginx-master

修改各站点的站点文件:

  1. blog站点
cd /usr/local/src/dockerConfig/nginxBlog/html/
vim index.html

# 将如下内容替换至index.html文件中

Hello, Blog!

  1. crm站点
cd /usr/local/src/dockerConfig/nginxCrm/html/
vim index.html

# 将如下内容替换至index.html文件中

Hello, crm!

修改windows系统中的hosts文件,添加以下两条映射:

192.168.86.136  docker8.blog.localhost.com
192.168.86.136  docker8.crm.localhost.com

至此,所有的配置均已完成,在windows的浏览器中分别访问 docker8.blog.localhost.comdocker8.blog.localhost.com ,即可看到页面中的反馈结果是不相同的。

  1. 访问 docker8.blog.localhost.com 域名时

    blog

  2. 访问 docker8.crm.localhost.com 域名时

    crm

扩展

如需在以上环境中新增新的站点,请遵循以下步骤进行操作即可:

  1. 将现有站点目录拷贝为新的站点目录;
  2. 创建新的容器,宿主机的挂载点修改为第1步中创建的对应目录;
  3. 在反向代理服务器的配置文件master.conf中新增一个server,修改需要的域名,端口请填写上一步中创建新容器时指定的宿主机的端口;
  4. 重启反向代理服务器容器;
  5. 在windows系统的hosts文件中新增域名和宿主机ip地址的映射关系;

同样,通过修改 master.conf 文件,也可以将反向代理的地址指向到其他的宿主机ip地址,以达到通过同一台反向代理服务器,访问多台宿主机中部署的站点的目的。

你可能感兴趣的:(基于docker+nginx反向代理部署多站点)