通过端口80上的PM2运行节点应用程序

时间:2017-07-04 17:05:27

标签: node.js web-services amazon-ec2 port pm2

我有一个快递,我想在端口80上运行。 - > app.listen(80);

我正在使用PM2来管理应用(重启,停止,监控等)。我有一个部署shell脚本,其最后一个命令是PM2 restart index。从控制台输出中,我看到没有错误,PM2报告它已成功完成命令。然而,当我到my.ec2.ip.address:80时,该网站没有启动。此外,如果我在服务器项目目录中运行node index.js,我会得到Error: listen EACCES 0.0.0.0:80。这对我来说有点意义,因为端口80低于1024,因此是特权端口。 sudo node index.js将允许启动工作。

我是unix,服务器,权限和部署的新手,因此除了解决方案之外,我们将非常感谢对我的问题做出贡献的基本概念的解释。例如..简单地以超级用户身份运行我的节点应用程序是不是很糟糕?运行PM2(因此可能运行节点为??)root / super-user是一种好习惯吗?命令sudo PM2 restart index会导致sudo: pm2: command not found。运行PM2时为什么找不到sudo PM2 ..如果PM2在我的路径中?

最终,使用PM2时如何确保我的服务器在端口80上运行?没找到。

5 个答案:

答案 0 :(得分:6)

不要使用端口80,在8080等其他端口上运行,并使用此命令将80重定向到该端口

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

答案 1 :(得分:3)

尽可能少地作为特权用户运行是好的,因为如果有人利用您的程序,您希望限制潜在的损害。除非绝对必要,否则您不希望以root身份运行您的节点代码。

因此,最好在非特权端口(例如,端口8000)上运行Node程序,而是使用轻量级Web服务器(如Nginx)侦听端口80,只需将流量转发到Node程序。

如果您想使用Nginx,您可以使用此配置完全按照上面的描述进行操作,然后只需使用端口3000上的Node程序进行监听:

server {
  listen 80 default;
  listen [::]:80 default;

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
  }
}

答案 2 :(得分:0)

花了很多时间配置nginx后,最后卸载它并遵循A.J.建议配置 iptables 。谢谢A.J。

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

但是,如果有人知道配置nginx的完美教程,那将是一个很好的帮助。

答案 3 :(得分:0)

对于ubuntu服务器,我遇到了同样的问题。 已在下面的教程中修复。

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

这也是PM2的另一种解决方案

sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80

https://pm2.keymetrics.io/docs/usage/specifics/#listening-on-port-80-w-o-root

答案 4 :(得分:0)

尽管,您可能已经解决了该问题,但是对于来这里遇到同样问题的人来说,这很奏效:

仅用于故障排除,请使用sudo npm start运行您的应用。如果您的应用正常运行,则需要在80软件包的帮助下绑定端口authbind。运行以下命令:

sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80

用运行pm2的用户替换%user%。我的默认情况下是ubuntu

start文件中的package.json命令设置为pm2 start <server_file_name>。 使用npm start运行该应用程序。它应该可以工作!