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

Node.js 通过端口80上的PM2运行节点应用程序,node.js,web-services,amazon-ec2,port,pm2,Node.js,Web Services,Amazon Ec2,Port,Pm2,我想在端口80上运行一个express。-->应用程序监听(80) 我正在使用PM2管理应用程序(重新启动、停止、监控等)。我有一个部署shell脚本,它的最后一个命令是PM2 restart index。从控制台输出中,我没有看到任何错误,PM2报告它成功地完成了命令。然而,当我访问我的.ec2.ip.address:80时,网站还没有启动。此外,如果在我的服务器项目目录中运行node index.js,我会得到一个错误:listen EACCES 0.0.0.0:80。这对我来说有一定意义,

我想在端口80上运行一个express。--><代码>应用程序监听(80)

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

我是unix、服务器、权限和部署方面的新手,因此除了解决方案之外,如果您能解释导致我的问题的基本概念,我将不胜感激。例如。。仅仅以超级用户的身份运行我的节点应用程序不好吗?运行
PM2
(因此可能以..身份运行节点)根用户/超级用户是否是一种良好的做法?命令
sudo PM2 restart index
导致
sudo:PM2:command not found
。为什么运行
sudo PM2
时找不到
PM2
。。如果
PM2
在我的路径中


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

最好尽可能少地作为私密用户运行,因为您希望在有人利用您的程序时限制潜在的损害。您不想以root用户身份运行节点代码,除非您必须这样做

因此,最好在非特权端口(例如,端口8000)上运行节点程序,而在端口80上使用轻量级web服务器,如Nginx listen,只需将流量转发到节点程序

如果您想使用Nginx,您可以使用此配置来完成我上面描述的操作,然后在端口3000上使用您的节点程序进行监听:

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;
  }
}

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

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

在花费大量时间配置nginx之后,最终卸载它,并按照A.J.的建议配置iptables。谢谢你,A.J

sudo iptables-A预路由-t nat-i eth0-p tcp--dport 80-j重定向--到端口8080


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

对于ubuntu服务器,我也有同样的问题。 修正了下面的教程

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

这里还有另一个来自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

不过,你可能已经解决了这个问题,但对于一个来这里面对同样问题的人来说,这对我来说很有用:

对于疑难解答,请使用
sudo npm start
运行应用程序。如果你的应用程序正常运行,那么你需要在
authbind
软件包的帮助下绑定端口
80
。运行以下命令:

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
%user%
替换为运行pm2的用户。默认情况下,我的是ubuntu

package.json
文件中的
start
命令设置为
pm2 start

使用
npm start
运行应用程序。它应该有用

运行这个之后,我可以访问,但没有。要撤消此命令,请执行以下操作: