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

17
我想将我的express应用程序运行在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、服务器、权限和部署方面的新手,除了解决方案外,非常感谢对导致我问题的基本概念的说明。例如..仅仅作为超级用户来运行我的node应用程序是否不好?以root/super-user身份运行PM2是否是良好实践?命令sudo PM2 restart index会导致sudo: pm2: command not found。为什么在运行sudo PM2时找不到PM2?如果PM2在我的路径中的话?
但是,最终如何使用PM2来确保服务器运行在80端口上呢?
5个回答

17
不要使用端口80,而是使用其他端口如8080,并使用以下命令将80端口重定向到该端口。
  sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

运行后,我能够访问http://example.org:80,但无法访问http://example.org。要撤销此命令,请参考:http://lubos.rendek.org/remove-all-iptables-prerouting-nat-rules/ - Carlos Oliveira

7
尽可能少地以特权用户身份运行程序是很好的,因为这样可以限制潜在的损害,防止别人利用你的程序。除非绝对必要,否则不要以root身份运行Node代码。
因此,最好在非特权端口(比如8000端口)上运行Node程序,然后让像Nginx这样的轻量级Web服务器监听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;
  }
}

3

虽然您可能已经解决了问题,但对于那些遇到同样问题来到这里的人,以下方法适用:

仅进行故障排除,请使用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 <server_file_name>。 使用npm start运行应用程序。它应该可以工作!


3

我曾经遇到过同样的问题,在 Ubuntu 服务器上。 下面的教程可以解决该问题。

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

如何使用PM2在Ubuntu VPS上设立Node.js生产环境

另外,这里介绍了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


1

经过花费了大量时间配置nginx,最终卸载它并遵循A.J.的建议配置iptables。谢谢A.J。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接