ChatGPT解决这个技术问题 Extra ChatGPT

如何在端口 80 上运行 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);

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

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

谢谢你。


f
fullstacklife

在高端口 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 怎么办?
K
Kyle Chadha

最简单的解决方案:安全地将您的节点应用程序配置为在端口 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),只需记住再次执行此操作。
这对于节点以外的其他平台也很有用。
它对我不起作用。我做了 sudo setcap cap_net_bind_service=+ep /usr/bin/nodejs (对于mac)。当我执行 netstat -tlpn 时,它仍然在端口 80 上显示 apache2,在 8000 上显示 nodejs。我做错了什么?
P
PaulM

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

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

其他一些建议。

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


@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/…您在执行此操作时有任何问题吗?
W
Waquo

目前不建议在端口 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 运行节点。
谢谢万曲。我正在查看我的期权 ATM。 Nginx 可能是前进的方向。
查看 dryprogrammers 的回答,了解如何在端口 80 上运行 Node,而不是 root。
这个答案让我觉得我可以从相同的服务器和 IP 为节点和 php 应用程序提供服务,为每个应用程序使用不同的端口,但我对 nginx 不太熟悉,以确保它实际上是可能的......
n
nicolaskruchten

您的代码类似于示例代码,您在其中创建从端口 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,您可以在 Apache 上使用 mod_proxy 并使用 ProxyPass/ProxyPassReverse 指令,例如

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

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


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

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

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


C
Chhaileng

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

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

D
Dennis Kiprotich

我有同样的问题,我只是将我的端口更改为 8080 并且它工作。

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

j
jiahut

如果您只是处于开发环境模式

您可以su root,然后

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


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