У нас есть приложение 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 для этих ресурсов.
а) Как лучше всего достичь этой цели?
б) я думал об использовании volumes
, но в контексте ECS, если мы сделаем это и развернем несколько контейнеров на одном хосте AWS (например, несколько копий Node, контейнеров Nginx, работающих в одном экземпляре EC2), это вызовет проблемы, поскольку все они пытаются смонтировать тот же каталог в файловой системе?
Мы будем очень благодарны за любые рекомендации, поскольку мы не смогли найти какой-либо передовой подход к тому, как справиться с этой ситуацией. Спасибо.
Если это полезно для кого-то еще, вот решение, на которое мы сейчас остановились ...
Настроить docker-compose.yml
с дополнительным контейнером 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:
Затем настройте Nginx default.conf
для псевдонима запросов к / static к этому тому:
location /static {
alias /var/lib/assets;
try_files $uri $uri/ =404;
}
Это позволяет избежать использования proxy_pass для Node.js для получения статических ресурсов, которые теперь могут обслуживаться непосредственно Nginx.
Есть ли отзывы об этой реализации? Есть лучший способ сделать это?