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

Kit*_*Kit 65 apache proxy websocket node.js

我的目标是在端口80上运行Node.js.这是因为我发现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);
Run Code Online (Sandbox Code Playgroud)

但我不断收到端口80的错误"正在使用的地址".我一定是做错了.

如何使用node-http-proxy通过node.js代理Apache?这会让我在端口80上运行node.js吗?node-http-proxy是实现这一目标的最佳方式吗?

谢谢.

ful*_*ife 98

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

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Run Code Online (Sandbox Code Playgroud)

如果您不使用ngnix或apache

  • 要UNDO这个:sudo iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080(基本上将-A更改为-D.这就是全部) (7认同)
  • 就这样,Nginx已被淘汰. (4认同)
  • 了解如何撤消此操作也会有所帮助。“--to-port 80”我不认为是完美的解决方案。它仍然必须处理这个绑定。 (2认同)

Kyl*_*dha 30

最简单的解决方案:安全地配置您的节点应用程序以在端口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(一篇好文章关于如何在云托管上设置节点应用程序).


Pau*_*ulM 29

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

使用node及其listen指令有2个值,例如..listen(80,NODEJS_IP或DNS NAME);

其他一些建议.

我不会将apache与nodejs一起使用,因为它没有被解决.所以这不是真的不推荐.我实际上会考虑使用NGINX作为与Node更好的配对.

  • @FlashFan,我可以使用我的网站完成Chrome的WebSocket.你能进一步详细说明吗? (2认同)

Waq*_*quo 18

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

你对apache的依恋程度如何?通过nginx代理节点是一个经过验证的真正解决方案,使用如下的nginx-config:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Nginx文档:

http://wiki.nginx.org/HttpProxyModule

http://wiki.nginx.org/HttpUpstreamModule

  • 很多人在端口80上运行节点.通过nginx进行代理需要一些开销.此外,您不需要root在端口80上运行.有关详细信息,请参阅此处:http://comments.gmane.org/gmane.comp.lang.javascript.nodejs/8959我不是自己通过root运行节点. (4认同)

nic*_*ten 8

您的代码看起来像示例代码,您在其中创建从端口80到端口9000的基于节点的代理,然后在端口9000上创建基于节点的HTTP服务器.(即Node:80 -> Node:9000)

启动Node时,您将获得"正在使用的地址",因为Apache已使用端口80.如果要使用Apache代理,则必须在不同的端口(例如9000)上使用Node,并让Apache侦听端口80并转发端口9000上的节点请求.(即Apache:80 -> Node:9000)

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

你想做什么,Node:80 -> Apache:9000或者Apache:9000 -> Node:80最终?

评论后编辑:如果你想这样做Apache:80 -> Node:9000,你可以mod_proxy在Apache上使用并使用ProxyPass/ ProxyPassReverse指令之类的东西

ProxyPass /nodeurls/ http://localhost:9000/
ProxyPassReverse /nodeurls/ http://localhost:9000/  
Run Code Online (Sandbox Code Playgroud)

nodeurls您希望Apache转发到Node的URL系列在哪里.


Chh*_*eng 8

如果您是非root用户,则无法使用低于1024的端口(在Unix系统中)运行或绑定。要允许非 root 用户可以在低于 1024 的端口上运行节点,请使用此命令。

$ sudo setcap 'cap_net_bind_service=+ep' $(which node)
Run Code Online (Sandbox Code Playgroud)