当我使用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
进程的用户才能重启...很奇怪。
答案 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)
好的,这是我解决同样问题的方法:
sudo mkdir /opt/pm2
sudo useradd -d /opt/pm2 -M -r -s /bin/false pm2
sudo usermod -aG pm2 <username>
sudo chown pm2:pm2 /opt/pm2
sudo chmod 770 /opt/pm2
PM2_HOME=/opt/pm2
sudo npm install pm2 -g
。我的 npm前缀设置为 / usr / local 。 sudo pm2 startup
。它将为您的系统生成启动脚本(在我的例子中是Ubuntu Server)。
USER=pm2
...
export PM2_HOME="/opt/pm2"
在我的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 开始,可以通过以下方式完成:
sudo npm install pm2 -g
记住npm前缀! pm2.sh
目录下创建/etc/profile.d/
文件,并在其中添加以下行:export PM2_HOME=/opt/pm2/.pm2
。现在,PM2_HOME
环境变量将在登录后呈现给每个用户。sudo pm2 startup ubuntu -u pm2 --hp /opt/pm2
sudo systemctl status pm2-pm2
您可以将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;