我正在尝试在同一个Amazon EC2实例上运行Apache和node.js.在线研究后,我想出了以下解决方案:
在端口9000上运行Apache
在端口8001,8002上运行node.js应用程序。
在node.js中创建reverse proxy,在端口80上运行。它根据主机名将请求路由到不同的端口。
此解决方案有效。 (虽然我还没有找到一种自动启动node.js的方法) 我的问题是,运行多个节点实例会导致性能下降吗?或反向代理是一个问题吗?
谢谢,
答案 0 :(得分:7)
恰恰相反。如果您对节点所做的只是代理,那么重载是无关紧要的(与apache相比)。我确实有一个与你相似的设置(小型虚拟机,3个传统的apache网站,node.js代理和增强)。到目前为止,apache是资源使用者,而不是我的节点应用程序,它仍然代理/过滤/拦截每个传入的http请求
这是我的设置:
处理所有传入请求(对于您喜欢的多个域):我个人使用nodejitsu's http-proxy,它非常强大且易于配置
var http = require('http');
var httpProxy = require('http-proxy');
var options = {
hostnameOnly: true,
router: {
'domain1.com': '127.0.0.1:8081',
'www.domain1.com': '127.0.0.1:8081',
'subdomain1.domain1.com': '127.0.0.1:8082',
(...)
'domain2.com': '127.0.0.1:8090',
(...)
}
}
var mainProxy = httpProxy.createServer(options);
mainProxy.listen(8080);
您可以直接从选项对象重定向到apache,或者在另一个端口上的另一个(中间件)节点应用程序中进行更多的URL解析。
警告:如果您不希望以“root”(我在生产环境中强烈建议)安装/运行节点:将端口80重定向到具有IPTABLE的其他端口这个代理运行的指令(比如8080)(参见detailed example of Iptable directives)。我在debian的挤压下写道:
#REDIRECT port 80 to 8080
$IPTABLES -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
使用正则表达式进行一些URL解析,或者您需要的任何内容。例如:重定向到一些(遗留的)apache服务器(在我的情况下)仅提供尚未由'in developement'节点应用程序提供的旧内容。
有几种解决方案可以让节点作为守护进程运行。我最喜欢的两个是:
另外:
答案 1 :(得分:1)
节点非常快,它可以同时处理数千个连接,因此在我看来,使用由它构建的代理根本不会成为问题。