Estou executando dois serviços (backend e API) na mesma porta dentro do Docker. No entanto, sempre que envio solicitações, o NGINX encaminha todas as solicitações para o serviço de backend, e não consigo acessar o serviço de API corretamente.
Suspeito que seja um problema com minha configuração do NGINX.
Aqui estão meus arquivos:
docker-compose.yml
version: '3.8'
services:
backend:
build:
context: .
dockerfile: ./backend/Dockerfile.dev
volumes:
- ./backend:/var/www/html/backend
environment:
- APP_ENV=development
networks:
- bysooq-network
expose:
- 9000
env_file:
- .env
api:
build:
context: .
dockerfile: ./api/Dockerfile.dev
volumes:
- ./api:/var/www/html/api
environment:
- APP_ENV=development
networks:
- bysooq-network
expose:
- 9000
env_file:
- .env
postgres:
image: postgres:13
restart: always
volumes:
- ~/bysooq-data/postgres:/var/lib/postgresql/data
environment:
POSTGRES_DB: xxx
POSTGRES_USER: xx
POSTGRES_PASSWORD: xxx
networks:
- bysooq-network
redis:
image: redis:latest
ports:
- "6380:6379"
restart: always
networks:
- bysooq-network
nginx:
image: nginx:latest
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./api:/var/www/html/api
- ./backend:/var/www/html/backend
ports:
- 80:80
depends_on:
- backend
- api
networks:
- bysooq-network
networks:
bysooq-network:
driver: bridge
nginx default.conf
nginx
server {
listen 80;
server_name localhost;
client_max_body_size 100M;
index index.php;
# API Service - Must come first with strict matching
location ~ ^/api(/.*)?$ {
root /var/www/html/api/web;
try_files $1 $1/ /index.php$is_args$args;
location ~ \.php$ {
fastcgi_pass api:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param REQUEST_URI $1$is_args$args;
}
}
# Backend Service
location / {
root /var/www/html/backend/web;
try_files $uri $uri/ /index.php$is_args$args;
location ~ \.php$ {
fastcgi_pass backend:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
O que eu espero:
Solicitações para /api/* devem ir para o serviço de API.
Outras solicitações devem ser encaminhadas para o serviço de backend.
O que acontece:
Todas as solicitações (mesmo /api/...) são tratadas pelo backend.
Pergunta: Como posso configurar corretamente o NGINX para rotear solicitações /api/* para o serviço de API e outras solicitações para o serviço de backend?
Desde já, obrigado!