nginx配置域名后的二级目录访问不同项目的配置操作
场景描述:
通过二级目录(虚拟目录,应用程序)的方式访问同一ip+端口的不同应用,例如location是用户使用页面,location/admin/是管理页面,location部署在192.168.1.100的80端口,location/admin部署在172.20.1.32的8080端口上。
解决方案:
使用nginx反向代理,配置如下:
server{ listen80; server_namedemo.domain.com; #通过访问service二级目录来访问后台 location/service{ #DemoBackend1后面的斜杠是一个关键,没有斜杠的话就会传递service到后端节点导致404 proxy_passhttp://DemoBackend1/; proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } #其他路径默认访问前台网站 location/{ proxy_passhttp://DemoBackend2; proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } } #简单的负载均衡节点配置 upstreamDemoBackend1{ server192.168.1.1; server192.168.1.2; ip_hash; } upstreamDemoBackend2{ server192.168.2.1; server192.168.2.2; ip_hash; }
但是这种方式,二级目录的样式文件都不会正常显示,他们不会自动在二级目录下查找,而是在根目录中查找,在跳转页面的时候也会报404错误。不知道是不是配置有误,在server块中配置了root或是rewrite都不能解决。
试着在proxy_pass后面加上二级目录,并且和location块的二级目录相同,配置如下:
server{ listen80; server_namedemo.domain.com; #通过访问service二级目录来访问后台 location/service{ #DemoBackend1后面的斜杠是一个关键,没有斜杠的话就会传递service到后端节点导致404 proxy_passhttp://DemoBackend1/service;#DemoBackend1网站中要配置一个名称为service的虚拟目录,并且和location的二级目录名称一致 proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } #其他路径默认访问前台网站 location/{ proxy_passhttp://DemoBackend2; proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } } #简单的负载均衡节点配置 upstreamDemoBackend1{ server192.168.1.1; server192.168.1.2; ip_hash; } upstreamDemoBackend2{ server192.168.2.1; server192.168.2.2; ip_hash; }
问题解决
另外,在实际应用中,我使用了asp.net的mvc,将mvc设置为网站的方式没有问题,如果是虚拟目录的方式就会找不到路径,是因为自己在网站中的地址很多写的都不规范,正确的方式应该是:
Here'satypicalexampleofwhatyoushouldneverdo:
$.ajax({ url:'/home/index' }); andhere'showthisshouldbedone: $.ajax({ url:'@Url.Action("index","home")' }); Here'sanothertypicalexampleofsomethingthatyoushouldneverdo: Foo andhere'showthisshouldbewritten: @Html.ActionLink("Foo","Index","Home") Here'sanotherexampleofsomethingthatyoushouldneverdo: andhere'showthisshouldbewritten: @using(Html.BeginForm("Index","Home")) { }
补充知识:使用nginx服务器,实现同一IP同一端口访问不同项目,以域名区分所访问项目
这里我使用了两台nginx服务器,一台服务器将不同项目绑定到不同端口,一台服务器将不同域名分发到不同端口的项目上。
第一台nginx的conf文件server部分:
server{ listen8000; server_namelocalhost; rootE:/test/pro1; location/{ indexindex.htmlindex.htm; } } server{ listen8001; server_namelocalhost; rootE:/test/pro2; location/{ indexindex.htmlindex.htm; } }
第二台nginx的conf文件的server部分:
server{ listen80; server_namewww.testpro01.comtestpro01.com; location/{ proxy_passhttp://127.0.0.1:8000; } } server{ listen80; server_namewww.testpro02.comtestpro02.com; location/{ proxy_passhttp://127.0.0.1:8001/; } }
最后用bat文件用以对两个nginx服务器进行操作
启动文件如下:start.bat
@echooff echo[start...] cd/dE: cdspiovnet\nginx-1.16.1 callstartnginx.exe cd/dD: cdnginx-1.16.1 callstartnginx.exe echo[end...] @pause
其他的雷同,只是命令不一样
nginx启动命令:startnginx.exe或者nginx
nginx重新加载配置命令:nginx-sreload
ngin重启命令:nginx-sreopen
ngin关闭命令:nginx-sstop
以上这篇nginx配置域名后的二级目录访问不同项目的配置操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。