错误:侦听EACCES 0.0.0.0:80 OSx Node.js

oli*_*ier 58 javascript macos node.js

我正在按照angularJS书中的教程进行操作,并且必须设置服务器.这是server.js文件:

 var express = require('express');
  var app = express();
   app.use('/', express.static('./'));
    app.listen(80);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

$ node server.js
events.js:154
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80
Run Code Online (Sandbox Code Playgroud)

我已经知道,错误EACCES意味着我没有端口80的访问权限,但我不知道如何解决这个问题.任何帮助非常感谢!

ves*_*sse 55

如果需要在端口80上运行服务器,则应使用像nginx这样的反向代理,它将使用特权端口上的系统帐户运行,并将请求代理到在非特权端口(> 1024)上运行的Node.js服务器.

在开发环境中运行时,您可以自由地以root身份运行(即.sudo node server.js),但这在生产环境中相当危险.

这是一个示例nginx配置,它将查看请求是否适用于文件系统中存在的文件,如果不是,请将请求代理到在端口9000上运行的Node.js服务器

upstream yournodeapp {
  server localhost:9000 fail_timeout=0;
  keepalive 60;
}

server {
  server_name localhost;
  listen 80 default_server;

  # Serve static assets from this folder
  root /home/user/project/public;

  location / {
    try_files $uri @yournodeapp;
  }

  location @yournodeapp {
    proxy_pass http://yournodeapp;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 啊.是不是有某种方式代理使用节点本身? (3认同)

小智 50

您可以执行对端口80的节点和启动服务器的root访问权限

sudo node app.js
Run Code Online (Sandbox Code Playgroud)

这将启动服务器授予端口80的权限

  • 建议以root身份运行会带来不必要的安全风险.这是不明智的. (13认同)

aza*_*tar 12

最重要的是,不要以root身份运行.那就是'它'."它"非常糟糕.去看电影吧.然后,不要以root身份运行节点Web项目.

// DO NOT DO THIS!
$ sudo node app.js

// DO NOT DO THIS EITHER!
$ sudo su -
# node app.js
Run Code Online (Sandbox Code Playgroud)

相反,使用PM2authbind来执行此操作:

// %user% is whatever user is running your code
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80
Run Code Online (Sandbox Code Playgroud)

接下来,将此别名添加到您的~/.bash_aliases~/.bashrc~/.bash_profile:

alias pm2='authbind --deep pm2'
Run Code Online (Sandbox Code Playgroud)

然后,用pm2尝试:

pm2 start app.js
Run Code Online (Sandbox Code Playgroud)