在單個埠上託管多個 Nodejs 應用程序
我正在嘗試執行多個 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/">