最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用 Gunicorn + Nginx + Docker 將 Django 項目部署到云服務器

 更新時間:2026年05月18日 09:59:33   作者:IT策士  
本篇文章介紹了使用Gunicorn+Nginx+ocker器ginx三件套部署Dginx+Nginx+N開發(fā)服務器的全過程,本文結合實例給大家講解的非常詳細,感興趣的朋友跟隨小編一起看看吧

IT策士 10余年一線大廠經驗,專注 IT 思維、架構、職場進階。

在本地跑得好好的 Django,一上服務器就各種報錯?
環(huán)境不一致、依賴缺失、進程守護……傳統部署的坑數不勝數。
本文將帶你用 Gunicorn + Nginx + Docker 三件套,把 Django 項目絲滑地送上云服務器。
全程手摸手,有豐富的控制臺輸出與可復現的例子,新手能看懂,進階者也能收獲最佳實踐。

1. 先弄明白:這三者分別是什么?

  • Gunicorn:一個 WSGI HTTP 服務器,專為運行 Python Web 應用而生。相比 Django 自帶的 runserver,它支持多進程、更穩(wěn)定,是生產環(huán)境的標配。
  • Nginx:高性能的反向代理和靜態(tài)文件服務器。在這里它負責接收外界請求,動態(tài)內容轉發(fā)給 Gunicorn,靜態(tài)文件直接由自己返回,極大提升效率。
  • Docker:將應用及其依賴打包成容器,消除“我這能跑,你那不行”的環(huán)境差異問題。結合 Docker Compose 可以輕松編排多服務(Web + Nginx + 數據庫等)。

整體數據流:
用戶瀏覽器 -> 云服務器 80/443 端口 -> Nginx 容器 -> (動態(tài)請求) -> Gunicorn 容器 -> Django 應用

2. 預備一個示例 Django 項目

假設我們的項目名為 myblog,結構如下:

myblog/
├── manage.py
├── myblog/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── blog/                    # 一個簡單應用
│   ├── views.py
│   └── urls.py
├── requirements.txt
└── Dockerfile

快速創(chuàng)建一個最簡版本(實際操作時你可以用自己的項目):

django-admin startproject myblog
cd myblog
python manage.py startapp blog

blog/views.py 中加入一個簡單視圖:

from django.http import HttpResponse
def home(request):
    return HttpResponse("Hello, Django & Docker!")

myblog/urls.py 中注冊:

from django.contrib import admin
from django.urls import path
from blog.views import home
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'),
]

修改 settings.py,允許外部訪問(部署時務必改為具體域名或 IP):

ALLOWED_HOSTS = ['*']   # 僅測試用,生產環(huán)境請指定真實域名
STATIC_ROOT = BASE_DIR / 'staticfiles'   # 收集靜態(tài)文件的目錄

生成依賴文件:

pip freeze > requirements.txt

requirements.txt 內容示例:

Django==4.2
gunicorn==21.2.0

3. 手寫 Dockerfile:用 Gunicorn 啟動 Django

在項目根目錄創(chuàng)建 Dockerfile

# 使用官方 Python 鏡像(slim 版本更?。?
FROM python:3.11-slim
# 設置環(huán)境變量,避免 Python 生成 .pyc 文件,并開啟標準輸出
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 設置工作目錄
WORKDIR /app
# 安裝系統依賴(如果連接數據庫可能需要)
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc libpq-dev && \
    rm -rf /var/lib/apt/lists/*
# 復制并安裝 Python 依賴
COPY requirements.txt .
RUN pip install --upgrade pip && pip install -r requirements.txt
# 復制項目代碼
COPY . .
# 收集靜態(tài)文件
RUN python manage.py collectstatic --noinput
# 暴露 8000 端口(Gunicorn 默認監(jiān)聽)
EXPOSE 8000
# 啟動命令:使用 Gunicorn 運行 WSGI 應用
CMD ["gunicorn", "myblog.wsgi:application", "--bind", "0.0.0.0:8000"]

構建鏡像,你能看到類似下面的輸出:

$ docker build -t myblog:latest .
Sending build context to Docker daemon  45.06kB
Step 1/10 : FROM python:3.11-slim
 ---> a1b2c3d4e5f6
Step 2/10 : ENV PYTHONDONTWRITEBYTECODE=1
 ---> Running in 12ab34cd56ef
 ---> 7890abcd1234
...
Step 10/10 : CMD ["gunicorn", "myblog.wsgi:application", "--bind", "0.0.0.0:8000"]
 ---> Running in ef567890abcd
 ---> fedc09876543
Successfully built fedc09876543
Successfully tagged myblog:latest

跑起來試試:

$ docker run -d -p 8000:8000 --name myblog-test myblog:latest

查看容器日志,熟悉的 Gunicorn 啟動信息:

$ docker logs myblog-test
[2026-05-17 14:23:45 +0000] [1] [INFO] Starting gunicorn 21.2.0
[2026-05-17 14:23:45 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2026-05-17 14:23:45 +0000] [1] [INFO] Using worker: sync
[2026-05-17 14:23:45 +0000] [8] [INFO] Booting worker with pid: 8

瀏覽器訪問 http://localhost:8000,就能看到 Hello, Django & Docker!。
(停止并刪除測試容器:docker rm -f myblog-test

進階提示:可以通過 --workers 參數調整進程數,或通過環(huán)境變量 WEB_CONCURRENCY 動態(tài)設置,后面會提到。

4. 引入 Nginx:更貼近生產環(huán)境的編排

生產環(huán)境中,我們不會把 Gunicorn 直接暴露給用戶,而是前面再放一個 Nginx。
這里使用 Docker Compose 定義兩個服務,并用共享卷處理靜態(tài)文件。

4.1 Nginx 配置文件

在項目根目錄創(chuàng)建 nginx/nginx.conf

upstream myblog_app {
    # web 是 docker-compose 中 Django 服務的名稱
    server web:8000;
}
server {
    listen 80;
    server_name _;   # 用真實域名時替換
    # 靜態(tài)文件直接由 Nginx 提供
    location /static/ {
        alias /staticfiles/;
    }
    # 動態(tài)請求轉發(fā)給 Gunicorn
    location / {
        proxy_pass http://myblog_app;
        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;
    }
}

4.2 Docker Compose 編排文件

在項目根目錄創(chuàng)建 docker-compose.yml

version: '3.8'
services:
  web:
    build: .
    # 不直接暴露端口,僅內部使用
    expose:
      - "8000"
    volumes:
      - static_volume:/app/staticfiles   # 共享靜態(tài)文件卷
    environment:
      - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY:-change-me}
      - DEBUG=False
    command: gunicorn myblog.wsgi:application --bind 0.0.0.0:8000 --workers 3
    restart: unless-stopped
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - static_volume:/staticfiles:ro   # 只讀方式掛載靜態(tài)文件卷
    depends_on:
      - web
    restart: unless-stopped
volumes:
  static_volume:

新手理解

  • static_volume 是一個命名卷,web 服務運行 collectstatic 后靜態(tài)文件就存入其中。
  • Nginx 掛載同一個卷,直接向用戶提供 /static/ 下的文件,完全不經過 Django,速度飛快。

4.3 啟動編排,觀察日志

$ docker-compose up -d
Creating network "myblog_default" with the default driver
Creating volume "myblog_static_volume" with default driver
Creating myblog_web_1 ... done
Creating myblog_nginx_1 ... done

查看所有容器的狀態(tài):

$ docker-compose ps
     Name                   Command               State                  Ports
----------------------------------------------------------------------------------------------
myblog_nginx_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp
myblog_web_1     gunicorn myblog.wsgi:applic ...   Up      8000/tcp

看一下日志,確認兩個服務都正常:

$ docker-compose logs -f
# web 輸出:
web_1    | [2026-05-17 14:30:01 +0000] [1] [INFO] Starting gunicorn 21.2.0
web_1    | [2026-05-17 14:30:01 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
web_1    | [2026-05-17 14:30:01 +0000] [8] [INFO] Booting worker with pid: 8
web_1    | [2026-05-17 14:30:01 +0000] [9] [INFO] Booting worker with pid: 9
web_1    | [2026-05-17 14:30:01 +0000] [10] [INFO] Booting worker with pid: 10
# nginx 輸出:
nginx_1  | /docker-entrypoint.sh: Configuration complete; ready for start up

訪問 http://localhost(Nginx 的 80 端口),同樣得到 Hello, Django & Docker!。
靜態(tài)文件測試:訪問 http://localhost/static/admin/css/base.css 能看到 Django admin 的樣式,證明 Nginx 直接返回了靜態(tài)文件。

5. 部署到真實的云服務器

假設你有一臺 Ubuntu 22.04 的云服務器(阿里云、騰訊云、AWS 均可),并已通過 SSH 登錄。

5.1 服務器環(huán)境準備

# 更新包索引
sudo apt update
# 安裝 Docker
curl -fsSL https://get.docker.com | sudo sh
# 啟動 Docker 并設置開機自啟
sudo systemctl enable docker --now
# 安裝 Docker Compose(獨立插件方式)
sudo apt install docker-compose-plugin -y
# 驗證
docker --version
docker compose version

控制臺輸出示例:

$ docker --version
Docker version 24.0.7, build afdd53b
$ docker compose version
Docker Compose version v2.21.0

5.2 上傳項目代碼

推薦使用 Git 管理代碼:

# 在服務器上克隆項目(以 GitHub 為例)
cd /opt
git clone https://github.com/yourname/myblog.git
cd myblog

5.3 配置環(huán)境變量(重要)

創(chuàng)建 .env 文件存儲敏感信息,生產環(huán)境務必修改:

DJANGO_SECRET_KEY=你的超級長隨機字符串
DEBUG=False
ALLOWED_HOSTS=你的服務器IP或域名

并在 docker-compose.yml 中傳遞給 web 服務,同時修改 Gunicorn 命令引用環(huán)境變量:

web:
  ...
  environment:
    - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
    - DEBUG=${DEBUG:-False}
    - ALLOWED_HOSTS=${ALLOWED_HOSTS}
  command: >
    gunicorn myblog.wsgi:application
    --bind 0.0.0.0:8000
    --workers ${WEB_CONCURRENCY:-3}

對應的 settings.py 中讀取這些變量:

import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'fallback-key')
DEBUG = os.environ.get('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '*').split(',')

5.4 在服務器上啟動應用

$ docker compose up -d --build
[+] Building 23.4s (12/12) FINISHED
 => [internal] load build definition from Dockerfile               0.0s
 => => transferring dockerfile: 348B                               0.0s
 ...
[+] Running 3/3
 ? Network myblog_default          Created                         0.1s
 ? Container myblog-web-1          Started                         1.2s
 ? Container myblog-nginx-1        Started                         1.5s

檢查運行狀態(tài):

$ docker compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
myblog-nginx-1      "/docker-entrypoint.…"   nginx               running             0.0.0.0:80->80/tcp
myblog-web-1        "gunicorn myblog.wsgi…"  web                 running             8000/tcp

現在,在 云服務器的安全組 中開放 80 端口,用瀏覽器訪問服務器公網 IP,就能看到你的 Django 應用了!

6. 進階實戰(zhàn):加入 PostgreSQL 數據庫

SQLite 不適合生產,我們再加一個數據庫服務,完整演示多容器編排。

修改 docker-compose.yml,增加 db 服務:

services:
  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_DB=${DB_NAME:-myblog}
      - POSTGRES_USER=${DB_USER:-mybloguser}
      - POSTGRES_PASSWORD=${DB_PASSWORD:-securepassword}
    restart: unless-stopped
  web:
    build: .
    expose:
      - "8000"
    volumes:
      - static_volume:/app/staticfiles
    environment:
      - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
      - DEBUG=False
      - DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
    depends_on:
      - db
    command: >
      gunicorn myblog.wsgi:application
      --bind 0.0.0.0:8000
      --workers 3
    restart: unless-stopped
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - static_volume:/staticfiles:ro
    depends_on:
      - web
    restart: unless-stopped
volumes:
  postgres_data:
  static_volume:

.env 中增加:

DB_NAME=myblog
DB_USER=mybloguser
DB_PASSWORD=你的復雜密碼

在 Django 的 settings.py 使用 dj-database-url 解析數據庫連接(需加入 requirements.txt):

import dj_database_url
DATABASES = {
    'default': dj_database_url.config(
        default=os.environ.get('DATABASE_URL', 'sqlite:///db.sqlite3')
    )
}

重新構建并啟動:

$ docker compose up -d --build
Creating myblog_db_1 ... done
Creating myblog_web_1 ... done
Creating myblog_nginx_1 ... done

查看數據庫容器日志:

$ docker compose logs db
db_1  | 2026-05-17 14:45:00.123 UTC [1] LOG:  database system is ready to accept connections

執(zhí)行數據庫遷移:

$ docker compose exec web python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  ...

完美!現在你的 Django 應用已經連接上了生產級 PostgreSQL。

7. 更進一步:HTTPS、CI/CD 等最佳實踐(簡覽)

7.1 開啟 HTTPS

可以在 Nginx 容器內配置 SSL,最簡單的方法是使用 certbot 及其 Nginx 插件,但容器化環(huán)境下推薦使用 Certbot 官方鏡像Traefik。這里給出一個手動整合 Certbot 的思路:

  • 先以 HTTP 啟動,通過 certbot 獲取證書,映射到宿主機的證書目錄。
  • 修改 Nginx 配置監(jiān)聽 443,證書路徑指向掛載的文件。
  • 使用 docker compose exec nginx nginx -s reload 熱重載。

關鍵 Nginx SSL 配置片段

server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ...
}

7.2 使用 CI/CD 自動部署

例如 GitHub Actions 工作流,在推送代碼后自動構建鏡像并部署到服務器:

- name: Deploy to Server
  uses: appleboy/ssh-action@v1.0
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    script: |
      cd /opt/myblog
      git pull
      docker compose up -d --build

7.3 性能與監(jiān)控

  • Worker 數量:建議 (2 * CPU核心數) + 1,可通過 WEB_CONCURRENCY 環(huán)境變量調整。
  • 日志docker compose logs -f 實時查看,生產環(huán)境建議接入 ELK 或 Loki。
  • 健康檢查:在 docker-compose.yml 中為 web 服務添加 healthcheck,配合 depends_on 條件使用 condition: service_healthy。

8. 常見問題快速排查

9. 總結

通過這篇長文,我們從零開始,經歷了:

  • 創(chuàng)建一個簡單的 Django 項目
  • 用 Dockerfile 將其容器化,并用 Gunicorn 啟動
  • 用 Docker Compose 編排 Nginx + Gunicorn,處理靜態(tài)文件
  • 部署到云服務器并連接 PostgreSQL
  • 探索了 HTTPS、CI/CD 等進階方向

Gunicorn + Nginx + Docker 這套組合已經成為 Django 生產部署的事實標準。它隔離環(huán)境、簡化運維、易于擴展,無論是個人項目還是企業(yè)級應用都能游刃有余。
希望這篇文章能幫你跨過從開發(fā)到上線的鴻溝,享受流暢的部署體驗。

到此這篇關于如何使用 Gunicorn + Nginx + Docker 將 Django 項目部署到云服務器的文章就介紹到這了,更多相關Gunicorn Nginx Docker Django 項目云服務器部署內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • centos8安裝docker(containerd.io與podman-manpages問題解決)及鏡像加速詳解

    centos8安裝docker(containerd.io與podman-manpages問題解決)及鏡像加速詳解

    在CentOS 8中安裝Docker需先安裝VirtualBox,root用戶執(zhí)行卸載舊版、安裝基礎包、設置倉庫、安裝Docker Engine-Community及containerd.io,解決包沖突后配置阿里云鏡像加速器,最后運行hello-world測試
    2025-09-09
  • Docker容器環(huán)境變量設置與查看方式

    Docker容器環(huán)境變量設置與查看方式

    本文講解了Dockerfile中使用ENV設置環(huán)境變量,通過docker run和docker inspect查看方法,以及容器內Shell腳本的應用方式,涵蓋環(huán)境變量配置與調用的多種實踐
    2025-07-07
  • 使用Docker運行Microsoft SQL Server 2017的方法

    使用Docker運行Microsoft SQL Server 2017的方法

    本篇文章主要介紹了使用Docker運行Microsoft SQL Server 2017的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 基于docker部署Oracle?19c的詳細記錄

    基于docker部署Oracle?19c的詳細記錄

    這篇文章主要介紹了基于docker部署Oracle?19c,包括拉取oracle?19c鏡像、查看鏡像及創(chuàng)建oracle?19c鏡像的容器問題,結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Docker 部署Django項目的方法示例

    Docker 部署Django項目的方法示例

    這篇文章主要介紹了Docker 部署Django項目的方法示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Docker中安裝ElasticSearch+Kibana+Logstash(ELK)實踐記錄

    Docker中安裝ElasticSearch+Kibana+Logstash(ELK)實踐記錄

    文章介紹了如何使用Docker在本地安裝和配置Elasticsearch、Kibana和Logstash(ELK堆棧),本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-03-03
  • 一步步詳解如何在Ubuntu?18.04上安裝Docker

    一步步詳解如何在Ubuntu?18.04上安裝Docker

    Docker是基于Go語言實現的云開源項目,下面這篇文章主要給大家介紹了關于如何在Ubuntu?18.04上安裝Docker的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • docker-compose編排單體nacos、rabbitmq、redis基礎服務詳解

    docker-compose編排單體nacos、rabbitmq、redis基礎服務詳解

    這篇文章主要介紹了docker-compose編排單體nacos、rabbitmq、redis基礎服務,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Docker網絡之部署redis集群方式

    Docker網絡之部署redis集群方式

    文章介紹了如何部署和測試Redis集群,包括創(chuàng)建配置文件、啟動容器、查看集群信息以及模擬節(jié)點故障進行測試
    2025-01-01
  • 教你使用docker查看運行中的容器

    教你使用docker查看運行中的容器

    這篇文章主要介紹了使用docker查看運行中的容器,本文內容簡單給大家講解的很明白,對docker查看運行的容器相關知識感興趣的朋友一起看看吧
    2022-04-04

最新評論

奉节县| 修水县| 盱眙县| 鄄城县| 新沂市| 西昌市| 邮箱| 阳春市| 霍州市| 新建县| 竹北市| 万安县| 上高县| 临桂县| 青铜峡市| 洛隆县| 玉田县| 屏东市| 德清县| 长葛市| 皋兰县| 绿春县| 贵州省| 攀枝花市| 承德市| 华池县| 正安县| 儋州市| 浦江县| 武清区| 泽州县| 布拖县| 巴林右旗| 灌南县| 台湾省| 邹城市| 正镶白旗| 介休市| 通江县| 上虞市| 清远市|