在Elastic Beanstalk部署SailsJS应用时静态文件404问题求助
我之前也踩过一模一样的坑!按照AWS Node.js教程把Sails应用部署到EB后,页面能正常渲染,但所有css、js、图片全报404,折腾了好一阵才搞定,给你分享几个亲测有效的解决办法:
方法一:用npm start启动并确保静态资源编译&路径配置正确
Sails默认依赖Express的静态中间件托管assets目录下的资源,但在EB环境里,经常因为工作目录、资源未编译或者启动命令不对导致路径识别失败。
先确认
package.json的启动脚本正确:
别用sails lift作为启动命令,EB的Node环境可能没法直接识别全局的sails命令,改成直接启动app.js:"scripts": { "start": "node app.js", "build": "sails build" }检查Sails的静态中间件配置:
打开config/http.js,确保www中间件(负责静态资源托管)在router之前,并且指向正确的编译后目录:module.exports.http = { middleware: { order: [ 'cookieParser', 'session', 'bodyParser', 'compress', 'poweredBy', '$custom', 'www', // 这个必须在router前面,不然请求先被路由处理了 'router', 'favicon', ], // 指向Sails编译后的静态资源目录 www: require('serve-static')('.tmp/public'), } };让EB部署时自动编译静态资源:
本地开发时我们会手动跑sails build把assets里的资源编译到.tmp/public,但EB部署时默认不会做这一步。创建.ebextensions/01_build_assets.config文件,添加部署前编译命令:container_commands: 01_build: command: "npm run build"这样EB在启动应用前会自动编译静态资源,确保
.tmp/public目录下有正确的文件。
方法二:配置EB的Nginx直接托管静态资源
如果第一种方法还是不行,可能是EB的Nginx反向代理没有正确转发静态资源请求。这时候可以直接让Nginx处理静态资源请求,不仅能解决404,还能提升性能。
创建.ebextensions/02_nginx_static.conf文件,添加Nginx配置:
files: "/etc/nginx/conf.d/elasticbeanstalk/00_static_files.conf": mode: "000644" owner: root group: root content: | # 匹配静态资源路径,直接指向编译后的目录 location /css/ { alias /var/app/current/.tmp/public/css/; expires 30d; # 开启缓存,提升加载速度 } location /js/ { alias /var/app/current/.tmp/public/js/; expires 30d; } location /images/ { alias /var/app/current/.tmp/public/images/; expires 30d; }
EB的Node环境默认用Nginx做反向代理,这个配置会让Nginx直接返回静态文件,不用经过Sails/Node进程,彻底解决404问题。
排查小技巧
如果还是有问题,登录EB实例看看日志:
- 查看Node应用日志:
tail -f /var/log/nodejs/nodejs.log,看看有没有静态资源加载的错误信息 - 查看Nginx访问日志:
tail -f /var/log/nginx/access.log,确认请求的路径是不是正确的 - 检查
.tmp/public目录:ls /var/app/current/.tmp/public,看看有没有编译后的静态文件,如果没有,说明sails build执行失败了
我当时用第一种方法就解决了,配合EB的自动编译,静态资源就正常加载了。如果第一种不行,试试第二种Nginx配置,应该能搞定!
内容的提问来源于stack exchange,提问作者Abe Fehr

