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

Posted

技术标签:

【中文标题】如何在端口 80 上运行 Node.js?【英文标题】:How do I run Node.js on port 80? 【发布时间】:2011-08-31 19:59:22 【问题描述】:

我的目标是在端口 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);

但我不断收到端口 80 的错误“正在使用的地址”。我一定是做错了什么。

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

谢谢。

【问题讨论】:

【参考方案1】:

在高端口 8080 或其他端口上运行您的应用程序

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

如果你没有使用 ngnix 或 apache

【讨论】:

了解如何撤消此操作也会有所帮助。 “--to-port 80” 我不认为是完美的解决方案。它仍然需要处理这个绑定。 就这样,nginx 被淘汰了。 要撤销这个:sudo iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080(基本上将 -A 更改为 -D。就是这样) 这里如何设置具体的ip? @fullstacklife 如果我同时使用 apache 怎么办?【参考方案2】:

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

【讨论】:

感谢您不仅提供了最优雅的解决方案,还提供了合法的参考链接。 这正是我所需要的。我花了一段时间摸不着头脑,试图弄清楚为什么我可以在除 80 之外的每个端口的节点上启动我的 Express HTTP 服务器。 太棒了!如果升级 Node(例如使用 nvm),只需记住再次执行此操作。 这对于node以外的其他平台也很有用。 它对我不起作用。我做了 sudo setcap cap_net_bind_service=+ep /usr/bin/nodejs (对于mac)。当我执行 netstat -tlpn 时,它仍然在端口 80 上显示 apache2,在 8000 上显示 nodejs。我做错了什么?【参考方案3】:

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

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

其他一些建议。

我不会将 apache 与 nodejs 一起使用,因为它没有发生。所以这个真的不推荐。我实际上会考虑使用 NGINX 作为它与 Node 的更好搭配。

【讨论】:

@PaulM。谢谢。如何将辅助 IP 绑定到端口 80 和 node.js 而不是 Apache? 在您的 dns 中有类似 www.domain.com 的 1 个 ip 和 chat.domain.com 的另一个 ip。在apache中监听第一个ip地址:监听vvv.xxx.yyy.zzz:80。然后用节点做.listen(80,chat.domain.com)。这是我正在使用的设置,我没有遇到任何公司防火墙等问题。 我不会推荐 nginx 用于节点。 Nginx 不支持 HTTP 1.1,这意味着你不能做一些 WebSocket 的事情。当你使用 node.js 时,我想你会想要快速使用它;) @FlashFan,我可以在我的网站上使用 Chrome 进行 WebSocket 操作。你能详细说明一下吗? @PaulM - 我在尝试将 Apache 绑定到特定 IP 时遇到问题。我这里有问:serverfault.com/questions/273143/…你这样做有什么问题吗?【参考方案4】:

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

您对 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;
    

Nginx 文档:

http://wiki.nginx.org/HttpProxyModule

http://wiki.nginx.org/HttpUpstreamModule

【讨论】:

很多人在 80 端口上运行节点。通过 nginx 代理需要一些开销。此外,您不需要 root 在端口 80 上运行。有关更多信息,请参见此处:comments.gmane.org/gmane.comp.lang.javascript.nodejs/8959 我自己没有通过 root 运行节点。 感谢 Waquo。我正在查看我的期权 ATM。 Nginx 可能是前进的方向。 查看 dryprogrammers 的回答,了解如何在端口 80 上运行节点而不是 root。 这个答案让我觉得我可以从相同的服务器和 IP 为节点和 php 应用程序提供服务,为每个应用程序使用不同的端口,但我对 nginx 肯定不是很熟悉它实际上是可能的......【参考方案5】:

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

当您启动 Node 时,您会得到“正在使用的地址”,因为 Apache 已经在使用端口 80。如果您想使用 Apache 进行代理,您必须在不同的端口(比如 9000)上使用 Node,并让 Apache 监听端口80并将请求转发到端口9000上的Node。(即Apache:80 -> Node:9000

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

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

在 cmets 之后编辑: 如果你想做Apache:80 -> Node:9000,你可以在Apache上使用mod_proxy并使用ProxyPass/ProxyPassReverse指令,类似

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

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

【讨论】:

谢谢。我不太确定。对不起!我希望节点在 apache:80 上运行。所以..节点:9000->Apache:80。不太确定这是否正确。 如果你想在端口 80 上运行 Apache,那么你必须在另一个端口上运行 Node,比如端口 9000。在这种情况下,你必须配置 Apache 以将它的一些请求转发到 Node。我会把它写成Apache:80 -> Node:9000 以继续我上面写的内容。 嗯,好的。我知道了。如何让 Apache 将它的一些请求转发给 Node?​​span> 查看我的编辑,你必须安装一个模块并配置它。 我认为您的意思是Apache:80 -> Node:9000,而不是第一行中的Node:80 -> Node:9000【参考方案6】:

我遇到了同样的问题,这是我使用 node-http-proxy 监听端口 80,然后转发到 express 或 apache 的解决方法。

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

【讨论】:

【参考方案7】:

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

$ sudo setcap 'cap_net_bind_service=+ep' $(which node)

【讨论】:

【参考方案8】:

我遇到了同样的问题,我只是将端口更改为 8080 并且它可以工作。

httpsServer.listen(8080, () =>
    console.log(chalk.rgb(208, 60, 240)(`Server listening on port: 8080`))
  );

【讨论】:

【参考方案9】:

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

你可以su root,那么

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

【讨论】:

我不是网络管理员,但为了安全起见,我强烈建议不要运行具有 root 权限的服务器。

以上是关于如何在端口 80 上运行 Node.js?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 openSUSE 上使用 NGINX 或 Apache2 将我的端口 80 重新路由到 localhost:3000 以便我可以运行我的 Node.js 应用程序

如何在 linux 服务器的 80 端口上启动 node.js?

为啥在端口 80 上运行 node.js 可能不安全?

即使没有其他进程阻塞该端口,Node.js 应用程序也无法在端口 80 上运行

在端口 80 上运行节点 js,而不以 root 身份运行

如何为 80 端口上的网站制作 Node.js 多租户?