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' }, )
可能的解决方向
Docker网络配置调整
- 在docker-compose.yml的
django_app服务中添加DNS配置,指定公共DNS服务器:django_app: # ...其他配置 dns: 8.8.8.8 - 测试时可临时切换为host网络模式(不推荐生产环境):
django_app: # ...其他配置 network_mode: host ports: [] # 移除端口映射
- 在docker-compose.yml的
检查防火墙/安全组
- 确认Ubuntu VPS的ufw防火墙未拦截容器出站流量,执行
ufw allow out 80/tcp和ufw allow out 443/tcp - 检查云服务商安全组规则,确保出站80、443端口未被限制
- 确认Ubuntu VPS的ufw防火墙未拦截容器出站流量,执行
容器内直接测试请求
进入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"}'切换请求协议为HTTPS
将请求URL改为https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address,避免HTTP协议可能的跳转或拦截问题
内容的提问来源于stack exchange,提问作者user23354933
相关产品推荐
相关产品推荐

