Django 網站簡介與 Gunicorn + Nginx 部署教材

從 Django 的基本概念、專案建立、應用程式結構,到使用 Gunicorn 與 Nginx 進行正式部署的完整教學。

適合 Web 程式設計、伺服器部署、IoT Web 後台與專題實作課程。

Django Python Web Gunicorn Nginx 部署

一、教學目標

  • 理解 Django 是什麼,以及它適合解決什麼問題
  • 學會建立 Django 專案與 app
  • 理解 URL、View、Template、Model 的角色
  • 學會在開發環境執行 Django
  • 學會在伺服器上使用 Gunicorn + Nginx 部署 Django

二、Django 簡介

  • Django 是 Python 的高階 Web Framework
  • 適合快速開發資料庫導向網站
  • 內建管理後台、ORM、表單、路由、使用者驗證
  • 非常適合做管理平台、專題網站、IoT 後台系統
如果 Flask 比較像輕量工具箱,Django 則比較像功能完整的工程平台。

三、Django 的基本架構

元件 用途
URL定義網址路徑與對應的處理函式
View接收請求並回傳結果
TemplateHTML 模板,用來顯示畫面
Model資料庫模型,定義資料表結構
Admin內建後台管理介面

四、安裝 Django 與建立專案

1. 安裝 Python 與虛擬環境工具

sudo apt update
sudo apt install -y python3 python3-pip python3-venv

2. 建立專案目錄

mkdir -p ~/django_projects
cd ~/django_projects

3. 建立虛擬環境

python3 -m venv venv
source venv/bin/activate

4. 安裝 Django 與 Gunicorn

pip install django gunicorn

5. 建立 Django 專案

django-admin startproject mysite
cd mysite

6. 啟動開發伺服器

python manage.py runserver 0.0.0.0:8000

瀏覽器測試:

http://伺服器IP:8000

五、Django 專案目錄說明

mysite/
├── manage.py
├── mysite/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py

六、建立第一個 app

python manage.py startapp mainapp

新增到 settings.py

INSTALLED_APPS = [
    ...
    'mainapp',
]

建立 View

# mainapp/views.py
from django.http import HttpResponse


def home(request):
    return HttpResponse("Hello Django")

建立 app 的 urls.py

# mainapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]

在專案 urls.py 掛載

# mysite/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('mainapp.urls')),
]

七、Template 基本用法

1. 建立 templates 資料夾

mkdir -p mainapp/templates/mainapp

2. 建立首頁模板

<!-- mainapp/templates/mainapp/index.html -->
<h1>Welcome to Django</h1>
<p>這是我的第一個 Django 網站</p>

3. 修改 View

from django.shortcuts import render


def home(request):
    return render(request, 'mainapp/index.html')

八、Model 與資料庫基本概念

Django 預設可使用 SQLite,非常適合教學起步。

範例 Model

# mainapp/models.py
from django.db import models

class SensorData(models.Model):
    device_name = models.CharField(max_length=50)
    temperature = models.FloatField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.device_name

建立 migration 與套用

python manage.py makemigrations
python manage.py migrate

九、建立管理者帳號

python manage.py createsuperuser

完成後可登入:

http://伺服器IP:8000/admin

如果要讓模型出現在 admin

# mainapp/admin.py
from django.contrib import admin
from .models import SensorData

admin.site.register(SensorData)

十、開發環境與正式部署的差異

項目 開發模式 正式部署
伺服器runserverGunicorn
前端代理Nginx
除錯模式DEBUG=TrueDEBUG=False
靜態檔案Django 處理Nginx 處理
安全性較低較完整
正式環境絕對不要直接使用 python manage.py runserver 對外提供服務。

十一、正式部署前的設定

1. 修改 settings.py

DEBUG = False
ALLOWED_HOSTS = ['192.168.1.120', 'localhost', '127.0.0.1']

2. 設定靜態檔案位置

import os
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

3. 收集靜態檔案

python manage.py collectstatic

4. 測試 Gunicorn

gunicorn --bind 0.0.0.0:8000 mysite.wsgi:application

十二、安裝 Nginx

sudo apt install -y nginx

啟動與開機自動執行

sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx

十三、建立 Gunicorn systemd 服務

這一步很重要,讓 Gunicorn 可以像正式服務一樣由 systemd 管理。

建立 service 檔案

sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon for Django project
After=network.target

[Service]
User=minhuang
Group=www-data
WorkingDirectory=/home/minhuang/django_projects/mysite
ExecStart=/home/minhuang/django_projects/venv/bin/gunicorn \
          --workers 3 \
          --bind unix:/home/minhuang/django_projects/mysite/gunicorn.sock \
          mysite.wsgi:application

[Install]
WantedBy=multi-user.target

重新載入與啟動

sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn

十四、設定 Nginx 反向代理 Django

建立站台設定檔

sudo nano /etc/nginx/sites-available/mysite
server {
    listen 80;
    server_name 192.168.1.120;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /home/minhuang/django_projects/mysite;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/minhuang/django_projects/mysite/gunicorn.sock;
    }
}

啟用站台

sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

十五、檢查部署是否成功

  1. 確認 Gunicorn 正常執行
  2. 確認 Nginx 語法正確
  3. 瀏覽器開啟伺服器 IP
sudo systemctl status gunicorn
sudo systemctl status nginx
curl http://127.0.0.1

十六、常見問題與除錯方式

問題 可能原因 解法
502 Bad GatewayGunicorn 沒有正常啟動檢查 systemctl status gunicorn
靜態檔案無法載入STATIC_ROOT 或 Nginx 路徑錯誤重新檢查 collectstatic 與 Nginx 設定
DisallowedHostALLOWED_HOSTS 未加入 IP 或網域修改 settings.py
Permission deniedsocket 或目錄權限錯誤檢查 User、Group 與路徑權限
ModuleNotFoundError虛擬環境或套件安裝錯誤確認 Gunicorn 使用的 Python 路徑

十七、實際部署流程整理

  1. 安裝 Python、venv、pip
  2. 建立 Django 專案
  3. 設定 DEBUG=FalseALLOWED_HOSTS
  4. 安裝 Gunicorn
  5. 執行 collectstatic
  6. 建立 Gunicorn systemd 服務
  7. 安裝與設定 Nginx
  8. 重新啟動服務並測試

十八、進階延伸主題

十九、作業或實驗題目建議

  1. 建立一個 Django 首頁,顯示姓名與學號
  2. 建立一個 Model 儲存感測器資料
  3. 把資料顯示在管理後台
  4. 用 Gunicorn 啟動 Django
  5. 使用 Nginx 成功代理到 Django 站台

二十、結語

Django 非常適合用來教網站系統的完整結構,而 Gunicorn + Nginx 則是學生從開發走向部署的重要一步。只要把這套流程學會,就已經具備部署中小型 Python Web 系統的核心能力。