我试图运行多个nodejs应用程序(使用快速框架)所有服务在同一个外部端口(80),但每个子目录下。
比如我想…
NodeJsApplication1在http://www.mydomain.com/NodeJsApplication1上可用
NodeJsApplication2在http://www.mydomain.com/NodeJsApplication2上可用
- 使用apache的HTTPS反向代理
- 禁用反向代理的authentication摘要
- 如何解决OpenSSH协议不匹配?
- Jenkins和HTTPS:无法连接到服务器
- Joomla使用SSLcaching服务器
等等
我曾尝试使用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。 例如:
<link href="styles/main.css" /> <script src="scripts/app.js" />
但是,当呈现浏览器对待他们作为“ www.mydomain.com/styles/main.css ”而不是“ www.mydomain.com/NodeJsApplication1/styles/main.css ”。
更新2我知道 二 这个问题有三种可能的(非理想的)解决scheme。
NodeJsApplication1.mydomain.com和所有链接将按预期行事。 我有这个问题是它需要为每个应用程序设置一个DNSlogging。 我想要一些几乎可以自动完成的事情,而不需要太多手动工作。 (通配符logging不适用,因为该域用于其他目的)。 <base>标记来指定应用程序的根。 再次,这具有需要改变应用程序而不是环境的问题。 所以事实certificate,这是NodeJS应用程序本身的问题,而不是环境设置。 看来应用程序正在努力变得聪明,并获得应用程序的根,但不知道它正在被代理(或类似的东西)。
当我尝试一个干净的准系统应用程序,它按预期工作,相对path是有效的。
我在同一个域上有多个MEAN应用程序也有类似的问题。 我想要子目录,而不必为每个应用程序创build一个新的子域名。 除了在你的Nginxconfiguration中添加一个重写:
rewrite ^/app1/(.*)$ /$1 break;
您还需要在索引的头部设置<base>标记:
<base href="/app1/">
更新
看来你有nginx代理工作,问题是在你的应用程序使用硬编码链接到主域。 这似乎是一个应用程序强加的限制,nginx无法真正帮助你,因为没有办法知道你什么时候访问像/css/style.css这样的文件, /css/style.css应该将它redirect到/NodeJsApplication1或/NodeJsApplication2 。
老答案
您不能将两个不同的应用程序绑定到同一系统上的同一端口。 你应该做什么,而不是绑定到不同的端口,然后在你的nginxconfiguration传递到特定的应用程序端口是这样的(这假定你使用3000端口为app1和3001端口为app2):
location /NodeJsApplication1/ { proxy_pass http://0.0.0.0:3000; ... } location /NodeJsApplication2/ { proxy_pass http://0.0.0.0:3001; ... }
关于这个问题,css,js,images文件都错过了,你可以这样做
如果你使用express框架,你需要添加这个代码行
app.enable('trust proxy');
此值“信任代理”的默认值是禁用的。