Конечные точки API Django 504 Timeout только при аутентификации

У меня есть сервер приложений (APP) и сервер API (API). Запросы к /api отправляются через proxy_pass на сервер API. Я могу получить доступ к конечной точке api, обратившись непосредственно к серверу API, или предпочтительным способом через сервер APP. Все работает, как ожидалось. Проблема возникает, как только я прохожу аутентификацию/логин в моем Django приложении. Когда я аутентифицируюсь и пытаюсь достичь конечной точки api через мой APP сервер, я получаю сообщение 504 Gateway Timeout. Это никак не связано с увеличением конфигурации таймаута, поскольку я могу достичь сервера API, когда я не вошел в систему.

  • Django 3.2.x
  • Python 3.9
  • Gunicorn
  • Nginx
  • APP и API сервер используют абсолютно одинаковую кодовую базу.

Смотрите конфигурацию Nginx ниже:

APP Server

server {
        server_name cr-prod-app.example.com;
        
        location ^~ /static {
                alias /home/www/app/static_prod;
        }       
        
        location / {
                proxy_pass http://unix:/home/www/app/cr.sock;
        }       
        
        location /api {
                proxy_pass              https://cr-prod-api.example.com/api;
                proxy_http_version      1.1;
                proxy_set_header        Upgrade $http_upgrade;
                proxy_set_header        Connection 'upgrade';
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_cache_bypass      $http_upgrade;
        }

        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/cr-prod-app.example.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/cr-prod-app.example.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        proxy_connect_timeout 1000s;
        proxy_read_timeout 1000s;
}

server {
        if ($host = cr-prod-app.example.com) {
                return 301 https://$host$request_uri;
        } # managed by Certbot
        listen       80;
        server_name  cr-prod-app.example.com;
        return 404; # managed by Certbot
}

API Server

upstream cr-prod-api {
                server unix:/home/www/app/cr.sock;
        }

server {
        server_name  cr-prod-api;

        location /api {
        proxy_pass              http://cr-prod-api/api;
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection 'upgrade';
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_cache_bypass      $http_upgrade;
        }


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

server {
        if ($host = cr-prod-api.example.com) {
                return 301 https://$host$request_uri;
        } # managed by Certbot


        server_name  cr-prod-api.example.com;
        listen 80;
        return 404; # managed by Certbot
}

Заранее спасибо за помощь!

Оказалось, что ответ был довольно прост: я забыл внести IP-адрес сервера API в белый список в конфигурации брандмауэра базы данных.

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