DigitalOcean环境下Rails生产模式资源加载失败问题
Rails生产模式下Nginx无法加载存在的静态资源问题排查
这问题我之前帮朋友排查过一模一样的——文件明明躺在assets目录里,但Nginx就是说找不到,大概率是权限、配置或者环境层面的问题,咱们一步步来解决:
1. 优先排查Nginx进程的文件权限
Nginx默认以www-data用户运行,如果这个用户没有读取你的/home/deploy/my-app/public/assets目录及文件的权限,就算文件存在也访问不了。
- 先确认Nginx的运行用户:
输出里第一列就是运行用户,通常是ps aux | grep nginxwww-data。 - 给assets目录设置正确的权限:
这里sudo chown -R deploy:www-data /home/deploy/my-app/public/assets sudo chmod -R 755 /home/deploy/my-app/public/assetsdeploy是你的部署用户,根据实际情况替换,确保Nginx用户有读取权限。
2. 检查Nginx配置中的Root路径是否正确
很多人会犯的错误:Nginx配置里的root指向了项目根目录,而不是Rails的public目录。这样Nginx找/assets/xxx.css时,会去/home/deploy/my-app/assets/xxx.css找,而不是正确的public/assets目录。
- 打开你的Nginx站点配置文件(通常在
/etc/nginx/sites-available/your-app.conf):server { listen 80; server_name yourselforderfood.com; root /home/deploy/my-app/public; # 必须指向public文件夹! passenger_enabled on; rails_env production; # 其他配置... } - 改完后重启Nginx生效:
sudo systemctl restart nginx
3. 重新执行生产环境的资产预编译
有时候预编译是在开发环境执行的,导致生成的资产指纹和生产环境页面请求的不匹配(虽然你说文件存在,但也有可能是预编译时的环境变量不对)。
- 进入项目目录,重新预编译:
cd /home/deploy/my-app RAILS_ENV=production bundle exec rake assets:precompile - 预编译完成后,重启Rails应用让变更生效:
sudo touch tmp/restart.txt
4. 排查SELinux限制(如果你的服务器开启了SELinux)
部分Linux发行版默认开启SELinux,它会限制Nginx访问用户家目录下的文件,即使权限设置正确也没用。
- 先检查SELinux状态:
如果输出里sestatusCurrent mode是enforcing,说明SELinux在生效。 - 临时关闭SELinux测试:
如果问题解决了,再设置永久允许Nginx访问该目录:sudo setenforce 0sudo semanage fcontext -a -t httpd_sys_content_t "/home/deploy/my-app/public/assets(/.*)?" sudo restorecon -Rv /home/deploy/my-app/public/assets
一般来说,前两个原因是最常见的,先从权限和Nginx配置查起,应该能快速解决问题。
内容的提问来源于stack exchange,提问作者Bistaff
相关产品推荐
相关产品推荐

