侦听大多数端口时出现 Node.js EACCES 错误

Posted

技术标签:

【中文标题】侦听大多数端口时出现 Node.js EACCES 错误【英文标题】:Node.js EACCES error when listening on most ports 【发布时间】:2012-02-28 05:04:34 【问题描述】:

我正在测试一个应用程序(希望能在 heroku 上运行,但在本地也有问题)。它在运行 http.Server.listen() 时给了我一个 EACCES 错误 - 但它只发生在某些端口上。

所以,我在本地运行:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

我没有在端口 900(或我尝试过的其他 20 个端口中的任何一个)上运行任何东西,所以这应该可以工作。奇怪的是它确实在某些端口上工作。例如,端口 3000 可以完美运行。

这是什么原因造成的?

更新 1:

我发现在我的本地计算机上,EACCES 错误即将到来,因为我必须以 root 身份运行节点才能绑定到这些特定端口。我不知道为什么会发生这种情况,但使用 sudo 可以修复它。但是,这并不能解释我将如何在 Heroku 上修复它。在 Heroku 上无法以 root 身份运行,那么如何监听 80 端口?

【问题讨论】:

传统上少于 1024 的端口需要提升权限。在 Heroku 上你不监听 80 端口,你监听他们通过环境变量告诉你的端口,并让他们的路由层处理边缘上的 80 端口绑定。 您的更新 1 帮助了我。 'sudo node myporgram.js' 让它运行。 如果这对任何人都有帮助:双重和三重检查您正在侦听端口 number。由于我在some string 上收听的一个错误,然后你会得到令人困惑的EACCES errpr。 【参考方案1】:

在您的工作站上运行

作为一般规则,没有 root 权限运行的进程不能绑定到低于 1024 的端口。

所以尝试更高的端口,或通过sudo 以提升的权限运行。使用process.setgidprocess.setuid绑定低端口后可以降级权限。

在 Heroku 上运行

在 heroku 上运行您的应用程序时,您必须使用 PORT 环境变量中指定的端口。

见http://devcenter.heroku.com/articles/node-js

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on $port`));

【讨论】:

这是否意味着我必须使用 Heroku 提供的端口,然后他们会在幕后施魔法将其转移到 80 端口?如果我想运行不在 80 端口上的东西怎么办? 是的。您只能在 $PORT 上收听我们告诉您的端口 我们负责将 80 或 443 路由到您的端口。当我们移动您的测功机时,实际端口一直在变化。目前,我们仅支持从 80 和 443 公开路由。 @Will,有没有机会解除限制?具体来说,是否能够监听 80 或 443 以外的端口?考虑到所有因素,这是一个相当严格的集合。 为什么您希望您的应用在不同于 http 和 https 的端口上运行? @Will 我想在 Heroku 上托管一个简单的游戏服务器。 Unity需要通过843端口传输crossdomain.xml【参考方案2】:

非特权用户(非 root)无法在低于 1024 的端口上打开监听套接字。

【讨论】:

赞成 - 这是一个很好的一般规则,但也有例外,例如 Linux 上的“功能”。 您刚刚为我节省了数小时的调试时间。我不知道。 我不喜欢这样,我不想在使用节点运行快速服务器时必须sudo(实际上是 gulp)。所以没有意义 这个智慧 @blamb 然后使用MeetMehta's solution ;^)【参考方案3】:

我在我的 mac 上遇到了这个错误,因为它默认使用与节点服务器使用的端口相同的端口运行 apache 服务器,在我的例子中是端口 80。我所要做的就是用 @987654321 停止它@

希望这对某人有所帮助。

【讨论】:

【参考方案4】:

这意味着节点无法监听定义的端口。将其更改为 1234 或 2000 或 3000 之类的值,然后重新启动您的服务器。

【讨论】:

【参考方案5】:

请记住,如果您使用 sudo 绑定到端口 80 并使用环境变量 PORT 和 NODE_ENV,您必须重新导出这些变量,因为您现在位于根配置文件而不是您的用户配置文件下。所以,为了让它在我的 Mac 上运行,我做了以下操作:

sudo su
export NODE_ENV=production
export PORT=80
docpad run

【讨论】:

【参考方案6】:

如果您尝试在本地托管的端口是端口转发的,则会发生这种情况

【讨论】:

【参考方案7】:

查看reference link:

授予安全用户使用端口 80 的权限

请记住,我们不想以 root 用户身份运行您的应用程序, 但有一个问题:您的安全用户没有使用权限 默认 HTTP 端口 (80)。你的目标是能够发布一个 访问者可以通过导航到易于使用的 URL 来使用的网站,例如 http://ip:port/

很遗憾,除非您以 root 身份登录,否则您通常必须使用 像 http://ip:port 这样的 URL - 其中端口号 > 1024。

很多人都被困在这里,但解决方案很简单。有几个 选项,但这是我喜欢的选项。输入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

现在,当您告诉 Node 应用程序您希望它在端口上运行时 80,它不会抱怨。

【讨论】:

这绝对是最好的解决方案。 @MarkLagendijk:谢谢马克。我也错误地问了同样的问题,并在这里发布了详细的答案***.com/questions/23281895/…。也可以随意编辑。 为什么这不是答案? @KhaledMohamedP:很高兴它有帮助:) 谁说这仍然不适用于 pm2 模块。使用pm2 kill 杀死你的 pm2 并重新创建它。【参考方案8】:

尝试 authbind:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

安装后,您可以在以下文件夹中添加一个带有您要使用的端口号名称的文件:/etc/authbind/byport/

使用 chmod 授予它 500 权限并将所有权更改为您要在其下运行程序的用户。

之后,在项目中以该用户身份执行“authbind node ...”。

【讨论】:

【参考方案9】:

另一种方法是做端口重定向:

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

并在 >1024 端口上运行您的服务器:

require('http').createServer().listen(3000);

顺便说一句,https(443) 端口也可以这样做。

【讨论】:

谢谢,谢谢!这为我节省了一个小时的安全端口调试时间,另一个小时用于 SSL 重定向,还允许我限制 AWS Lightstail 上开发服务器的可见性(不允许通过 IP 地址微调请求)。【参考方案10】:

我的 Mac 上也出现了这个错误。我使用npm run dev 在 Windows 中运行我的 Nodejs 应用程序,它运行良好。但是我在我的 Mac 上遇到了这个错误 - error given was: Error: bind EACCES null:80

解决此问题的一种方法是使用 root 访问权限运行它。您可以使用sudo npm run dev,并需要您输入密码。

通常最好在非特权端口(例如 3000)上为您的应用程序提供服务,这样无需 root 权限即可工作。

参考:Node.js EACCES error when listening on http 80 port (permission denied)

【讨论】:

【参考方案11】:

天啊!!在我的情况下,我正在做 ....listen(ip, port) 而不是 ...listen(port, ip) 并且抛出了错误消息:Error: listen EACCES localhost

我使用的端口号 >= 3000,甚至尝试使用管理员访问权限。什么都没解决。然后仔细观察,我注意到了这个问题。将其更改为...listen(port, ip),一切都开始正常了!!

如果它对其他人有用的话,只是把它说出来......

【讨论】:

谢谢!我有同样的问题。我已经习惯了使用主机名、端口的所有其他 API。 我在尝试运行 Wekan docker 镜像时遇到了这个问题。我用这个技巧解决了。谢谢。 @dilip-muthukurussimana 您是否打算在答案中包含....listen(ip, port)(有四个.)?因此,我花了一分钟才意识到您在谈论论点的顺序。 是的,我的意思只是参数的顺序。请不要把....(四个点)放在那里,我认为这很明显。 我的情况正好相反。我正在使用 Nodejs v14.17.5 我一直在使用 ....listen(port, IP),但它正在抛出错误 listen EACCES: permission denied 127.0.0.1。看到你的回答,让我更加关注这个错误,我把它改成....listen(ip, port),它工作了。【参考方案12】:

在尝试了许多不同的方法后,在我的 Windows 上重新安装 IIS 解决了这个问题。

【讨论】:

【参考方案13】:

使用(在 Windows 上)解决了我的错误

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => 
    console.log("Server is running at " + app.get('PORT'));
);

允许 NodeJS 应用访问 Windows 防火墙中的网络。

【讨论】:

【参考方案14】:

仅通过更改 server.js 中的端口号即可解决我的错误 特别是在这一行

const port = process.env.PORT || 8085;

我将端口号从 8080 更改为 8085。

希望对你有帮助。

【讨论】:

【参考方案15】:

我有一个类似的问题,它拒绝在端口 8080 上运行,但也有 any 其他。

原来,这是因为它读取的 env.local 文件在变量名之后包含了 cmets,例如:

PORT=8080 # The port the server runs at

它这样解释它,试图使用端口“8080 # The port the server runs at”,这显然是一个无效的端口(-1)。 删除 cmets 完全解决了它。

顺便说一下,使用 Windows 10 和 Git Bash。


我知道这不是完全这里描述的问题,但它可能会帮助那里的人。我找到了这个问题来寻找我的答案,所以……也许吧?

【讨论】:

是的,我经历过。 .env 文件中的值后面的注释可能会导致这种情况。【参考方案16】:

重启还不够!解决问题的唯一方法是:

您必须终止在该端口上运行的服务。

在 cmd 下,以管理员身份运行,然后键入: netstat -aon | find /i "listening"

然后,您将获得一个包含活动服务的列表,搜索在 4200n 上运行的端口并使用最后一列的进程 ID 将其杀死

taskkill /F /PID 2652

【讨论】:

【参考方案17】:

对我来说,这个问题影响了 PowerShell 中 Windows 上的所有主机和所有端口。

禁用网络接口解决了这个问题。

我有 WiFi 和以太网连接,禁用以太网接口解决了这个问题。

打开“网络连接”以查看您的接口。右键单击并选择“禁用”。

【讨论】:

【参考方案18】:

这意味着该端口在其他地方使用。因此,您需要尝试另一个或停止使用旧端口。

【讨论】:

【参考方案19】:

在Windows系统上,重启“Host Network Service”服务,问题解决。

【讨论】:

这需要更多的支持!谢谢 - 有时我遇到这个问题,总是不得不重新启动整个机器。 这为我解决了这个问题!谁能帮我理解为什么以及如何? 终于找到比重启更好的答案了!【参考方案20】:

同样的问题也发生在我身上。 您需要检查您设置监听端口的 server.js 文件。在所有地方明智地更改端口号,它有望解决您的问题。

【讨论】:

【参考方案21】:

#Windows

另一个原因 - 可能由于某些原因您的端口已被排除

所以,尝试在管理员权限下打开 CMD(命令行)并运行:

    net stop winnat net start winnat

就我而言,这就足够了。

在这里找到解决方案:https://medium.com/@Bartleby/ports-are-not-available-listen-tcp-0-0-0-0-3000-165892441b9d

【讨论】:

这个解决方案非常适合我。谢谢! 这是唯一对我有用的解决方案。 这解决了我的问题,谢谢。但是,谁能解释一下是什么突然导致了这个问题?【参考方案22】:

对我来说,这只是 .env 文件中的一个错误。我删除了每行末尾的逗号,解决了。

之前:

HOST=127.0.0.1,

之后:

HOST=127.0.0.1

【讨论】:

【参考方案23】:

剧透警告:这个答案可能看起来有点滑稽。

我花了 10 多分钟来找出系统中出现此错误的根本原因。我在我的 .env 文件中使用了这个:PORT=2000;

希望你已经找到了。我在声明端口号后使用了分号:'(我删除了多余的符号,它开始工作了。

我知道这可能不是这个问题的答案,但希望它可以帮助遇到同样问题的其他人。

【讨论】:

好吧,我犯了同样的错误,找不到错误,浪费了一天。这个答案帮助了我。谢谢 谢谢,兄弟。我犯了同样的错误:-)【参考方案24】:

对我来说,问题是在没有关闭快速运行服务器的情况下退出我的节点应用程序。

【讨论】:

【参考方案25】:

您可以在主文件中使用此代码 常量 PORT = process.env.PORT || APP_PORT;

【讨论】:

【参考方案26】:

如果您使用的是 windows。您应该尝试重新启动 Windows NAT 驱动程序服务

管理员身份打开命令提示符并运行

net stop winnat

然后

net start winnat

就是这样。

这是因为我安装了 Nord ***。它会自动盯着窗户看。

【讨论】:

【参考方案27】:

错误:监听 EACCES:权限被拒绝 3000; 我添加“端口 = 3000;”而 "PORT = 3000" 。 只是分号";"报错

去掉分号,项目运行成功

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于侦听大多数端口时出现 Node.js EACCES 错误的主要内容,如果未能解决你的问题,请参考以下文章

侦听http 80端口时Node.js EACCES错误(权限被拒绝)[重复]

错误:在监听端口 444/443 时监听 EACCES 0.0.0.0:444 node.js

我有 node.js 应用程序我正在使用 dotenv 设置 .env,使用端口时出现以下错误

node.js 项目在本地机器上工作,在 Heroku 上部署时出现问题

Node.JS 应用程序未侦听分配的端口

在 Firefox 中运行 node.js 和 socket.io 时出现 CORS 错误