Nginx 反向代理 一个IP代理多个域名,不区分端口,类似windows虚拟机。
简介:
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/nginx.conf:ro
#command: [nginx-debug, '-g', 'daemon off;'] #映射mariadb的数据库文件存储路径,冒号左边是宿主机路径,冒号右边是容器内路径
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 #冒号左边是宿主机开放端口,冒号右边是容器开放端口
networks: #关于网络的服务
et_net: #声明网络mynet
2.启动tomcat
docker-compose -f tomcat.yaml up -d
3.测试tomcat
这样就配置好了,在你操作的工作站访问linux的IP:8081,就能看到apache启动成功如下:

五:配置Nginx
1.复制nginx配置文件模板
已知nginx的配置文件为
/etc/nginx/nginx.conf
在linux执行
docker cp nginx:/etc/nginx/nginx.conf ./nginx.conf
即可将nginx的配置文件从docker容器中复制到linux宿主机的当前文件夹。
2.修改nginx配置文件
user nginx;
worker_processes auto; error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; events {
worker_connections 1024;
} http {
include /etc/nginx/mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on;
#tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; upstream s1.local {
server apache;
} upstream s2.local {
server tomcat:8080;
} server {
listen 80;
server_name s1.local;
index index.html index.htm;
location / {
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_pass http://s1.local;
}
} server {
listen 80;
server_name s2.local;
index index.html index.htm;
location / {
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_pass http://s2.local;
}
}
}
红色部分是添加进去的。
upstream s1.local {
server apache;
}
这一部分是定义一组被代理的服务器信息,upstream 和 server 是固定格式。
s1.local 是自定义的名字,apache是apache容器的名字
upstream s2.local {
server tomcat:8080;
}
定义s2.local,是tomcat的服务器信息。
重点:定义被代理的服务器,直接定义被代理的容器的名字,如果默认端口是80,那么定义被代理的服务器时不需要定义端口,如果默认端口不是80,才需要定义端口。
查看端口有两个方法:1,到hub.docker.com查看说明。2,直接不配置端口,运行容器,用docker ps -a 看运行状态,也可以看到默认端口是多少。
server {
listen 80;
server_name s2.local;
index index.html index.htm;
location / {
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_pass http://s2.local;
}
}
这是定义监听端口和监听域名,指向被代理服务器的。
s2.local是监听的域名,即访问这个域名,则用这条配置信息来指向某个被代理的服务器。
http://s2.local,是刚才配置的被代理服务器的自定义名字和协议。
3.重启nginx
我们修改了Nginx.conf配置文件,而且文件时在linux宿主机,不在容器里面。
需要修改一下启动配置文件重启才能生效。
#volumes:
#- ./nginx.conf:/etc/nginx/nginx.conf:ro
第一次的nginx.yaml当中注释掉了这两行,取消注释即可。
意思时把宿主机的nginx.conf 映射到nginx容器当中,并且只读。
nginx.yaml 和 nginx.conf 在同一个目录下就可以了。
首先关闭原来的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 s1.local
192.168.1.4 s2.local
即将 s1.local 和 s2.local 解析到linux服务器去。部署的时候应该去改写DNS服务器。
然后就可以访问 s1.local 和 s2.local 了。
五:关闭apache和tomcat的外部端口
由于我们在每个yaml当中都定义了 et_net 这个虚拟网络。并且在配置Nginx时,对被代理服务器的定义也使用了docker内部虚拟网络。
那么我们可以关闭apache和tomcat的外部端口。
刚开始开放apache和tomcat的外部端口,是为了对容器工作状态进行测试。
服务器还是开的端口越少越好。
ports: #开放端口映射3306-->3306
- 8081:8080 #冒号左边是宿主机开放端口,冒号右边是容器开放端口
在apache.yaml 和 tomcat.yaml 当中注释掉这两行即可。
六:小结
至此我们已经实现了一个nginx根据访问域名不同,反向代理到不同的后端服务器去。
需要注意的是,proxy_pass http://s2.local; 这行配置时包含了http协议名称,要根据你后台被代理的服务器来配置协议。
据说nginx也支持mail服务器,也就是说不仅支持http和https,是否支持ftp?ssl?就需要查资料或做实验了。
nginx也支持动静态分离服务器。当需要的时候再来写笔记配置动静态分离。
Nginx 反向代理 一个IP代理多个域名,不区分端口,类似windows虚拟机。的更多相关文章
- [转帖]一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS https://home.cnblogs.com/u/beyang/ 一台服务器,两个域名 首先购买https,获取到CA证 ...
- 为阿里云ECS服务器二级域名绑定tomcat子目录,实现一个IP多个二级域名
摘要:前几天租了阿里云ECS服务器,选择的Windows系统,并在服务器上部署了tomcat服务器,随后我又买了一个域名,可一个域名只能指向一个IP地址,包括二级域名也只能指向一个IP地址,并不能指向 ...
- 一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
一台服务器,两个域名 首先购买https,获取到CA证书,两个域名就得到两套证书 第二步:现在就是Nginx和OpenSSL的安装与配置(这里注意,一般情况下一个IP只支持一个SSL证书,那么我们现在 ...
- tomcat一个IP绑定多个域名,不同域名访问不同的应用
修改conf文件夹下面的server.xml的Engine里面的内容即可原始内容如下: …… <Engine name="Catalina" defaultHost=&quo ...
- 全网代理公开ip爬取(隐藏元素混淆+端口加密)
简述 本次要爬取的网站是全网代理,貌似还是代理ip类网站中比较有名的几个之一,其官网地址: http://www.goubanjia.com/. 对于这个网站的爬取是属于比较悲剧的,因为很久之前就写好 ...
- Tomcat配置一个ip绑定多个域名
在网上找了半天也没找到相关的资料,都说的太含糊. 本人对tomcat下配置 一ip对多域名的方法具体例如以下,按以下配置一定能成功,经过測试了. <Host name="localho ...
- Tomcat 下配置一个ip绑定多个域名
原文:http://pkblog.blog.sohu.com/68921246.html 在网上找了半天也没找到相关的资料,都说的太含糊.本人对tomcat下配置 一ip对多域名的方法详细如下,按下面 ...
- ubuntu(14.04版本) 配置虚拟环境(一个ip对应多个域名)
以下操作是建立在apahce安装成功的情况下 1.配置本地的host. 假设虚拟主机上的ip是:192.168.1.51,那么客户端本地的host可以配置成:
- 一个IP绑定多个域名的实现方法
方案一: 文字叙述: 具体步骤如下:比如讲apache服务器127.0.0.1 配置成 www.sohu.com 首先在http.conf文件中 做如下处理: ①关闭默认的 #DocumentRoot ...
随机推荐
- Vue命名规范
views 命名 views 文件夹下面是由 以页面为单位的vue文件 或者 模块文件夹 组成的,放在 src 目录之下,与 components.assets 同级. views 下的文件夹命名 v ...
- MSF MS11-050攻击实践及内存保护技术
内存攻击指的是攻击者利用软件安全漏洞,构造恶意输入导致软件在处理输入数据时出现非预期错误,将输入数据写入内存中的某些特定敏感位置,从而劫持软件控制流,转而执行外部输入的指令代码,造成目标系统被获取远程 ...
- Hbase的表结构中rowkey的设计---避免热点问题
热点问题 hbase 中的行是以 rowkey 的字典序排序的,这种设计优化了scan 操作,可以将相关的 行 以及会被一起读取的行 存取在临近位置,便于 scan . 然而,糟糕的 rowkey 设 ...
- 《exception》第九次团队作业:Beta冲刺与验收准备(第二天)
一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握软件黑盒测试技术:2.学会编制软件项目 ...
- postgres —— 有序集与假象聚集
有序集 -- 有序集.分组后,按给定顺序排序,再进行计算 SELECT region, percentile_disc(0.5) WITHIN GROUP (order by production) ...
- 阿里云——扩展Linux系统盘
前言 地址|https://help.aliyun.com/document_detail/111738.html?spm=a2c4g.11186623.2.7.1d284c07SFRBaq#sect ...
- 读取txt写入excel
import csv #实现的思想:首先从txt中读取所有的内容,NUM=1当做键,其他当做值,如果查找缺少a,b,c,d,e,f,g# 则NUM不会添加到字典中,然后通过所有的NUM和字典中的KEY ...
- JSON—去除JSON数据中的所有HTML标…
package com.linoer.utils; import java.util.ArrayList; import java.util.List; import java.util.regex. ...
- 题解 UVa11076
题目大意 多组数据,每组数据给出 \(n\) 个一位数,求出这些一位数组成的所有不同整数的和. 分析 考虑一个数对某一位的贡献,为这个数乘以其他数的全排列数,问题转化为可重复元素的全排列. 引理 \( ...
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...