如何在具有不同域的相同IP /服务器上托pipe多个Node.js站点?

我有一个绑定到它的单个IP的Linux服务器。 我想在这个IP上的这台服务器上承载多个Node.js站点,每个(显然)都有一个唯一的域或子域。 我希望他们都在80端口。

我有什么办法可以做到这一点?

一个显而易见的解决scheme似乎是让所有域由一个node.js Web应用程序提供服务,该应用程序充当代理,并执行到另一个运行在唯一端口上的node.js应用程序。

select下列之一:

  • 使用其他服务器( 如nginx )作为反向代理。
  • 使用node-http-proxy作为反向代理。
  • 如果每个域都可以从相同的Connect / Express代码库和node.js实例中提供,请使用虚拟主机中间件 。

Diet.js有一个非常好的和简单的方法来托pipe多个域使用相同的服务器实例。 您可以简单地为每个域调用一个新的server()

一个简单的例子

 // Reuire diet var server = require('diet'); // Main domain var app = server() app.listen('http://example.com/') app.get('/', function($){ $.end('hello world ') }) // Sub domain var sub = server() sub.listen('http://subdomain.example.com/') sub.get('/', function($){ $.end('hello world at sub domain!') }) // Other domain var other = server() other.listen('http://other.com/') other.get('/', function($){ $.end('hello world at other domain') }) 

分离你的应用程序

如果你想为你的应用程序有不同的文件夹,那么你可以有这样的文件夹结构:

 /server /yourApp /node_modules index.js /yourOtherApp /node_modules index.js /node_modules index.js 

/server/index.js您将需要通过它的文件夹中的每个应用程序:

 require('./yourApp') require('./yourOtherApp') 

/server/yourApp/index.js您将设置您的第一个域名,例如:

 // Reuire diet var server = require('diet') // Create app var app = server() app.listen('http://example.com/') app.get('/', function($){ $.end('hello world ') }) 

而在/server/yourOtherApp/index.js你可以设置你的第二个域如:

 // Reuire diet var server = require('diet') // Create app var app = server() app.listen('http://other.com/') app.get('/', function($){ $.end('hello world at other.com ') }); 

阅读更多:

  • 阅读更多关于Diet.js
  • 阅读更多关于Diet.js的虚拟主机

嗯…为什么你认为nodejs应该作为代理呢? 我会build议运行几个节点应用程序监听不同的端口。 然后使用nginx将请求转发到正确的端口。 如果使用一个nodejs,你也将有单点故障。 如果那个应用程序崩溃,那么所有的网站都会崩溃。

使用nginx作为反向代理。

http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/

Nginx以caching,静态文件处理,SSL和负载平衡的forms为您的应用程序带来了许多好处。

如果您使用的是连接/快速服务器,则可以看到vhost中间件。 它将允许多个域(子域)用于服务器地址。

你可以按照这里给出的例子,这看起来像你所需要的。

我有一个网站上使用的API,下面是我的configuration。 我也有SSL和GZIP,如果有人需要它,只是评论我。

 var http = require('http'), httpProxy = require('http-proxy'); var proxy_web = new httpProxy.createProxyServer({ target: { host: 'localhost', port: 8080 } }); var proxy_api = new httpProxy.createProxyServer({ target: { host: 'localhost', port: 8081 } }); http.createServer(function(req, res) { if (req.headers.host === 'http://www.domain.com') { proxy_web.proxyRequest(req, res); proxy_web.on('error', function(err, req, res) { if (err) console.log(err); res.writeHead(500); res.end('Oops, something went very wrong...'); }); } else if (req.headers.host === 'http://api.domain.com') { proxy_api.proxyRequest(req, res); proxy_api.on('error', function(err, req, res) { if (err) console.log(err); res.writeHead(500); res.end('Oops, something went very wrong...'); }); } }).listen(80); 

这是我最简单的演示项目,没有任何中间件或代理。
这只需要几个代码,这就够了。

https://github.com/hitokun-s/node-express-multiapp-demo

有了这个结构,您可以轻松地设置和维护每个应用程序独立。
我希望这会对你有所帮助。

最好的方法就是使用Express的虚拟中间件。 查看本教程以获得一步一步的解释:

http://shamadeh.com/blog/web/nodejs/express/2014/07/20/ExpressMultipleSites.html

首先安装永远和有弹性 。

然后写一个启动脚本。 在此脚本中,向iptables防火墙实用程序添加一条规则,告诉它将端口80上的stream量转发到端口8000(或您select的任何其他设备)。 在我的例子中,8000是我运行有弹性的地方

 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000 

让我们永远使用,让脚本在端口8000上运行弹性

 forever start --spinSleepTime 10000 /path/to/bouncy /path/to/bouncy/routes.json 8000 

routes.json会像

 { “subdomain1.domain.com" : 5000, “subdomain2.domain.com" : 5001, “subdomain3.domain.com" : 5002 } 

NodeJS应用程序1,应用程序2和应用程序3分别在端口5000,5001和5002上运行。

在我的案例中使用的脚本可以在这里find,你可能需要改变一点,以适应你的环境。

我也写了更多的细节,你可以在这里find它。

从数字海洋这个指南是一个很好的方法。 它使用守护程序的pm2模块(将它们作为服务运行)。 不需要像Forever这样的额外模块,因为如果崩溃,它会自动重启你的应用程序。 它有许多function可以帮助您监视服务器上运行的各种应用程序。 这真是太棒了!