Rails5+Unicorn+NGINX静态资源加载失败:权限拒接或文件缺失
解决Rails 5 + Unicorn + Nginx环境下JS/CSS资源加载失败的问题
看起来你遇到的问题核心是权限配置不合理和静态资产预编译不完整,咱们一步步拆解解决:
1. 不要用root运行Nginx(安全+权限双重问题)
你之前把Nginx用户改成root虽然暂时绕开了权限报错,但root目录(/root/app_name)默认权限是700,其他用户根本没法访问,而且用root运行Nginx存在严重安全隐患。咱们把用户改回www-data,同时修复目录权限:
- 改回
nginx.config里的运行用户:user www-data; # 放弃root,用标准Web用户 - 把Rails应用移到Web应用的标准目录(比如
/var/www),避免root目录的权限限制:sudo mv /root/app_name /var/www/ - 给
www-data赋予应用目录的所有权:sudo chown -R www-data:www-data /var/www/app_name - 确保静态文件目录的权限正确:
sudo chmod -R 755 /var/www/app_name/public
2. 完成生产环境静态资产预编译
单独运行Unicorn正常,但Nginx直接访问assets时找不到文件,大概率是你没在生产环境预编译静态资源:
- 切换到应用目录,执行预编译命令:
cd /var/www/app_name RAILS_ENV=production bundle exec rake assets:precompile - 预编译完成后,检查
public/assets目录下是否存在Nginx请求的文件(比如gmaps/objects/base_builder.self-xxxx.js),如果缺失,查看终端输出的编译错误(比如依赖缺失、语法问题)。
3. 修正Nginx站点配置的路径
更新sites-enabled/domain里的root路径,对应新的应用目录:
server { listen 80 default deferred; server_name DOMAIN; root /var/www/app_name/public; # 替换为新的应用public目录路径 location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; } # 其余配置保持不变... }
4. 重启服务生效
完成所有配置后,重启Nginx和Unicorn让修改生效:
sudo systemctl restart nginx # 根据你的Unicorn管理方式重启,比如用systemd的话: sudo systemctl restart unicorn_app_name
问题根源复盘
- 第一个权限错误:
www-data用户没有权限访问/root目录(默认权限700),导致Nginx无法读取静态资产。 - 第二个文件找不到错误:即使切换到root用户,未预编译的生产环境资产不存在,加上root目录的权限限制,依然无法访问。
- 单独Unicorn正常:因为Unicorn直接运行Rails应用,开发环境下会动态处理资产,但生产环境必须用预编译后的静态文件,由Nginx直接访问才是正确流程。
内容的提问来源于stack exchange,提问作者Jun Dalisay
相关产品推荐
相关产品推荐

