2011-05-24 161 views
63

我的目标是在端口80上运行Node.js。这是因为我发现node.js被阻止来自某些不允许来自任何其他端口的流量的网络。如何在端口80上运行Node.js?

看来最好的方法是通过Node.js代理Apache。我曾尝试使用node-http-proxy来做到这一点,但我没有任何运气。

我使用的代码是在这里:

var util = require('util'), 
    http = require('http'), 
    httpProxy = require('http-proxy'); 

httpProxy.createServer(9000, 'localhost').listen(80); 

http.createServer(function (req, res) { 
    res.writeHead(200, { 'Content-Type': 'text/plain' }); 
    res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2)); 
    res.end(); 
}).listen(9000); 

但我不断收到错误“使用地址” 80端口。我必须做一些错误的。

如何使用node-http-proxy通过node.js代理Apache?这将使我能够在端口80上运行node.js吗?并且node-http-proxy是实现此目的的最佳方式吗?

谢谢。

回答

28

你需要做的是为你正在运行的服务器提供2个ip。 Apache有1个IP绑定到端口80,然后node.js有另一个IP绑定到端口80.

使用节点和它的listen指令有2个值,例如。 .listen(80,NODEJS_IP或DNS NAME);

其他一些建议。

我不会在nodejs中使用apache,因为它没有完成。所以这真的不建议。我实际上会考虑使用NGINX作为它与Node更好的配对。

+0

@PaulM。谢谢。我如何去绑定辅助IP到端口80和node.js而不是Apache? – Kit 2011-05-24 10:46:50

+0

与您的DNS有一样的东西像www.domain.com 1 ip和chat.domain.com其他ip。在apache中听第一个ip地址:Listen vvv.xxx.yyy.zzz:80。然后用node做.listen(80,chat.domain.com)。这是我正在使用的设置,我没有任何企业防火墙等问题。 – PaulM 2011-05-24 11:05:38

+0

我不会推荐nginx的节点。 Nginx不支持HTTP 1.1,这意味着你将无法做一些WebSocket的东西。当你使用node.js时,我认为你会想用这个非常快的方法;) – 2011-05-24 11:51:54

18

目前不推荐在端口80上运行节点,因为这需要以root身份运行节点。

你是否依附于apache?通过nginx的代理节点是尝试和真正的溶液,用nginx的-配置如此:

upstream node_cluster { 
    ip_hash; 
    server 127.0.0.1:8000; 
    server 127.0.0.1:8001; 
    server 127.0.0.1:8002; 
} 

server { 
    listen 0.0.0.0:80; 
    server_name foo; 
    access_log /var/log/nginx/foo.log; 

    location/{ 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 

     proxy_pass http://node_cluster/; 
     proxy_redirect off; 
    } 
} 

Nginx的文档:

http://wiki.nginx.org/HttpProxyModule

http://wiki.nginx.org/HttpUpstreamModule

+4

很多人在端口80上运行节点。通过nginx进行代理需要一些开销。 此外,您不需要root在80端口上运行。请参阅此处了解更多信息:http://comments.gmane.org/gmane.comp.lang.javascript.nodejs/8959 我没有运行节点通过我自己的根。 – PaulM 2011-05-24 13:15:12

+0

谢谢Waquo。我正在看我的选项ATM。 Nginx可能是前进之路。 – Kit 2011-05-24 13:20:20

+0

看看dryprogrammers回答如何在端口80上运行节点而不是root。 – 2013-11-27 01:28:25

8

代码如下示例代码在其中创建基于节点的代理从端口80到端口9000,然后在端口9000上创建基于节点的HTTP服务器(即Node:80 -> Node:9000

由于Apache已经在使用端口80,因此您在启动节点时正在获取“使用中的地址”。如果要使用Apache进行代理,则必须在不同端口上使用节点(例如9000),并使Apache在端口上进行侦听80并将请求转发到端口9000上的节点(即, Apache:80 -> Node:9000

看起来您正在使用的库是做相反的事情:使用Node作为代理并将请求转发给Apache。在这种情况下,您必须将Apache配置为在端口80以外的端口上运行(即Node:80 -> Apache:9000)。

你想要做Node:80 -> Apache:9000Apache:9000 -> Node:80到底?评论后

编辑: 如果你想要做Apache:80 -> Node:9000,你可以在Apache使用mod_proxy和使用ProxyPass/ProxyPassReverse指令,像

ProxyPass /nodeurls/ http://localhost:9000/ 
ProxyPassReverse /nodeurls/ http://localhost:9000/ 

其中nodeurls是网址你想为Apache家庭转发到节点。

+0

谢谢。我不太确定。抱歉!我希望节点在apache:80上运行。所以..节点:9000-> Apache:80。不太确定这是否正确。 – Kit 2011-05-24 12:20:09

+0

如果要在端口80上运行Apache,则必须在另一个端口上运行节点,例如端口9000.在这种情况下,您必须配置Apache以将其某些请求转发给节点。我会把它写成'Apache:80 - > Node:9000'来继续我上面写的东西。 – nicolaskruchten 2011-05-24 12:24:19

+0

好的。我懂了。我如何着手让Apache将其一些请求转发给Node? – Kit 2011-05-24 12:26:49

96

高端口8080或whatev然后

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 

上运行你的应用程序。如果你不使用ngnix或Apache

+0

谢谢。很有帮助。 – 2013-04-17 20:00:49

+1

也将有助于知道如何撤消此操作。 “ - 对端口80”我不认为是完美的解决方案。它仍然必须处理这种绑定。 – 2013-04-17 20:55:49

+4

就这样,Nginx已经被淘汰。 – 2013-11-27 01:29:01

-2

,如果你只是在开发环境模式

可以su root,然后

node index.js./node_modules/coffee-script/bin/coffee index.coffee

+2

我不是网络管理员,但为了安全起见,我强烈建议不要使用root权限运行服务器。 – nick 2015-02-03 22:45:43