如何在端口 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?