无法在Google Cloud Run部署Django应用,求Nginx+Gunicorn配置协助
问题分析
错误核心是Google Cloud Run要求容器监听PORT环境变量指定的端口(默认8080),现有配置存在以下关键问题:
- Nginx固定监听80端口,未匹配Cloud Run的端口要求
- Nginx配置中使用
http://web:8000是Docker Compose多服务的写法,单容器环境下无效 - 构建阶段未收集Django静态文件,导致静态资源无法访问
- 依赖本地Postgres容器,Cloud Run不支持多容器部署,需改用托管数据库
解决方案
1. 调整Nginx配置
修改nginx/default.conf,让Nginx监听PORT环境变量,并代理到本地Gunicorn:
server { listen ${PORT:-8080}; location /static/ { alias /usr/src/app/staticfiles/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
2. 更新Dockerfile
调整构建流程,收集静态文件并替换Nginx配置中的PORT变量:
# 基础镜像 FROM python:3.11.4-slim-buster # 工作目录 WORKDIR /usr/src/app # 环境变量配置 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # 安装依赖(包括Nginx) RUN apt-get update && apt-get install -y \ nginx \ && rm -rf /var/lib/apt/lists/* RUN pip install --upgrade pip COPY ./requirements.txt . RUN pip install -r requirements.txt # 复制项目文件 COPY . . # 收集Django静态文件 RUN python manage.py collectstatic --noinput # 替换Nginx配置中的PORT变量 COPY ./nginx/default.conf /etc/nginx/conf.d/ RUN envsubst '${PORT}' < /etc/nginx/conf.d/default.conf > /etc/nginx/conf.d/default.conf.tmp && mv /etc/nginx/conf.d/default.conf.tmp /etc/nginx/conf.d/default.conf # 暴露Cloud Run默认端口(会被PORT环境变量覆盖) EXPOSE 8080 # 启动Gunicorn和Nginx CMD ["/bin/bash", "-c", "gunicorn carszambia.wsgi:application --bind 127.0.0.1:8000 & nginx -g 'daemon off;'"]
3. 适配Cloud Run数据库
Cloud Run不支持本地容器化数据库,需改用Google Cloud SQL:
- 在
requirements.txt中添加dj-database-url - 修改Django
settings.py中的数据库配置:
import os import dj_database_url DATABASES = { 'default': dj_database_url.config( default=os.environ.get('DATABASE_URL'), conn_max_age=600, conn_health_checks=True, ) }
4. 本地测试与部署
本地测试
构建并运行容器,验证功能:
docker build -t carszambia . docker run -p 8080:8080 -e PORT=8080 -e DATABASE_URL="[你的测试数据库连接串]" carszambia
访问http://localhost:8080确认服务正常。
Cloud Run部署
推送镜像到Google Container Registry,然后部署:
# 构建并推送镜像 docker tag carszambia gcr.io/[你的GCP项目ID]/carszambia docker push gcr.io/[你的GCP项目ID]/carszambia # 部署到Cloud Run gcloud run deploy carszambia \ --image gcr.io/[你的GCP项目ID]/carszambia \ --platform managed \ --region [你的GCP区域] \ --allow-unauthenticated \ --set-env-vars DATABASE_URL="[你的Cloud SQL连接串]"
清理不必要文件
Cloud Run为单容器部署,以下文件无需保留:
docker-compose.ymlnginx/Dockerfile
内容的提问来源于stack exchange,提问作者Thapelo Chimfwembe
相关产品推荐
相关产品推荐

