nginx根据域名转发
如今docker使得本地部署服务越来越容易了,例如本人就使用了docker部署了gitlab-ce服务。但是对局域网的其他用户希望是通过gitlab.nathan.com进行访问,这就意味着gitlab服务需要部署在80端口上。但是其他服务也需要这样,即也需要80端口。多个服务不可能同时暂用同一个端口,但是可以通过nginx转发。比如A服务是7080端口,对应的域名是a.center.com;B服务对应的端口是6080端口,域名是b.center.com。nginx更具域名进行转发到不同端口上。
ngxin配置:
备注: 现在很多路由器都支持修改hosts,比如小米路由器、华硕梅林路由器等。
nginx只用一个公网端口转发多个内网服务
一个常见的问题,生产环境的一台有公网ip的服务器,为了安全起见,运维只给开一个端口,于是考虑用nginx根据url的前缀路径来转发到不同服务。例如:
以springboot工程为例,我们自己的web服务一般都会通过设置
来给该服务的所有url设置一个统一的前缀路径 /xxxxxx 。这时候nginx就可以将所有带有前缀 /xxxxxx 的请求转发到该服务。这是一个很简单的事。
问题是有很多第三方服务,例如kafka manager,他是没有这样的前缀的,假设kafka安装在 192.168.0.182 机器上,kafka manager的访问地址就是 ,我们当然可以在首次访问时通过地址 让nginx根据 /kafka 识别到这是kafka manager服务并转发到 ,但是我们打开kafka manager页面上的链接时是不会有我们自己添加的 /kafka 前缀的,上面的方法失效。
我们都知道http服务是无状态的,就像上面所说即使访问了kafka manager的主页,点击主页上按钮发起的请求也无法被识别为kafka manager请求。但是web服务绝大多是都是需要有状态的,主要有session/cookie、token两种方式来解决这个问题。也可以用来解决上面的问题。
在nginx中配置:
这时候又有一个问题,使用同样的ip:port来访问这些服务,在浏览器看来所有的服务都是一个域的,他们的cookie就会是同一个cookie,这时候nginx没办法根据cookie的不同转发到不同的服务。
我们想到了给每个服务配置一个域名(没有那么多公网域名可用,就在本地hosts文件配置了),产生跨域的效果,让不同的服务有独立的cookie。
从来都是解决跨域问题,从没想过有一天要主动跨域
如果配置了域名,完全可以让nginx根据域名来做识别转发,为什么要用cookie呢?如果你都是配置了公网域名,那确实可以这么干,但是我们是改的hosts文件,保不齐谁的域名就写错了,或者因为只是本地hosts文件的修改根本就没必要统一域名,这时候根据域名做转发就不行了。
kafka manager的访问是不需要认证的,暴露在公网上、面向所有人是一件可怕的事,我们是设置了VPN和访问白名单。
Nginx配置多个服务共用80端口
对于Web而已,80端口和443端口是十分重要的,原则上需要输入 才可以浏览网页的,但由于默认端口是80,所以‘:80’可以忽略。同理对于https的443端口也一样。
随着服务器性能的提升和业务的需求,一台服务器上往往会同时有多个服务,这些服务都希望监听80端口,比如有vue.msg.com和react.msg.com。这时候我们可以使用nginx的代理转发功能帮我们实现共用80端口的需求。
首先我们先在两个空闲的端口上分别部署项目(非80,假设是8080和8081), nginx.conf 配置如下:
上面就是常规的配置,紧接着如果已经做好域名解析,希望vue.msg.com打开vue项目,react.msg.com打开react项目。我们需要再做两个代理,如下:
nginx如果检测到vue.msg.com的请求,将原样转发请求到本机的8080端口,如果检测到的是react.msg.com请求,也会将请求转发到8081端口。
这样nginx对外就有四个服务,我们只需要公布80端口的就可以了,这样就实现了多个服务共用80端口。
nginx配置多个https端口
https配置对于Nginx来说是很常见的,不管是多个端口还是单个端口都可以,下面我们以配置多个https端口来说明:
1. 首先,需要准备一个可用的证书文件,可以是自签名证书,也可以是CA机构颁发的证书,包括证书文件和私钥文件。
2. 在Nginx的配置文件中添加SSL模块,如下所示:
ssl_certificate your_certificate.crt;
ssl_certificate_key your_certificate.key;
3. 在Nginx配置文件中添加新的https端口,如下所示:
listen 443 ssl;
4. 如果需要支持多个https端口,可以重复上面的步骤,添加多个监听端口,如下所示:
listen 443 ssl;
listen 444 ssl;
listen 445 ssl;
5. 最后,执行重启Nginx服务,使配置文件生效:
sudo service nginx restart
Nginx配置——单域名反向代理多个端口
安装Nginx相对来说是非常简单的,运行下面两条命令即可。
安装成功后,设置开机启动。
启动nginx,访问80端口,发现已经启动成功了。
接下来,我们进入nginx目录下,找到nginx.conf文件开始配置;这里我把nginx.conf文件中的server配置统统删除了,以后我们再配置新的server,只需要再conf.d文件夹中创建新的*.conf即可。
配置如下:
接下来,我们需要配置一个server用于端口服务的反向代理,进入 conf.d 文件夹新建一个main.conf。
配置main.conf如下:
接下来,我们通过 就可以访问到接口啦。