我们有一个 Node.js/Express 应用程序,它作为 Docker 容器部署到 AWS ECS 中。此应用程序有一些静态资源(CSS、JS),出于性能原因,我希望对这些资产的请求绕过 Node.js 并直接由 Nginx 提供服务。
目前我们已经通过docker-compose启动了一个Nginx容器,并且Nginx配置了proxy_pass规则,用于从Node容器中代理和缓存静态资源,如下所示:
location /static {
proxy_cache STATIC;
proxy_pass http://nodejs;
}
这种方法的问题在于,任何静态资产的第一个请求仍然由 Node.js 提供服务,并且只有然后由 Nginx 缓存。
我希望完全绕过 Node.js 来获取这些资产。
a) 有什么更好的方法可以实现这个目标?
b) 我考虑过使用volumes
,但是在 ECS 环境中,如果我们这样做并将多个容器全部部署到同一个 AWS 主机(例如,在同一个 EC2 实例中运行的 Node、Nginx 容器的多个副本),这是否会导致问题,因为它们都试图在文件系统中挂载同一个目录?
任何指导都将不胜感激,因为我们还没有找到处理这种情况的最佳实践方法。谢谢。
答案1
如果它对其他人有帮助,以下是我们目前找到的解决方案......
docker-compose.yml
使用带有静态资产共享卷的 sidecar Nginx 容器进行配置,如下所示:
version: '3'
services:
nodejs:
build: ./
volumes:
- asset-volume:/opt/nodejs_app/static
nginx:
build: ./nginx
ports:
- 80:80
volumes:
- asset-volume:/var/lib/assets:ro
volumes:
asset-volume:
然后,配置 Nginxdefault.conf
将对 /static 的请求别名到此卷:
location /static {
alias /var/lib/assets;
try_files $uri $uri/ =404;
}
这避免了必须对 Node.js 执行 proxy_pass 来检索静态资产,现在可以由 Nginx 直接提供服务。
对此实现有任何反馈吗?有没有更好的方法?