【问题标题】:Running Node app via PM2 on port 80通过 PM2 在端口 80 上运行 Node 应用程序
【发布时间】:2019-12-28 20:39:50
【问题描述】:

我有一个快递,我想在 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/超级用户运行是一种好习惯吗?命令sudo PM2 restart index 导致sudo: pm2: command not found。为什么在运行sudo PM2 时找不到PM2.. 如果PM2 在我的路径中?

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

【问题讨论】:

    标签: node.js web-services amazon-ec2 port pm2


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    作为特权用户尽可能少地运行是件好事,因为您希望限制潜在的损害,以防有人利用您的程序。除非万不得已,否则您不想以 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;
      }
    }
    

    【讨论】:

      【解决方案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 运行应用程序。它应该工作!

      【讨论】:

        【解决方案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/specifics/#listening-on-port-80-w-o-root

        【讨论】:

          【解决方案5】:

          花了很多时间配置nginx,终于卸载了,跟着A.J.建议配置 iptables。谢谢 A.J.

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-12-02
            • 2016-02-15
            • 2019-06-23
            • 2013-01-27
            • 1970-01-01
            • 1970-01-01
            • 2019-05-27
            相关资源
            最近更新 更多