配置Passenger为应用所有者后为何仍需开放其他用户执行权限?
问题原因分析
这个现象的核心在于Nginx worker进程的权限与Passenger运行用户的权限是分离的:
- Nginx主进程以root启动,但实际处理请求的worker进程通常以非root用户(比如默认的
www-data)运行。 - 在Passenger切换到
dog_park用户执行应用代码前,Nginx的worker进程需要先完成对/var/www/dog_park/public/的stat()操作,这一步的权限校验是基于Nginx worker用户的,而非dog_park用户。 - 当目录权限为
drwxr-x--x时,其他用户拥有执行权限,Nginx worker用户属于“其他用户”范畴,所以能正常访问;如果去掉其他用户的执行权限,worker用户就无法遍历路径完成stat操作,触发权限拒绝错误。
解决思路
1. 确认Nginx worker进程的运行用户
查看Nginx主配置文件(通常是/etc/nginx/nginx.conf)顶部的user指令,比如:
user www-data;
记录下这个用户(比如www-data),后续权限调整都围绕这个用户展开。
2. 调整目录权限的正确姿势(无需开放其他用户权限)
方式一:将Nginx worker用户加入dog_park用户组
- 执行命令将worker用户添加到
dog_park组:usermod -aG dog_park www-data - 给应用路径上的所有父目录设置组执行权限:
chmod g+x /var/www /var/www/dog_park /var/www/dog_park/public - 若目录组归属不是
dog_park,执行以下命令修正:chgrp -R dog_park /var/www/dog_park
方式二:使用ACL单独授权(无需修改用户组)
如果不想调整用户组,可通过ACL权限单独给Nginx worker用户授权:
setfacl -m u:www-data:x /var/www /var/www/dog_park /var/www/dog_park/public
3. 验证完整路径的权限链
注意:从根目录到public目录的每一级父目录(比如/、/var、/var/www)都需要对Nginx worker用户有执行权限(执行权限允许用户遍历目录),否则即使dog_park目录权限正确,上层目录权限不足也会导致同样的错误。
4. 重启服务生效
调整权限后,重启Nginx服务使配置生效:
systemctl restart nginx
内容的提问来源于stack exchange,提问作者dcgenjin
相关产品推荐
相关产品推荐

