You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu VPS下Docker-Compose部署Django+Nginx出站请求超时问题

Docker-Compose部署Django+Nginx后远程API请求超时问题

情况说明

在Ubuntu VPS主机上通过docker-compose部署Django和Nginx服务,Nginx监听80和443端口,项目可通过域名正常访问并自动重定向至HTTPS。

问题描述

Django服务中调用远程API的端点无法正常工作,发送请求后持续出现等待超时。

相关配置

nginx.conf

user  nginx;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    upstream app {
        server backend:8000;
    }
    server {
    listen 80;
    server_name eternitydigital.ru;
    return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
        server_name eternitydigital.ru;

        ssl_certificate /etc/nginx/ssl/certs/cert.crt;
        ssl_certificate_key /etc/nginx/ssl/private/private.key;

        location / {
            proxy_pass http://backend:8000;
        }
    }
}

Nginx的Dockerfile

FROM nginx:1.10.2

COPY nginx.conf /etc/nginx/nginx.conf

CMD ["nginx", "-g", "daemon off;"]

docker-compose.yml

version: '3.4'

services:
  django_app:
    build: ./django
    ports:
      - "8000:8000"
    image: backend
    container_name: backend

  nginx:
    build: ./nginx
    volumes:
      - ./nginx/ssl/cert.crt:/etc/nginx/ssl/certs/cert.crt
      - ./nginx/ssl/private/private.key:/etc/nginx/ssl/private/private.key
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - django_app
    image: nginx
    container_name: nginx

注:初始配置更复杂,因2天未解决问题已精简至当前版本。

Django的Dockerfile

FROM python:3.11.7-slim-bullseye
RUN pip install --upgrade pip

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /app

COPY . /app

RUN pip install -r /app/requirements.txt

EXPOSE 8000

CMD python manage.py migrate --noinput && python manage.py loaddata initial_data && gunicorn -b 0.0.0.0:8000 E_Service.wsgi:application

排查结果

  • 直接在VPS主机系统中用curl调用目标远程API,请求和响应均正常
  • 在Windows环境中部署相同的docker-compose配置,所有API端点工作正常
  • 若在VPS主机上不通过docker-compose,直接部署Django服务,所有功能正常

出错请求示例

response = requests.post(
          
'http://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address',
            headers={
                'Content-Type': 'application/json',
                'Accept': 'application/json',
                'Authorization': 'Token ' + ADDRESS_HINTS_API_TOKEN,
            }, 
            json={
                'query': query,
                "locations": [{ "country": "Россия" }],
                'count': '8'
            },
        )

可能的解决方向

  1. Docker网络配置调整

    • 在docker-compose.yml的django_app服务中添加DNS配置,指定公共DNS服务器:
      django_app:
        # ...其他配置
        dns: 8.8.8.8
      
    • 测试时可临时切换为host网络模式(不推荐生产环境):
      django_app:
        # ...其他配置
        network_mode: host
        ports: []  # 移除端口映射
      
  2. 检查防火墙/安全组

    • 确认Ubuntu VPS的ufw防火墙未拦截容器出站流量,执行ufw allow out 80/tcp和ufw allow out 443/tcp
    • 检查云服务商安全组规则,确保出站80、443端口未被限制
  3. 容器内直接测试请求
    进入Django容器手动调用API,查看具体错误:

    docker exec -it backend curl -v http://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address \
    -H "Authorization: Token YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"query":"test","locations":[{"country":"Россия"}],"count":"8"}'
    
  4. 切换请求协议为HTTPS
    将请求URL改为https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address,避免HTTP协议可能的跳转或拦截问题

内容的提问来源于stack exchange,提问作者user23354933

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:12:32