37

当我使用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进程的用户才能重新启动它……很奇怪。

4

6 回答 6

26

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

只需创建一个组

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

于 2015-10-07T15:03:31.783 回答
13

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

# 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
于 2016-09-11T15:02:28.980 回答
9

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

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

$ sudo su pm2user
$ sudo pm2 start app.js

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

于 2016-03-24T08:36:05.657 回答
3

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

于 2016-04-27T02:21:12.920 回答
1

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

于 2015-08-28T06:54:04.730 回答
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;
于 2019-05-20T01:52:22.303 回答