Конечные точки 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 в белый список в конфигурации брандмауэра базы данных.