#mod-rewrite #docker-compose #traefik
Вопрос:
Я близок к настройке своего traefik с помощью docker-составьте, чтобы сделать следующее:
- Проложите
http://team1.example.com/api/lt;any pathgt;
маршрут к контейнеру api nodejs - Проложить
http://team1.example.com/lt;any path except apigt;
маршрут к веб-контейнеру
У меня просто возникли проблемы с тем, чтобы traefik перенаправлял запросы в мой контейнер api с помощью соответствующего rewritebase
.
Вот мои два файла docker compose, которые вы можете запустить:
# docker-compose.traefik.yml version: '3' services: traefik: image: traefik:v2.5.4 command: - "--providers.docker" - "--providers.docker.swarmMode=true" - "--providers.docker.exposedByDefault=false" ports: - 80:80 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: - mynet networks: mynet: external: true # docker-compose.yml version: '3' services: ui: image: johnlai2004/swarm-ui:latest deploy: labels: - "traefik.enable=true" - "traefik.http.routers.${STACK_NAME}_ui.rule=Host(`${APP_HOST}`) amp;amp; !PathPrefix(`/api{regex:$|/.*}`)" - "traefik.http.services.${STACK_NAME}_ui.loadbalancer.server.port=80" depends_on: - api networks: - mynet api: image: johnlai2004/swarm:latest environment: - "DB=${STACK_NAME}_db" deploy: labels: - "traefik.enable=true" - "traefik.frontend.rule=PathPrefixStrip(`/api`);" - "traefik.http.routers.${STACK_NAME}_api.rule=Host(`${APP_HOST}`) amp;amp; PathPrefix(`/api{regex:$|/.*}`)" - "traefik.http.services.${STACK_NAME}_api.loadbalancer.server.port=3000" depends_on: - db networks: - mynet db: image: mongo:4.0.3 networks: - mynet networks: mynet: external: true
Чтобы все было запущено и запущено, вы просто выполняете эти команды:
docker swarm init; docker network create --driver overlay mynet; docker stack deploy -c docker-compose.traefik.yml traefik; STACK_NAME=team1 APP_HOST=team1.example.com docker stack deploy -c docker-compose.yml team1; # Replace the value `team1.example.com` with the host of your server.
ПРОБЛЕМА: Когда я прихожу http://team1.example.com/api/subdir
, я получаю сообщение Cannot GET /api/subdir
. Мой контейнер api NodeJS обслуживает Cannot GET /api/subdir
. Проблема в том, что мне нужно сделать эквивалент Apache RewriteBase /api
, чтобы мой маршрутизатор NodeJS express работал должным образом. Маршрутизатор nodejs express ожидает /subdir
вместо /api/subdir
. Я попытался использовать traefik.frontend.rule=PathPrefixStrip(
/api );
, но это никак не повлияло на ситуацию
Кто-нибудь знает, как я могу обойти эту проблему?