对于 AWS ECS 部署,将 Nginx 放在 Node.js Docker 应用程序前面的正确方法是什么?

对于 AWS ECS 部署,将 Nginx 放在 Node.js Docker 应用程序前面的正确方法是什么?

我们有一个 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 直接提供服务。

对此实现有任何反馈吗?有没有更好的方法?

相关内容