如何在端口80上运行Node.js?

我的目标是在端口80上运行Node.js。这是因为我发现node.js被阻止来自某些不允许来自其他端口的stream量的networking。

看来最好的方法是通过Node.js代理Apache。 我已经尝试使用节点HTTP代理来做到这一点,但我没有任何运气。

我使用的代码在这里:

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是达到这个目的的最好方法吗?

谢谢。

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

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

一些其他的build议。

我不会使用Apache的nodejs,因为它不是。 所以这真的不build议。 我真的会考虑使用NGINX作为它与Node更好的配对。

然后在高端口8080或whatev上运行您的应用程序

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

如果你不使用ngnix或apache

最简单的解决scheme: 安全地configuration您的节点应用程序在端口80上运行

  • sudo apt-get install libcap2-bin
  • sudo setcap cap_net_bind_service=+ep /path/to/node
  • 达达! 你完成了。

我为什么喜欢它?

  • 您不必使用apache或nginx
  • 您不必以root身份运行您的应用程序
  • 您不必转发端口(并在每次机器启动时处理)

参考链接: https : //www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps (伟大的文章关于如何在云托pipe上设置您的节点应用程序)。

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

你如何附加到Apache? 通过nginx代理节点是一个久经考验的解决scheme,像这样的nginxconfiguration:

 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

你的代码看起来像是代码示例,在这个代码中你要创build一个从端口80到端口9000的基于节点的代理,然后在端口9000上创build一个基于节点的HTTP服务器(也就是Node:80 -> Node:9000

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

它看起来像你使用的库是做相反的:使用节点作为代理和转发请求到Apache。 在这种情况下,您必须将Apacheconfiguration为在端口80以外的其他端口上运行(即Node:80 -> Apache:9000 )。

你到底想做Node:80 -> Apache:9000还是Apache:9000 -> Node:80

编辑后评论:如果你想要做的Apache:80 -> Node:9000 ,你可以在Apache上使用mod_proxy和使用ProxyPass / ProxyPassReverse指令,类似

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

其中nodeurls是您希望Apache转发到Node的一系列URL。

我有同样的问题,这里是我如何解决它使用node-http-proxy侦听端口80,然后转发到express或apache。

https://stackoverflow.com/a/9645091/500270

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

那么你可以su root

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