如何运行pm2以便其他服务器用户能够访问该进程?

时间:2015-08-24 09:10:19

标签: node.js server forever pm2 multiple-users

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

即使我从自定义目录(不是当前用户' s ~/)启动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进程的用户才能重启...很奇怪。

6 个答案:

答案 0 :(得分:9)

以下是我们如何绕过这一点。

只需创建一个组

  • 创建一个新组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'

答案 1 :(得分:4)

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

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

$ sudo su pm2user
$ sudo pm2 start app.js

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

答案 2 :(得分:4)

好的,这是我解决同样问题的方法:

  1. 创建PM2主目录: sudo mkdir /opt/pm2
  2. 创建用户 pm2 sudo useradd -d /opt/pm2 -M -r -s /bin/false pm2
  3. 将所有必需用户添加到 pm2 组: sudo usermod -aG pm2 <username>
  4. 设置 / opt / pm2 的所有者: sudo chown pm2:pm2 /opt/pm2
  5. 更改权限:sudo chmod 770 /opt/pm2
  6. 设置环境变量(我正在使用 / etc / environment ):PM2_HOME=/opt/pm2
  7. 安装pm2:sudo npm install pm2 -g。我的 npm前缀设置为 / usr / local
  8. 运行sudo pm2 startup。它将为您的系统生成启动脚本(在我的例子中是Ubuntu Server)。
  9. 打开启动脚本(在我的情况下,再次是 /etc/init.d/pm2-init.sh )并编辑以下变量 USER=pm2 ... export PM2_HOME="/opt/pm2"
  10. 在我的Raspberry PI中,我遇到套接字文件权限继承问题,它们被设置为只读组而不是rwx应用于home目录: srwxr-xr-x 1 pm2 pm2 0 Sep 11 17:27 pub.sock srwxr-xr-x 1 pm2 pm2 0 Sep 11 17:27 rpc.sock

    经过数小时的谷歌搜索后,我终于找到了解决方案:我在启动脚本中添加了以下行: umask 0002 得到它: srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 pub.sock srwxrwxr-x 1 pm2 pm2 0 Sep 11 17:27 rpc.sock

    多数人。

    <强>更新

    我们假设你已经创建了 pm2 用户,它的主目录并将自己添加到 pm2 组中。

    现在,从 6 开始,可以通过以下方式完成:

    1. sudo npm install pm2 -g 记住npm前缀!
    2. pm2.sh目录下创建/etc/profile.d/文件,并在其中添加以下行:export PM2_HOME=/opt/pm2/.pm2。现在,PM2_HOME环境变量将在登录后呈现给每个用户。
    3. 要创建启动脚本,请运行以下命令:sudo pm2 startup ubuntu -u pm2 --hp /opt/pm2
    4. 检查服务状态:sudo systemctl status pm2-pm2
    5. 您可以将pm2服务重命名为:

      sudo systemctl stop pm2-pm2
      sudo mv /etc/systemd/system/pm2-pm2.service /etc/systemd/system/pm2.service
      sudo systemctl start pm2
      

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我知道我参加晚会很晚,但这就是我的做法:

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;