当前位置: 首页 > 面试题库 >

在HTTP 80端口上侦听时,Node.js EACCES错误(权限被拒绝)

鲁鸿朗
2023-03-14
问题内容

在HTTP端口80(默认端口)上运行时,Node.js引发以下错误:-

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)

我发现该节点需要具有root用户访问权限。

按照惯例,在正常情况下,我们避免给予root访问权限。在端口80(或端口<1024)上使用它的最佳实践是什么。

该链接具有相同的问题,但只有一个答案,即PREROUTING。虽然我的解决方案还提供了其他方法。

我写这篇文章是为了在一个位置获得所有答案,因为我必须深入研究除PREROUTING之外的其他资源。为什么不是所有答案都在一个位置共享知识


问题答案:

仅供参考:您不能在具有普通用户许可的情况下在<1024端口上运行套接字。您需要具有root访问权限。

共有3种解决错误的方法:-

1.授予root访问权并运行它(这是通常的一种)

2.重定向到其他端口

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

然后在端口3000上启动我的Node.js。对端口80的请求将映射到端口3000。

您还应该编辑/etc/rc.local文件,并添加减去sudo的那一行。这将在计算机启动时添加重定向。您不需要/etc/rc.local中的sudo,因为在那里的命令在系统启动时以root身份运行。

3.赋予普通用户使用套接字作为root用户的能力

目标:-我们不提供完全的root用户访问权限,而仅授予普通用户访问socket_root的权限以在任何端口上运行服务器。

我们不希望以root用户身份运行您的应用程序,但是有一个麻烦:您的安全用户没有使用默认HTTP端口(80)的权限。您的目标是通过导航到易于使用的URL(如)来发布访问者可以使用的网站http://localhost

不幸的是,除非您以root用户身份登录,否则通常必须使用类似http://localhost:3000-注意端口号的URL 。

很多人被困在这里,但是解决方案很容易。有几种选择,但这是我喜欢的选择。键入以下命令:

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

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

参考链接

来自Apache的常规信息参考链接



 类似资料:
  • 问题内容: 我运行 npm install lodash, 但它抛出 错误:EACCES:权限被拒绝 错误。我知道这是权限问题,但据我所知,本地安装节点模块不需要sudo权限。如果我使用sudo运行它,它将安装在〜/ node_modules文件夹中。 drwxrwxr-x 是现有文件夹的文件许可权。我不知道可能出了什么问题。 下面是错误消息。 问题答案: 使用 npm init 创建 packa

  • 我运行npm install lodash,但它抛出错误:EACCES:权限被拒绝错误。我知道这是权限问题,但据我所知,在本地安装节点模块不需要sudo权限。如果我用sudo运行它,它会安装在~/node\u modules文件夹中。drwxrwxr-x是现有文件夹的文件权限。我不知道可能出了什么问题。 下面是错误消息。

  • 问题内容: 我正在测试一个应用程序(希望可以在heroku上运行,但是在本地也有问题)。它在运行http.Server.listen()时给我一个EACCES错误- 但它仅在某些端口上发生。 因此,我正在本地运行: 我在900端口(或我尝试过的其他20个端口中的任何一个)上没有任何运行,因此这应该可以工作。奇怪的是它 确实 在某些端口 上 工作。例如,端口3000可以正常工作。 是什么原因造成的?

  • 我在django admin(127.0.0.1:8000/admin)中尝试为用户添加个人资料照片时收到此错误消息 有人能帮我找出原因吗? OSError at /admin/role/role/6/[Errno 13]权限被拒绝:'/User'请求方法: POST请求URL:http://127.0.0.1:8000/admin/role/role/6/Django版本: 1.8.2异常类型:

  • 我在Ruby 2.0.0-p353和OSX Mavericks上使用Rails 4.0.2、Guard 2.2.4、Guard rspec 4.2.4、rspec Rails 2.14.0、Capybara 2.2.1和Poltergeist 1.5.0。 当我运行bundle exec Guard时,我得到了很多失败的错误消息:一个错误发生在后钩子Errno::EACCES:权限拒绝- /usr

  • 注意:最后一个###.##.###.####是运行代码的google compute VM的外部IP。我相信前两个IP是我的家IP。 在连接到上游:[nginx]时,我尝试了:上的