1. 程式人生 > 程式設計 >nginx配置域名後的二級目錄訪問不同專案的配置操作

nginx配置域名後的二級目錄訪問不同專案的配置操作

場景描述:

通過二級目錄(虛擬目錄,應用程式)的方式訪問同一ip+埠的不同應用,例如location是使用者使用頁面,location/admin/是管理頁面,location部署在192.168.1.100的80埠,location/admin部署在172.20.1.32的8080埠上。

解決方案:

使用nginx反向代理,配置如下:

server {
    listen 80;
    server_name demo.domain.com;
    #通過訪問service二級目錄來訪問後臺
  location /service {
      #DemoBackend1後面的斜槓是一個關鍵,沒有斜槓的話就會傳遞service到後端節點導致404
      proxy_pass   http://DemoBackend1/;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    #其他路徑預設訪問前臺網站
    location / {
      proxy_pass http://DemoBackend2;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
 
#簡單的負載均衡節點配置
upstream DemoBackend1 {
   server 192.168.1.1;
   server 192.168.1.2;
   ip_hash;
 }
upstream DemoBackend2 {
   server 192.168.2.1;
   server 192.168.2.2;
   ip_hash;
}

但是這種方式,二級目錄的樣式檔案都不會正常顯示,他們不會自動在二級目錄下查詢,而是在根目錄中查詢,在跳轉頁面的時候也會報404錯誤。不知道是不是配置有誤,在server塊中配置了root或是rewrite都不能解決。

試著在proxy_pass後面加上二級目錄,並且和location塊的二級目錄相同,配置如下:

server {
    listen 80;
    server_name demo.domain.com;
    #通過訪問service二級目錄來訪問後臺
  location /service {
      #DemoBackend1後面的斜槓是一個關鍵,沒有斜槓的話就會傳遞service到後端節點導致404
      proxy_pass   http://DemoBackend1/service;#DemoBackend1網站中要配置一個名稱為service的虛擬目錄,並且和location的二級目錄名稱一致
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    #其他路徑預設訪問前臺網站
    location / {
      proxy_pass http://DemoBackend2;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
 
#簡單的負載均衡節點配置
upstream DemoBackend1 {
   server 192.168.1.1;
   server 192.168.1.2;
   ip_hash;
 }
upstream DemoBackend2 {
   server 192.168.2.1;
   server 192.168.2.2;
   ip_hash;
}

問題解決

另外,在實際應用中,我使用了asp.net 的mvc,將mvc設定為網站的方式沒有問題,如果是虛擬目錄的方式就會找不到路徑,是因為自己在網站中的地址很多寫的都不規範,正確的方式應該是:

Here's a typical example of what you should never do:

<script type="text/javascript">
  $.ajax({
    url: '/home/index'
  });
</script>
and here's how this should be done:

<script type="text/javascript">
  $.ajax({
    url: '@Url.Action("index","home")'
  });
</script>
Here's another typical example of something that you should never do:

<a href="/home/index" rel="external nofollow" >Foo</a>
and here's how this should be written:

@Html.ActionLink("Foo","Index","Home")
Here's another example of something that you should never do:

<form action="/home/index" method="opst">

</form>
and here's how this should be written:

@using (Html.BeginForm("Index","Home"))
{

}

補充知識:使用nginx伺服器,實現同一IP同一埠訪問不同專案,以域名區分所訪問專案

這裡我使用了兩臺nginx伺服器,一臺伺服器將不同專案繫結到不同埠,一臺伺服器將不同域名分發到不同埠的專案上。

第一臺nginx的conf檔案server部分:

server {
    listen    8000;
    server_name localhost;
    root  E:/test/pro1;
    location / {
      index  index.html index.htm; 
    }
  }

  server {
    listen    8001;
    server_name localhost;
    root  E:/test/pro2;
    location / {
     index  index.html index.htm;  
    }
  }

第二臺nginx的conf檔案的server部分:

server {
    listen    80;
    server_name www.testpro01.com testpro01.com;
    location / {
      proxy_pass  http://127.0.0.1:8000;
    }
  }

  server {
    listen    80;
    server_name www.testpro02.com testpro02.com;
    location / {
     proxy_pass  http://127.0.0.1:8001/;
    }
  }

最後用bat檔案用以對兩個nginx伺服器進行操作

啟動檔案如下:start.bat

@echo off
echo [start...]
cd /d E:
cd spiovnet\nginx-1.16.1
call start nginx.exe
cd /d D:
cd nginx-1.16.1
call start nginx.exe
echo [end...]
@pause

其他的雷同,只是命令不一樣

nginx啟動命令:start nginx.exe 或者 nginx

nginx重新載入配置命令:nginx -s reload

ngin重啟命令:nginx -s reopen

ngin關閉命令:nginx -s stop

以上這篇nginx配置域名後的二級目錄訪問不同專案的配置操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。