我有一个快递,我想在端口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上运行?没找到。
答案 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
这也是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
运行该应用程序。它应该可以工作!