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
相关产品推荐
相关产品推荐

