You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu部署Rails7时Nginx访问存在的Puma socket报Permission denied错误

根因分析

你的socket文件本身权限配置正确,出现Permission denied错误有两个核心原因:

  1. Nginx worker进程默认以www-data身份运行,默认Ubuntu普通用户家目录权限为750,其他用户没有进入目录的执行权限,即使子目录下的socket权限为777,也无法穿透上层目录访问。
  2. 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限制:

  1. 创建puma运行目录并赋权:
sudo mkdir /run/puma
sudo chown comtechmaster:comtechmaster /run/puma
  1. 修改Puma服务配置和Rails项目下的puma.rb配置,将socket路径改为unix:///run/puma/puma_master_cms_production.sock,重启Puma用户服务:
systemctl --user restart puma_master_cms_production
  1. 同步修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:36:01