我正在尝试运行多个 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/">
答案2
这应该在 NodeJS 应用程序中解决。大多数编写良好的应用程序允许您指定应用程序将托管的根 URL,并使用它来生成所有本地 URL,因此我建议您对您的应用程序执行相同的操作。