Ubuntu部署Rails7时Nginx访问存在的Puma socket报Permission denied错误
根因分析
你的socket文件本身权限配置正确,出现Permission denied错误有两个核心原因:
- Nginx worker进程默认以
www-data身份运行,默认Ubuntu普通用户家目录权限为750,其他用户没有进入目录的执行权限,即使子目录下的socket权限为777,也无法穿透上层目录访问。 - Ubuntu默认启用的AppArmor安全模块限制了Nginx的文件访问范围,仅允许其访问预设的
/var/www/、/etc/nginx/等路径,用户家目录下的socket访问会被拦截。
解决方案
方案一:调整上级目录权限(快速验证)
执行以下命令给家目录及相关层级目录开放执行权限(仅允许进入目录,不开放文件列表读取权限,风险较低):
chmod o+x /home/comtechmaster chmod o+x /home/comtechmaster/apps chmod o+x /home/comtechmaster/apps/master_cms chmod o+x /home/comtechmaster/apps/master_cms/shared chmod o+x /home/comtechmaster/apps/master_cms/shared/tmp chmod o+x /home/comtechmaster/apps/master_cms/shared/tmp/sockets
修改完成后重启Nginx测试:
sudo systemctl restart nginx
方案二:迁移socket到公共访问路径(更安全)
将Puma的socket生成路径改到系统公共运行目录/run下,避开家目录权限和AppArmor限制:
- 创建puma运行目录并赋权:
sudo mkdir /run/puma sudo chown comtechmaster:comtechmaster /run/puma
- 修改Puma服务配置和Rails项目下的
puma.rb配置,将socket路径改为unix:///run/puma/puma_master_cms_production.sock,重启Puma用户服务:
systemctl --user restart puma_master_cms_production
- 同步修改Nginx配置里的upstream socket路径,重启Nginx即可生效。
方案三:调整AppArmor规则(针对AppArmor拦截场景)
如果上述两个方案都无效,可临时关闭Nginx的AppArmor强制模式验证:
sudo aa-complain /usr/sbin/nginx
如果测试后访问恢复正常,说明是AppArmor拦截,可修改/etc/apparmor.d/local/usr.sbin.nginx文件,添加以下规则:
/home/comtechmaster/apps/master_cms/shared/tmp/sockets/*.sock rw,
重载AppArmor规则后恢复强制模式即可:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx sudo aa-enforce /usr/sbin.nginx
内容的提问来源于stack exchange,提问作者jamesc
相关产品推荐
相关产品推荐

