我试图运行多个nodejs应用程序(使用快速框架)所有服务在同一个外部端口(80),但每个子目录下。
比如我想…
NodeJsApplication1在http://www.mydomain.com/NodeJsApplication1上可用
NodeJsApplication2在http://www.mydomain.com/NodeJsApplication2上可用
等等
我曾尝试使用Nginx作为代理类似于以下的configuration文件。
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)。
我知道我可以使用多个子域,但不想沿着这条路线走。 我宁愿有子文件夹代理,所以它都在软件中处理,我不需要为每个应用程序设置任何DNSlogging。
这甚至有可能吗?
更新
在应用程序本身中,所有链接都使用相对path。 例如:
但是,当呈现浏览器对待他们作为“www.mydomain.com/styles/main.css”而不是“www.mydomain.com/NodeJsApplication1/styles/main.css”。
首先是修改NodeJS应用程序来指定一个完整的URL,但是这需要应用程序知道nginxconfiguration的子目录,并且将可移植性遗留给另一个环境。
这应该在NodeJS应用程序中解决。 大多数编写良好的应用程序允许您指定应用程序将驻留在的根URL,并使用它来生成所有本地URL,因此我build议您对应用程序执行相同的操作。
我在同一个域上有多个MEAN应用程序也有类似的问题。 我想要子目录,而不必为每个应用程序创build一个新的子域名。 除了在你的Nginxconfiguration中添加一个重写:
rewrite ^/app1/(.*)$ /$1 break;
您还需要在索引的头部设置<base>标记:
<base href="/app1/">