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

Ubuntu Rails生产服务器权限拒绝:Rails服务器无法编辑文件

解决Spree 4.3.2 + Mina部署下Rails缓存文件权限拒绝问题

问题根源

你碰到的Permission denied @ rb_file_s_rename错误,本质是Rails进程在重命名临时缓存文件时没有对应权限。大概率是Mina部署用户和Rails应用服务器(如Puma)的运行用户不一致,或是部署过程中tmp/cache目录的权限未被正确配置,导致手动执行chown/chmod仅能临时生效,下次部署后权限又被重置。

具体解决方案

1. 统一部署与运行用户

确保Mina部署使用的用户和Rails应用服务器的运行用户为同一个(比如都用deploy用户):

  • 检查Puma/Unicorn等应用服务器的配置文件,确认运行用户设置为deploy
  • 查看Mina的config/deploy.rb,确保set :user, 'deploy'已正确配置,所有部署操作都以该用户执行

2. 在Mina部署脚本中自动修正权限

修改config/deploy.rb,添加部署后自动修正权限的任务,避免每次手动操作:

task :fix_permissions do
  command %{chown -R deploy:deploy /var/www/appname/current/tmp}
  command %{chmod -R 755 /var/www/appname/current/tmp}
end

after :deploy, :fix_permissions

该任务会在每次部署完成后,自动将current/tmp目录的归属改为deploy用户/组,并设置合理的读写权限。

3. 配置应用服务器的umask

如果Rails进程生成的临时文件权限过严,可在应用服务器配置中设置umask,让同组用户拥有操作权限:
在config/puma.rb中添加:

umask 002

设置后,新创建的文件权限为664,目录权限为775,同组用户可正常读写。

4. 修正共享目录权限

Mina部署中current/tmp通常是指向shared/tmp的符号链接,需确保共享目录权限正确:

chown -R deploy:deploy /var/www/appname/shared/tmp
chmod -R 775 /var/www/appname/shared/tmp

缓存文件最终会写入共享目录,这里的权限配置错误会导致每次部署后权限问题复发。

验证方式

部署完成后,执行以下命令确认权限配置:

ls -ld /var/www/appname/current/tmp/cache
ls -l /var/www/appname/current/tmp/cache/.spree*

确保文件和目录的所有者为Rails运行用户,且权限允许该用户进行读写操作。

内容的提问来源于stack exchange,提问作者John Coday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:02:18