從 Django 的基本概念、專案建立、應用程式結構,到使用 Gunicorn 與 Nginx 進行正式部署的完整教學。
適合 Web 程式設計、伺服器部署、IoT Web 後台與專題實作課程。
| 元件 | 用途 |
|---|---|
| URL | 定義網址路徑與對應的處理函式 |
| View | 接收請求並回傳結果 |
| Template | HTML 模板,用來顯示畫面 |
| Model | 資料庫模型,定義資料表結構 |
| Admin | 內建後台管理介面 |
sudo apt update
sudo apt install -y python3 python3-pip python3-venv
mkdir -p ~/django_projects
cd ~/django_projects
python3 -m venv venv
source venv/bin/activate
pip install django gunicorn
django-admin startproject mysite
cd mysite
python manage.py runserver 0.0.0.0:8000
瀏覽器測試:
http://伺服器IP:8000
mysite/
├── manage.py
├── mysite/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── asgi.py
│ └── wsgi.py
manage.py:管理專案常用指令入口settings.py:專案設定檔urls.py:網址路由設定wsgi.py:供 Gunicorn 等 WSGI Server 使用python manage.py startapp mainapp
INSTALLED_APPS = [
...
'mainapp',
]
# mainapp/views.py
from django.http import HttpResponse
def home(request):
return HttpResponse("Hello Django")
# mainapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
]
# mysite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('mainapp.urls')),
]
mkdir -p mainapp/templates/mainapp
<!-- mainapp/templates/mainapp/index.html -->
<h1>Welcome to Django</h1>
<p>這是我的第一個 Django 網站</p>
from django.shortcuts import render
def home(request):
return render(request, 'mainapp/index.html')
Django 預設可使用 SQLite,非常適合教學起步。
# 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
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
完成後可登入:
http://伺服器IP:8000/admin
# mainapp/admin.py
from django.contrib import admin
from .models import SensorData
admin.site.register(SensorData)
| 項目 | 開發模式 | 正式部署 |
|---|---|---|
| 伺服器 | runserver | Gunicorn |
| 前端代理 | 無 | Nginx |
| 除錯模式 | DEBUG=True | DEBUG=False |
| 靜態檔案 | Django 處理 | Nginx 處理 |
| 安全性 | 較低 | 較完整 |
python manage.py runserver 對外提供服務。DEBUG = False
ALLOWED_HOSTS = ['192.168.1.120', 'localhost', '127.0.0.1']
import os
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
python manage.py collectstatic
gunicorn --bind 0.0.0.0:8000 mysite.wsgi:application
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
這一步很重要,讓 Gunicorn 可以像正式服務一樣由 systemd 管理。
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
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
sudo systemctl status gunicorn
sudo systemctl status nginx
curl http://127.0.0.1
| 問題 | 可能原因 | 解法 |
|---|---|---|
| 502 Bad Gateway | Gunicorn 沒有正常啟動 | 檢查 systemctl status gunicorn |
| 靜態檔案無法載入 | STATIC_ROOT 或 Nginx 路徑錯誤 | 重新檢查 collectstatic 與 Nginx 設定 |
| DisallowedHost | ALLOWED_HOSTS 未加入 IP 或網域 | 修改 settings.py |
| Permission denied | socket 或目錄權限錯誤 | 檢查 User、Group 與路徑權限 |
| ModuleNotFoundError | 虛擬環境或套件安裝錯誤 | 確認 Gunicorn 使用的 Python 路徑 |
DEBUG=False 與 ALLOWED_HOSTScollectstaticDjango 非常適合用來教網站系統的完整結構,而 Gunicorn + Nginx 則是學生從開發走向部署的重要一步。只要把這套流程學會,就已經具備部署中小型 Python Web 系統的核心能力。