访问局域网内其他主机的虚拟机上部署的项目
最近比较忙,好长时间没写博客了,今天挤点时间写一写,也就当做这段时间碰到的一个问题
首先,博主使用的linux是Ubuntu16.04:
其次,局域网内有两台主机,IP分别是192.168.28.94和192.168.28.213,下文分别简称94和213,可见这两个主机处于同一网段,是可以连通的,可以互ping试一下,如果不能ping通,看下是否是网线没连上,防火墙有没有关
接着,我们的虚拟机地址是192.168.209.129,下文简称129,虚拟机运行在213上,虚拟机和213主机是可以ping通的,如果ping不通,看下虚拟机和213的防火墙有没有关,而我们的94是连不上虚拟机的,自然也就ping不通了
好了,现在问题是让94主机访问虚拟机上的项目,这里使用.net core项目为例,也可以是其他项目,如java.python等等都可以
为了解决这个问题,我的想法是这样的,94可以连上213,而213可以连上虚拟机129,那么可以在213主机上做一个反向代理,让请求转发到虚拟机上,有了这个思路,我们就可以下手了
一、安装dotnet,运行.net core项目
如果是java,就是安装JDK,如果是python就是安装python的编译器了,dotnet的SDK安装可以参考我之前的博客:https://www.cnblogs.com/shanfeng1000/p/11065804.html
dotnet安装好之后,我们可以先运行.net core项目,如果没有,可以直接生成一个:
输入dotnet new mvc就能创建一个mvc项目,记得创建前先创建一个目录存放,比如这里先创建了一个demo目录
使用dotnet run命令运行项目就可以了,但是我们不采用这种方式,因为他会默认启动运行在http的5000端口,https的5001端口,而且当访问http的5000端口,会自动重定向到https的5001端口,当然我们可以在项目的Properties目录下的launchSettings.json中去修改启动设置,但是,我们保留项目的完整性,使用其他方法
首先使用dotnet build生成项目:
生成就是简单的打包,项目生成后的可执行文件子bin/Debug/netcoreapp2.2目录下,如下面的demo.dll
然后在bin/Debug/netcoreapp2.2目录下执行 dotnet demo.dll --server.urls http://localhost:5050 &,注意,命令后面有&符号,表示命令在后台执行,而不用导致当前shell堵塞,.net core 默认端口是5000,这里改成5050,这个可随意
如果不在bin/Debug/netcoreapp2.2目录下执行,那么demo.dll前就要带上相应的路径
现在我们可以在虚拟机上使用:curl http://localhost:5050 访问了
当我们在213主机上的浏览器访问这个项目时:http://192.168.209.129:5050,却访问不到,这个是因为我们监听的接口是http://localhost:5050,所以213上当然访问不到了,如果要让213能访问,上面的启动项的localhost改成*就可以了
如:dotnet demo.dll --server.urls http://*:5050
二、使用nginx做反向代理
nginx的安装可以参考我的博客:https://www.cnblogs.com/shanfeng1000/p/11063851.html
这里为了简单,直接就使用sudo apt install nginx进行安装了
安装完成之后,进入 /etc/nginx/conf.d,执行 sudo cp ../sites-available/default demo.conf 复制一份默认的配置文件放到当前目录(conf.d),然后指定 sudo vim demo.conf 进入编辑
找到server节点,修改成如下,因为5000端口是.net core 默认端口,避免以后使用时冲突,所以这里我们使用50000端口:
在server节点在找到server_name节点,修改服务名,可随意,如这里改为demo,接着在server节点下找到 location 节点,修改成如下:
注意,上述配置均以分号结尾
现在退出后,使用 sudo nginx 命令开启nginx,或者如果已经开启了,使用sudo nginx -s reload 重新加载配置就可以了,也可以在reload前,先试用sudo nginx -t 先测试一下配置是否正确
另外,备注一下,如果运行时,出现:nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
这个是因为master进程已经关闭了。直接使用sudo nginx命令开启就可以了:
现在就可以在213主机上的浏览器上使用:http://192.168.209.129:50000/访问了
三、使用IIS做反向代理
213是windows系统,使用其他工具做反向代理也行,这里使用IIS
先在开始菜单搜索IIS:
如果没有,那么打开开始=》运行,输入control,或者win+r运行,输入control
打开控制面板后,选择【程序与功能】,接着在左边选择【启用或者关闭Windows功能】
弹出窗口后勾选Internet Information Services:
然后确定等待完成就可以了,在开始菜单搜索IIS就能搜索到了,这一步可能需要重启电脑才能生效
打开IIS后,我们还需要安装ARR,才能使用反向代理的功能:
Arr下载地址:https://www.iis.net/downloads/microsoft/application-request-routing
Arr安装好之后,需要重启IIS生效,在cmd控制台中输入iisreset重启IIS,然后再打开IIS管理器就有上图中的Application Request Routing Cache了,我们点击进入,选择邮编的Server Proxy settings
然后勾选Enable Proxy,其他基本都不用改,当然,你如果需要,也可以修改,接着点击【应用】就可以了,
接着右键左边的网站项,新建网站,
新建好之后,再点击建好的网站,进入URL重写:
在【入站规则】中右键,选择【新建规则】=》【空白规则】,名称随意填,模式输入 ^(.*)
打开条件,添加条件,在条件输入中输入 {HTTP_HOST} ,然后在模式中输入 ^192.168.28.213:50000$ ,这个是说,所有的 192.168.28.213:50000请求将被拦截转发,点击确定
然后在下面的操作中修改操作类型为重写,重写Url为:http://192.168.209.129:50000/{R:1},最后点击右边的应用就可以了
按着上面的步骤,再次进入Demo网站下的Url重写就是这样子的
然后启动网站:
接着打开浏览器,本地就能访问50000端口了,在其他局域网下也能通过213的50000端口访问到213上的虚拟机的项目了,比如在94上访问:http://192.168.28.213:50000
最后画张图示意: