Loading

Nginx 反向代理 一个IP代理多个域名,不区分端口,类似windows虚拟机。23-08-03,更新nginx/1.24.0

简介:

IP有限,所以我们以前使用端口来区分不同的虚拟主机,提供不同的WEB服务。

小范围还凑活,一旦规模扩大,地址记不住了吧?端口记不住了吧?

这个时候我们可以使用DNS,域名解析,毕竟记名字比记IP和端口好记。

但是,不想但是也得但是,我们以前使用的一部分端口是没办法解析的。

好吧,有用过IIS的同学会考虑,用虚拟主机,绑定域名即可。多个域名解析到相同的IP,使用相同的IP,由IIS根据访问域名来决定使用哪个虚拟主机来相应这个请求。

继续但是,IIS是微软家的技术,我最近部署的都是python+flask,IIS能支持么?

不过我已经过渡到linux+docker来部署了。这时候有什么办法来实现类似IIS的虚拟主机功能呢?

同一个IP地址,使用不同的访问域名来使用不同的主机来相应请求。

可以使用Nginx的反向代理功能。

我使用的是DOCKER技术,部署docker,部署apache,部署tomcat。

一:环境安装

1.安装linux。

2.安装docker。

3.安装docker-compose。

全略

二:docker安装Nginx

1.配置nginx.yaml

version: "3" #版本3
services: #服务
  nginx:   #服务名
    image: nginx:stable-alpine   #镜像名称
    privileged: true  #高级权限
    tty: true         #开一个终端
    container_name: nginx  #自定义容器名
    restart: always
    networks:       #网络
    - et_net         #属于网络mynet
    ports:          #开放端口映射
    - 80:80     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
    #volumes:
    #- ./nginx.conf:/etc/nginx/conf.d
networks:  #关于网络的服务
  et_net:   #声明网络mynet

 

以上内容保存为nginx.yaml即可。

2.启动nginx

运行

docker-compose -f nginx.yaml up -d

3.测试nginx

这样就配置好了,在你操作的工作站访问linux的IP,就能看到nginx启动成功如下:

 

 

三:docker安装apache

1.配置apache.yaml

version: "3" #版本3
services: #服务
  apache:   #服务名
    image: httpd:alpine  #镜像名称
    privileged: true  #高级权限
    tty: true         #开一个终端
    container_name: apache1  #自定义容器名
    restart: always
    networks:       #网络
    - et_net         #属于网络et_net
    ports:          #开放端口映射
    - 8080:80     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
networks:  #关于网络的服务
  et_net:   #声明网络mynet

  以上内容保存为apache.yaml即可

2.启动apache

运行

docker-compose -f apache.yaml up -d

3.测试访问apache

这样就配置好了,在你操作的工作站访问linux的IP:8080,就能看到apache启动成功如下:

四:docker安装tomcat

1.配置tomcat.yam

version: "3" #版本3
services: #服务
  tomcat:   #服务名
    image: tomcat  #镜像名称
    privileged: true  #高级权限
    tty: true         #开一个终端
    container_name: tomcat  #自定义容器名
    restart: always
    networks:       #网络
    - et_net         #属于网络mynet
    ports:          #开放端口映射3306-->3306
    - 8081:8080     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
    entrypoint: |
      bash -c 'cp -a webapps.dist/* webapps; exec catalina.sh run'
networks:  #关于网络的服务
  et_net:   #声明网络mynet

#由于tomcat默认已经不显示欢迎页面了,所以增加了启动脚本来恢复欢迎页面,entrypoint

 

2.启动tomcat

docker-compose -f tomcat.yaml up -d

3.测试tomcat

这样就配置好了,在你操作的工作站访问linux的IP:8081,就能看到apache启动成功如下:

 4.重点:

    container_name: apache  #自定义容器名
    networks:       #网络
    - et_net         #属于网络et_net
networks:  #关于网络的服务
  et_net:   #声明网络mynet

上面启动的三个yaml,都有这几行是重要的。

上面示例的第四行,networks,顶头写,是关于这个yaml的所有网络设置从这里开始。

第五行,创建或加入 et_net这个网络。

第二行,这个容器的网络设置从这里开始,

第三行,这个容器加入 et_net这个网络。

我们保证三个容器都加入et_net这个网络,才能直接容器互通,比写link方便。而且ipv6,也是要创建专用网络的。至少目前还不支持像ipv4一样全自动。

 

五:配置Nginx

1.检查nginx配置文件

已知nginx的配置文件为

/etc/nginx/nginx.conf  

其中重要的一句是:

include /etc/nginx/conf.d/*.conf;

进入运行的容器会看到这个conf.d目录下有一个default.conf。

 将这个文件复制出来

  docker cp nginx:/etc/nginx/conf.d/default.conf nginx.conf

我是复制到nginx.conf目录了。

 

2.修改nginx.yaml

我们将conf.d给映射出来

version: "3" #版本3
services: #服务
  nginx:   #服务名
    image: nginx:stable-alpine   #镜像名称
    privileged: true  #高级权限
    tty: true         #开一个终端
    container_name: nginx  #自定义容器名
    restart: always
    networks:       #网络
    - et_net         #属于网络mynet
    ports:          #开放端口映射
    - 80:80     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
    volumes:    #祛除注释
    - ./nginx.conf:/etc/nginx/conf.d  #祛除注释
networks:  #关于网络的服务
  et_net:   #声明网络mynet

3.重启nginx

我们为了后面的测试工作,已经将conf.d挂载在宿主机,并且也复制了default.conf。

现在我们重启一下nginx

本例:

docker compose -f nginx.yaml down

docker compose -f nginx.yaml up -d

 

4.添加apache的配置:

在同目录下,创建nginx.conf目录,或者你启动修改过的nginx.yaml会自动创建。

创建一个apache.conf文件

server {
    listen       80;
    listen  [::]:80;
    server_name  apache.local;
    location / {
        proxy_pass http://apache;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }

5.添加tomcat的配置:

在同目录下,创建nginx.conf目录,或者你启动修改过的nginx.yaml会自动创建。

创建一个tomcat.conf文件

server {
    listen       80;
    listen  [::]:80;
    server_name  tomcat.local;   #定义代理使用的域名
    location / {
        proxy_pass http://tomcat;   #定义被代理的服务器
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;    
        }
    }

6.重点:

#定义代理使用的域名,你准备访问的域名,
#定义被代理的服务器,真正的服器,由于我们的3个容器都在同一个et_net网络,所以可以直接使用容器名来访问

这里我代理到了http协议,所以默认端口80不需要填写,如果是https协议,默认端口443也不用填写,具体是什么端口什么协议,需要根据自己的实际情况来写。

查看端口有两个方法:1,到hub.docker.com查看说明。2,直接不配置端口,运行容器,用docker ps -a 看运行状态,也可以看到默认端口是多少。

7.测试

 确认conf目录已经包含了default和我们添加的apache tomcat。

进入容器进行测试

测试命令是 

nginx -t    简单测试   successful 就成功了。

nginx -T  完整测试    这个就是会列出所有配置了,自己看下自己写的tomcat apache是否都有。

 

 

8.重启nginx

首先关闭原来的nginx

docker-compose -f nginx.yaml down

再重新启动nginx 

docker-compose -f nginx.yaml up -d

4.测试访问

有如下几个地址需要测试:

apache:   IP:8080

tomcat:    IP:8081

nginx:      IP

访问这三个地址,确认三个容器都是工作正常的。

编辑host文件

增加

192.168.1.4 apache.local
192.168.1.4 tomcat.local

即将  apache.local  和  tomcat.local  解析到linux服务器去。部署的时候应该去改写DNS服务器。

然后就可以访问   apache.local  和  tomcat.local。

五:关闭apache和tomcat的外部端口

由于我们在每个yaml当中都定义了 et_net 这个虚拟网络。并且在配置Nginx时,对被代理服务器的定义也使用了docker内部虚拟网络。

那么我们可以关闭apache和tomcat的外部端口。

刚开始开放apache和tomcat的外部端口,是为了对容器工作状态进行测试。

服务器还是开的端口越少越好。

ports:          #开放端口映射3306-->3306
 - 8081:8080     #冒号左边是宿主机开放端口,冒号右边是容器开放端口

在apache.yaml  和  tomcat.yaml 当中注释掉这两行即可。

六:小结

在Listen ip:port; 这个指令行中,加参数default

这个server端就会是这个ip的默认站点。

server {
        listen       80 default;

 

至此我们已经实现了一个nginx根据访问域名不同,反向代理到不同的后端服务器去。

需要注意的是,proxy_pass http://s2.local;  这行配置时包含了http协议名称,要根据你后台被代理的服务器来配置协议。

据说nginx也支持mail服务器,也就是说不仅支持http和https,是否支持ftp?ssl?就需要查资料或做实验了。

nginx也支持动静态分离服务器。当需要的时候再来写笔记配置动静态分离。

有一些服务也会给出nginx配置信息,照着试试也行。

 

posted @ 2019-09-25 01:22  上官飞鸿  阅读(5717)  评论(0编辑  收藏  举报