在单个域上托管多个 Nodejs 应用程序

在单个域上托管多个 Nodejs 应用程序

我正在尝试运行多个 nodejs 应用程序(使用 express 框架),所有应用程序都在同一个外部端口(80)上提供服务,但每个应用程序都在一个子目录下。

例如我想要...

NodeJsApplication1 将在http://www.mydomain.com/NodeJsApplication1

NodeJsApplication2 将于http://www.mydomain.com/NodeJsApplication2

ETC。

我尝试使用 Nginx 作为代理,其配置与以下类似。

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 记录。

这可能吗?

更新

在应用程序本身中,所有链接都使用相对路径。例如:

但是在呈现时,浏览器将它们视为“www.mydomain.com/styles/main.css”而不是“www.mydomain.com/NodeJsApplication1/styles/main.css”。

首先是修改 NodeJS 应用程序以指定完整的 URL,但这要求应用程序知道 nginx 配置的子目录,并且会破坏向另一个环境的可移植性。

答案1

我在同一个域中拥有多个 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

答案2

这应该在 NodeJS 应用程序中解决。大多数编写良好的应用程序允许您指定应用程序将托管的根 URL,并使用它来生成所有本地 URL,因此我建议您对您的应用程序执行相同的操作。

相关内容