Ошибка 502 при производственном развертывании Django и Nginx с помощью файла docker compose

Я использую docker-compose для создания контейнеров и обслуживания фронтенда моего сайта на https:// example.com и бэкенда на поддомене https:// api.example.com. SSL-сертификаты для корневого и поддомена работают правильно, и я могу получить доступ к живому сайту (статические файлы, обслуживаемые Nginx) по адресу https:// example.com, так что по крайней мере половина конфигурации работает правильно. Проблема возникает, когда фронтенд пытается связаться с бэкендом. Все вызовы встречаются с ошибкой 502 "No 'Access-Control-Allow-Origin'" в логах консоли. В журналах докер-контейнера вот такой ответ на ошибку.

Ошибка контейнера докера

 2022/03/09 19:01:21 [error] 30#30: *7 connect() failed (111: Connection refused) while connecting 
to upstream, client: xxx.xx.xxx.xxx, server: api.example.com, request: "GET /api/services/images/ 
HTTP/1.1", upstream: "http://127.0.0.1:8000/api/services/images/", 
host: "api.example.com", referrer: "https://example.com/" 

Скорее всего, что-то не так с моим Nginx или конфигурацией docker-compose. При установке SECURE_SSL_REDIRECT, SECURE_HSTS_INCLUDE_SUBDOMAINS и SECURE_HSTS_SECONDS на False или None (в настройках Django) я могу обратиться к http:// api.example.com:8000/api/services/images/ и получить данные, которые я ищу. Таким образом, он работает и подключен, просто не принимает запросы оттуда, откуда я хочу. Я приложил конфигурацию Nginx и docker-compose.yml. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, я буду очень признателен за любой вклад, и заранее спасибо за помощь.

Nginx-custom.conf


# Config for the frontend application under example.com
server {
  listen        80;
  server_name   example.com www.example.com;
  
  if ($host = www.example.com) {
      return 301 https://$host$request_uri;
  }

  if ($host = example.com) {
      return 301 https://$host$request_uri;
  }

  return 404;
}

server {
  server_name example.com www.example.com;
  index index.html index.htm;

  add_header Access-Control-Allow-Origin      $http_origin;
  add_header Access-Control-Allow-Credentials true;
  add_header Access-Control-Allow-Headers     $http_access_control_request_headers;
  add_header Access-Control-Allow-Methods     $http_access_control_request_method;

  location / {
    root /usr/share/nginx/html;
    try_files $uri /index.html =404;
  }

  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

# Config for the backend server at api.example.com 
server {
  listen 80;
  server_name  api.example.com;
  return 301 https://$host$request_uri;
}

server {
  server_name api.example.com;

  add_header Access-Control-Allow-Origin      $http_origin;
  add_header Access-Control-Allow-Credentials true;
  add_header Access-Control-Allow-Headers     $http_access_control_request_headers;
  add_header Access-Control-Allow-Methods     $http_access_control_request_method;

  location / {
    proxy_pass http://127.0.0.1:8000/; #API Server
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For    $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_redirect  off;
  }

  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Docker-Compose File

version: '3.9'

# services that make up the development env 
services:

  # DJANGO BACKEND
  backend:
    container_name: example-backend
    restart: unless-stopped
    image: example-backend:1.0.1
    build:
      context: ./backend/src
      dockerfile: Dockerfile 
    command: gunicorn example.wsgi:application --bind 0.0.0.0:8000
    ports:
      - 8000:8000
    environment:
      - SECRET_KEY=xxx
      - DEBUG=0
      - ALLOWED_HOSTS=example.com,api.example.com,xxx.xxx.xxx.x
      - DB_HOST=postgres-db                   
      - DB_NAME=xxx
      - DB_USER=xxx
      - DB_PASS=xxx
      - EMAIL_HOST_PASS=xxx

    # sets a dependency on the db container and there should be a network connection between the two 
    networks:
      - db-net
      - shared-network
    links:
      - postgres-db:postgres-db
    depends_on:
      - postgres-db
  
  # POSTGRES DATABASE
  postgres-db:
    container_name: postgres-db
    image: postgres
    restart: always
    volumes:
      - example-data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    environment:
      - POSTGRES_DB=exampledb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    networks:
      - db-net

  # ANGULAR & NGINX FRONTEND 
  frontend:
    container_name: example-frontend
    build:
      context: ./frontend
    ports:
      - "80:80"
      - "443:443"
    networks:
      - shared-network
    links:
      - backend 
    depends_on:
      - backend
 
networks:
  shared-network:
    driver: bridge
  db-net:
  
volumes:
  example-data:

Вернуться на верх