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

无法在Google Cloud Run部署Django应用,求Nginx+Gunicorn配置协助

问题分析

错误核心是Google Cloud Run要求容器监听PORT环境变量指定的端口(默认8080),现有配置存在以下关键问题:

  1. Nginx固定监听80端口,未匹配Cloud Run的端口要求
  2. Nginx配置中使用http://web:8000是Docker Compose多服务的写法,单容器环境下无效
  3. 构建阶段未收集Django静态文件,导致静态资源无法访问
  4. 依赖本地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
  • 修改Djangosettings.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.yml
  • nginx/Dockerfile

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:14:57