我有一个快车,我想在端口 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上运行?没有找到。
不要使用端口 80,在其他端口(如 8080)上运行,并使用此命令将 80 重定向到该端口
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
作为特权用户,尽可能少地运行是很好的,因为您希望限制有人利用您的程序造成的潜在损害。除非绝对必要,否则您不想以 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;
}
}
对于 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/specials/#listening-on-port-80-w-o-root
即使我的答案是正确的,我强烈建议使用@Frxstrem的answer灵活性和安全性。 让 Node 使用 80 端口并不是一个明智的想法。
您可以使用 Nginx 等工具来实现额外的安全层。还可以运行多个使用不同 URL 共享端口 80 的 Node.JS 服务器。
虽然,您可能已经解决了问题,但对于来到这里面临同样问题的人来说,这对我有用:
如果只是进行故障排除,请使用
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
运行应用程序。应该有效!
花了很多时间配置 nginx,最后卸载它并按照 A.J.建议配置iptables。谢谢你,A.J.
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
但是,如果有人知道配置 nginx 的完美教程,将会有很大帮助。