Nginx

在單個埠上託管多個 Nodejs 應用程序

  • October 2, 2014

我正在嘗試執行多個 nodejs 應用程序(使用 express 框架),它們都在同一個外部埠(80)上提供服務,但每個都在一個子目錄下。

比如我想要…

NodeJsApplication1 在http://www.mydomain.com/NodeJsApplication1可用

NodeJsApplication2 可在http://www.mydomain.com/NodeJsApplication2

等等

我嘗試使用 Nginx 作為代理,其 conf 類似於以下內容。

server {
   listen       80;
   server_name  www.mydomain.com;

   location / {
       root   /var/www/html;
       index  index.html index.htm;
   }

   location /NodeJsApplication1/ {
       proxy_pass http://0.0.0.0:3000;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       rewrite /NodeJsApplication1/(.*) /$1 break;
   }

   location /NodeJsApplication2/ {
       proxy_pass http://0.0.0.0:3001;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       rewrite /NodeJsApplication2/(.*) /$1 break;
   }
}

這適用於訪問頁面,但它會破壞返回頁面上的所有相對 URL。所有腳本和 css 等都指向根目錄(例如 www.mydomain.com/styles/main.css)。

我知道我可以使用多個子域,但不想走那條路。我更喜歡有子文件夾代理,所以它都是在軟體中處理的,我不需要為每個應用程序設置任何 DNS 記錄。

這甚至可能嗎?

更新

在應用程序本身內,所有連結都使用相對路徑。例如:

<link href="styles/main.css" />
<script src="scripts/app.js" />

但是在呈現時,瀏覽器會將它們視為“ www.mydomain.com/styles/main.css”而不是“ www.mydomain.com/NodeJsApplication1/styles/main.css”。

更新 2 我知道這個問題的三種可能(非理想)解決方案。

  • 第一個是修改 NodeJS 應用程序以指定完整的 URL,但這需要應用程序知道配置 nginx 的子目錄,這會破壞到另一個環境的可移植性。
  • 二是使用子域。我知道這是可行的,每個應用程序都可以設置為NodeJsApplication1.mydomain.com,所有連結都將按預期執行。我遇到的問題是它需要為每個應用程序設置 DNS 記錄。我想要一些幾乎可以自動完成而無需大量手動工作的東西。(萬用字元記錄不合適,因為該域用於其他目的)。
  • 使用**<base>標籤**指定應用程序的根。同樣,這存在需要更改應用程序而不是環境的問題。

所以事實證明這是 NodeJS 應用程序本身的問題,而不是環境設置的問題。似乎應用程序正試圖變得聰明並獲取應用程序的根,但不知道它正在被代理(或類似的東西)。

當我使用乾淨的準系統應用程序嘗試它時,它按預期工作並且相對路徑是有效的。

我在同一個域上有多個 MEAN 應用程序時遇到了類似的問題。我想要子目錄,而不必為每個應用程序創建一個新的子域。除了向您的 Nginx 配置添加重寫之外:

rewrite ^/app1/(.*)$ /$1 break;

您還需要<base>在索引的頭部設置標籤:

<base href="/app1/">

來自https://www.digitalocean.com/community/questions/how-to-run-multiple-node-application-with-nginx-same-droplet-same-domain

引用自:https://serverfault.com/questions/584075