通过 PM2 在端口 80 上运行 Node 应用程序

问题描述 投票:0回答:5

我有一个快车,我想在端口 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、服务器、权限和部署的新手,因此除了解决方案之外,对导致我的问题的基本概念的解释将非常感激。例如..以超级用户身份运行我的节点应用程序是否不好?以 root/超级用户身份运行

PM2
(因此可能以..身份运行节点?)是个好习惯吗?命令
sudo PM2 restart index
导致
sudo: pm2: command not found
。如果
PM2
在我的路径中,为什么运行
sudo PM2
时找不到
PM2

最终,当使用

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

node.js web-services amazon-ec2 port pm2
5个回答
17
投票

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

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

7
投票

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

因此,最好在非特权端口(例如端口 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;
  }
}

4
投票

对于 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/specials/#listening-on-port-80-w-o-root

2024 更新

即使我的答案是正确的,我强烈建议使用@Frxstrem的answer灵活性和安全性。 让 Node 使用 80 端口并不是一个明智的想法。

您可以使用 Nginx 等工具来实现额外的安全层。还可以运行多个使用不同 URL 共享端口 80 的 Node.JS 服务器。


3
投票

虽然,您可能已经解决了问题,但对于来到这里面临同样问题的人来说,这对我有用:

如果只是进行故障排除,请使用

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

%user%
替换为您运行 pm2 的用户。我的默认是
ubuntu

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


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.