相信点进来看的朋友们可能是被我的标题吸引的,没错,我就是标题党,本文所实现的并不是真正的网络隔离,只是实在想不出什么好的标题了,才这么写的
或许在平时的使用中,(我说的是内网环境下),可能会看到如下的url地址
- http://172.16.4.111:8080/xxx
- http://172.16.4.111/app1/user/login
- http://172.16.4.111/app2/getUserList
- http://172.16.4.111/menu/list
咋一看这些url有什么问题?没什么毛病,我想说的是三种类型的项目url暴露形式,这三种形式都可以将自己的应用暴露出来,给内网的用户使用,针对上面四种url,我下面细说一下是哪三种。
这里只讨论直接面向用户暴露,用户可以通过浏览器访问到的情况,不讨论微服务或者其他RPC服务这种暴露给服务调用的情况
- 直接暴露端口的形式。不管是走了nginx还是直接其他web应用,都直接暴露端口给用户访问。
- 走nginx做映射,不同的应用有不同的location上下文。
- 直接nginx的/就映射到应用,单一ip单一应用模式。
首先,在我看来,如果要排序的话,我的接收程度是3>2>1。首先最不喜欢的就是直接暴露端口给用户看,这样子真的很丑。最好的就是一个ip直接过来就可以访问应用,折中是带url前缀的情况。但是很多时候,很多人都是直接暴露端口出来给用户访问,实在不能忍啊,同时如果开启了防火墙的话,还需要暴露其他端口,其实我只希望暴露出80端口和22端口给http和ssh,其他的端口都不想暴露出来。
那么对于一个ip一个应用的方式,是不是要一个应用部署一台服务器呢?如果对于生产环境来说,我的建议是的,所以,我在本文写到的很多都是我自己玩耍弄的,并不建议看到的朋友直接在自己的生产环境这么玩。如果不慎这么玩了,那么后果自负了。回到正题,如果服务器资源不就匮乏的情况下,能不能在一台服务器实现绑定多个ip,不同的ip进来访问到不同的应用呢?下面我们一起来探索一下。
CentOS7 配置多个ip
实际上,一台Linux服务器是支持绑定多个ip的,我们这里以单网卡的情况讨论,多网卡的情况在这不讨论了。由于都是在同一个网卡,因此性能什么的肯定不会有本质的提升,只能说做到一个看起来的网络隔离而已。
我们可以先查询一下自己的网卡,如果是CentOS7,可以是使用如下命令:ip a
。如下图所示,圈出来的ens192就是网卡名称。不同的机器这个可能不同。
接着可以到/etc/sysconfig/network-scripts
找到与你机器网卡对应的配置文件,我的是ifcfg-ens192。接着编辑这个配置文件。添加圈出的内容
圈出来的就是需要添加的ip,要注意IPADDR不能重复,要么用1,2这样的数字区分。编辑完成后,重启网络。执行systemctl restart network
。然后再次执行ip a
,如果看到下面圈出的部分,证明绑定成功了。
可以看到,显示的ip就是我们刚添加进去的ip。
Nginx配置
如果安装有nginx,并且是默认配置的话,我们可以在浏览器通过绑定的ip挨个访问,看是否都可以显示出nginx的欢迎页面。ip绑定完成之后,就是如何通过nginx的配置来让不同的ip访问到不同的web应用(包括反向代理也是一样的)。下面让我们一起来配置一下。
首先,需要让nginx支持多conf,因为不同的项目用不同的conf会很好维护。在nginx安装目录下(下面用$NGX_HOME
变量来代替)$NGX_HOME/conf
下面,创建一个叫conf.d
的目录。然后在nginx.conf加入include $NGX_HOME/conf/conf.d/*conf
。如下图
此时的nginx.conf,除了http context不要有其他context了,所以的server context移动到conf.d下面的各个应用的conf了。在每个应用自己的conf文件,要注意修改server_name为要绑定的ip
示例
我们弄一个示例,来测试一下是否可以通过不同的ip访问到不同的应用。
在conf.d下面新建三个conf,如下图所示
以其中一个为例,如下图显示要注意的项
然后我们再创建三个项目目录,里面只放一个html文件
重启nginx服务之后,我们依次访问下如下url:
可见,我们绑定的ip对应不同应用已经生效了。
结束语
这只是个人的一个出于好奇心的一个实验,实践证明如果不想在一台机上通过不同端口和配置url前缀的形式给用户访问自己的应用,可以通过配置多个不同的ip,配置nginx映射让用户感觉到似乎是访问不同的服务器,而单个ip的形式也比较好看。不过还是要强调一下生产环境尽量不要这么玩,因为单机性能有限的,运行多个应用,不管在带宽还是CPU/内存上都是很容易到瓶颈的 我的尝试也是为了解决测试环境的问题而已,毕竟每个项目弄一台代理或者单独的应用服务器会有点浪费。同时不喜欢暴露80以外的端口给用户看到。
笔者本人水平有限,可能还有别的更好的办法只是我不知道而已,本文所描述的方式也只是本人即兴去测试的,难免会有错误,如果各位看官发现有什么错误或有什么更好的建议,欢迎评论区批评指正和提出宝贵的意见和建议。