【问题标题】:How to run pm2 so other server users are able to access the process?如何运行 pm2 以便其他服务器用户能够访问该进程?
【发布时间】:2015-11-17 15:34:27
【问题描述】:

当我使用pm2 启动我的 Nodejs 应用程序时,其他服务器用户无法访问该进程。

即使我从自定义目录启动 pm2(不是当前用户的 ~/,pm2 默认使用的是什么):

HOME=/var/www pm2 start app.js

任何用户都可以访问目录(与 ~/ 相比,但其他服务器用户仍然无法访问该进程。

当其他服务器用户执行pm2 list 时,它显示他有 0 个进程正在运行 - 但有(由另一个用户启动)。而当其他用户尝试HOME=/var/www pm2 list 时,CLI 会抛出错误:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: connect EACCES
    at errnoException (net.js:905:11)
    at Object.afterConnect [as oncomplete] (net.js:896:19)

所以我想知道如何确保用户能够访问其他服务器用户运行的 pm2 进程?还是应该采取不同的方法?


我想知道为什么每个服务器用户都可以使用git pull 来部署 Git 存储库中的最新源代码,但之后无法重新启动 pm2 进程?只有启动pm2 进程的用户才能重新启动它……很奇怪。

【问题讨论】:

  • 一个pm2实例只属于启动它的用户。
  • @Nik Sumeiko,根据描述,你不应该在这篇文章中添加永久标签。

标签: node.js server pm2 multiple-users


【解决方案1】:

我也遇到过类似的问题。原因可能是您没有所需的权限,或者您不拥有 pm2 创建的 pid 和 sock 文件。就我而言,当我从命令行而不是启动启动 pm2 时,它工作正常。当我使用启动时,它默认以root用户身份运行。所以 root 是 pid、sock 文件的所有者

【讨论】:

  • Shrinath,从初创公司启动 pm2 是什么意思?启动服务器?我总是从 CLI 启动 pm2,但不是作为 root 用户。但是,作为 sudoers 组中的用户。
  • 或许,有办法改变pid,sock文件的权限呢?那么其他用户(sudoers,如果重要的话)有权查看已启动的 pm2 进程?
  • 我的意思是说运行时抛出错误消息的用户没有访问pm2 pid文件的权限。 pm2 由不同的用户启动
【解决方案2】:

这是我们绕过这个的方法。

只需创建一个组

  • 创建一个新组 pm2 或任何适合您的名称

    $ groupadd pm2

  • /var/www/ 文件夹组所有者更改为组 pm2

    $ chgrp -R pm2 /var/www

  • 将另一个用户(比如 bob)添加到 pm2

    $ usermod -aG pm2 bob

现在 bob 可以通过将 $HOME 更改为 /var/www

来运行 pm2 命令

$ env HOME=/var/www pm2 list

或者(更好)按照@jcollum 的建议创建一个别名

$ alias pm2='env HOME=/var/www pm2'

【讨论】:

  • 这对我有用。另一件事是为 PM2 设置别名,以便 env HOME 包含在所有 pm2 调用中。
  • 对不起菜鸟的问题。在上面的解决方案中 - 如果用户“bob”使用 pm2 运行某些东西(例如“pm2 list”),它将改变他的 HOME 变量。仅用于此命令,否则它将是永久的(在这种情况下,这不是一个好的解决方案,因为许多应用程序都需要此 HOME 变量)。
  • 我遇到了确切的问题,但我来自 Windows 服务器,谁能告诉我如何在 Windows 环境中执行等效操作?
  • @JanezKranjski Linux 中的每个应用程序都以用户身份运行,并进一步在环境中运行。您需要为运行应用程序的用户设置 ENV。希望这是有道理的。
  • 你好@jet_choong!您是否曾经设法在您的 Windows 环境中解决此问题?
【解决方案3】:

PM2 似乎将数据保存在用户的 '~/.pm2' 文件夹下,因此其他用户无法通过 'pm2 status' 看到您的 PM2 进程。

我为 PM2 创建了一个新的 linux 用户,所有用户在启动 Pm2 进程之前都使用“su pm2user”:

$ sudo su pm2user
$ sudo pm2 start app.js

这是一种愚蠢的方法,但它很简单而且效果很好。希望这会有所帮助:)

【讨论】:

    【解决方案4】:

    假设您以 www-data 运行 pm2。要访问该 pm2 实例,我可以:例如sudo -u www-data HOME=/var/www pm2 list。当然,您可以创建一个脚本(例如supm2)为您执行此操作,这样您就可以改为使用supm2 list

    【讨论】:

      【解决方案5】:

      好的,这是我针对相同问题的解决方案:

      # 1. Create user PM2 and set his password
      sudo useradd -d /opt/pm2 -m -s /bin/bash pm2
      sudo passwd pm2
      
      # 2. Add users you want to provide the access to PM2 to PM2 group
      sudo usermod -aG pm2 <username>
      
      # Note: if you added yourself to pm2 group, perform logout and login back to the host machine   
      
      # 3. Set the PM2_HOME variable
      sudo touch /etc/profile.d/pm2.sh
      sudo sh -c 'echo "export PM2_HOME=\"/opt/pm2/.pm2\"" > /etc/profile.d/pm2.sh'
      source /etc/profile.d/pm2.sh
      
      # 4. Install the PM2 
      # Check the npm prefix if fail: 
      # https://docs.npmjs.com/misc/config#prefix
      sudo npm install pm2 -g
      
      # 5. Make startup script
      sudo pm2 startup ubuntu -u pm2 --hp /opt/pm2
      
      sudo systemctl enable pm2-pm2 && \
      sudo systemctl start pm2-pm2 && \
      sudo systemctl status pm2-pm2
      
      # 6. Change permission of PM2_HOME
      sudo chmod -v g+w /opt/pm2/.pm2
      
      # 7. Check the PM2
      pm2 status
      

      【讨论】:

      • 安装前需要设置PM2_HOME变量吗?我已经安装了 pm2,想避免重新安装...
      • 你可以随时设置,马克。它只是指向 PM2 的主目录。
      • 我发现的唯一问题,每次 pm2 服务重新启动时,它都会重写非常重要的 pub.sock 和 rpc.sock 文件,您将失去您设置的 770 访问权限。每次重启时都需要对这些文件进行 chmod。
      • 对我来说最好的解决方案!
      • @Nicholi Umask 解决方案对您没有帮助?您是否使用 sudo 执行了一些 PM2 操作? PM2 在哪个操作系统/发行版(Windows、Ubuntu、Raspbian 等)下运行?
      【解决方案6】:

      我知道我参加聚会迟到了,但我就是这样做的:

      PM2="/usr/share/nodejs/pm2"
      USER="me"
      useradd $USER
      groupadd pm2
      chgrp -R pm2 $PM2
      usermod -aG pm2 $USER
      setfacl -Rdm g:pm2:rwx $PM2
      

      /etc/bash.bashrc 等

      export PM2_HOME=$PM2;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多