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#
运行
1 | docker-compose -f nginx.yaml up -d |
3.测试nginx#
这样就配置好了,在你操作的工作站访问linux的IP,就能看到nginx启动成功如下:
三:docker安装apache#
1.配置apache.yaml#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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#
运行
1 | 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#
1 | 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的配置文件为
1 | /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
1 | docker-compose -f nginx.yaml down |
再重新启动nginx
1 | 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的外部端口,是为了对容器工作状态进行测试。
服务器还是开的端口越少越好。
1 2 | 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配置信息,照着试试也行。
#
作者:上官飞鸿
出处:https://www.cnblogs.com/jackadam/p/11582121.html
版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!