React Django Application разные ip-адреса проблемы CORS

Я пытаюсь развернуть приложение APP1 на EC2 (IP-адрес которого app1_ip): фронтенд создан с помощью React, а бэкенд - с помощью Django, django-rest-framework, gunicorn и nginx. Бэкенд такой же, как и другое приложение APP2, которое уже развернуто на втором EC2 (IP-адрес которого app2_ip).

У меня нет проблем с тем, чтобы заставить второе приложение работать и запрашивать его React frontend (расположенный на порту 3000 из app2_ip) на его backend (расположенный на порту 8000 из app2_ip). С другой стороны, у меня много проблем с запросом бэкенда APP2 с фронтенда APP1. Я что-то упускаю, но не могу понять что.

Я хочу разработать максимально чистую конфигурацию производства.

У меня есть страница входа, на которой пользователю предлагается ввести пароль и имя пользователя. Затем отправляется запрос на внутренний сервер для проверки этих учетных данных.

  • Получение запроса со страницы входа в систему, используемой в развертывании бэкенда APP1 :
fetch(`https://{app2_ip}/token-auth/`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(data)
            })
  • nginx.conf файл, используемый в APP2 развертывании бэкенда
upstream django {
    server backend:8000;
}

server {
    listen 80;
    server_name my_server_name
    return 301 https://{my_server_name}$request_uri;
}

server {

    listen 443 ssl;
    server_name ssl.my_server_name;
    client_max_body_size 20G;

    ssl_certificate     /etc/nginx/certs/test.crt;
    ssl_certificate_key /etc/nginx/certs/test.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        proxy_pass http://django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_ignore_client_abort on;

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, PUT, OPTIONS, POST, DELETE' always;
        add_header 'Referrer-Policy' 'strict-origin-when-cross-origin' always;


        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-Amz-Date';
            add_header 'Access-Control-Max-Age' 86400;
            add_header 'Content-Type' 'text/html; charset=utf-8';
            add_header 'Content-Length' 0;
            return 204;
        }
        if ($request_method = 'PUT') {
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-Amz-Date';
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        }
        if ($request_method = 'POST') {
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-Amz-Date';
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        }
        if ($request_method = 'GET') {
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-Amz-Date';
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        }

    }

}
  • docker-compose.yml файл, используемый в APP2 развертывании
  • .
services:

  backend:
    container_name: backend
    build:
      context: .
      dockerfile: ./django/Dockerfile
    command: gunicorn my_application_name.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - '.:/usr/src/'
    expose:
      - 8000
    stdin_open: true

  frontend:
    container_name: frontend
    build:
      context: .
      dockerfile: ./react/Dockerfile
    volumes:
      - '.:/app'
      - '/app/node_modules'
    ports:
      - 3000:3000

  nginx:
    build:
      context: .
      dockerfile: ./nginx/Dockerfile
    ports:
      - 1337:80
      - 443:443
    depends_on:
      - backend

Если у вас есть идеи, которые могут мне помочь, пожалуйста, не стесняйтесь поделиться ими. При необходимости я могу предоставить больше информации об используемых конфигурациях.

EDIT: Еще одно странное поведение :

  • когда я подключаюсь к фронтенду APP1, ничего не делая перед этим, я получаю ошибку, описанную выше;
  • когда я подключаюсь к фронтенду APP2, отключаюсь и затем подключаюсь к фронтенду APP1, я не получаю ошибку и все работает...
Вернуться на верх