文章

Django - 部署

部署是一個將 Django 應用從開發環境轉移到生產環境的過程。這包括設置伺服器、配置數據庫、處理靜態文件,以及確保應用的性能和安全性。


課程目標

  1. 學習 Django 部署的基本流程。
  2. 使用 Gunicorn 和 Nginx 部署 Django 應用。
  3. 配置 PostgreSQL 作為生產環境數據庫。
  4. 管理靜態文件與環境變數。

課程內容

1. 部署的基本流程

  1. 設置伺服器環境(Linux 伺服器推薦使用 Ubuntu)。
  2. 安裝依賴工具和軟件(Python、PostgreSQL、Nginx 等)。
  3. 配置應用伺服器(Gunicorn)。
  4. 設置反向代理(Nginx)。
  5. 配置域名與 HTTPS(推薦使用 Let’s Encrypt)。

2. 設置伺服器環境

步驟 1:更新伺服器並安裝必要工具

1
2
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv libpq-dev nginx git

步驟 2:克隆 Django 項目

1
2
3
cd /var/www/
sudo git clone <your-django-project-repository> myproject
cd myproject

步驟 3:創建虛擬環境並安裝依賴

1
2
3
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

步驟 4:配置環境變數

使用 python-decouple.env 文件存儲敏感信息:

1
pip install python-decouple

在項目根目錄創建 .env 文件:

DEBUG=False
SECRET_KEY=your-secret-key
ALLOWED_HOSTS=your-domain.com
DATABASE_URL=postgres://username:password@localhost:5432/dbname

settings.py 中加載環境變數:

1
2
3
4
5
6
7
8
9
from decouple import config

DEBUG = config('DEBUG', default=False, cast=bool)
SECRET_KEY = config('SECRET_KEY')
ALLOWED_HOSTS = config('ALLOWED_HOSTS').split(',')

DATABASES = {
    'default': dj_database_url.config(default=config('DATABASE_URL'))
}

3. 配置 Gunicorn

步驟 1:安裝 Gunicorn

1
pip install gunicorn

步驟 2:測試 Gunicorn

1
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

訪問 http://<server-ip>:8000 檢查應用是否啟動。

步驟 3:設置 Gunicorn 為服務

創建服務文件 /etc/systemd/system/myproject.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/gunicorn --workers 3 --bind unix:/var/www/myproject/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target

啟用並啟動服務:

1
2
sudo systemctl start myproject
sudo systemctl enable myproject

4. 配置 Nginx

步驟 1:創建 Nginx 配置

/etc/nginx/sites-available/myproject 中添加以下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
    server_name your-domain.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /var/www/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/myproject/myproject.sock;
    }

    listen 80;
}

啟用站點並重新啟動 Nginx:

1
2
3
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

步驟 2:配置 HTTPS

使用 Certbot 配置 HTTPS:

1
2
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com

5. 配置 PostgreSQL

步驟 1:安裝 PostgreSQL

1
sudo apt install postgresql

步驟 2:創建數據庫和用戶

1
2
3
4
5
6
7
8
sudo -u postgres psql
CREATE DATABASE myprojectdb;
CREATE USER myprojectuser WITH PASSWORD 'password';
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;
\q

步驟 3:測試連接

.env 中更新 DATABASE_URL

DATABASE_URL=postgres://myprojectuser:password@localhost:5432/myprojectdb

測試數據庫連接:

1
python manage.py migrate

6. 配置靜態文件

步驟 1:收集靜態文件

1
python manage.py collectstatic

步驟 2:配置 Nginx 提供靜態文件

確保 Nginx 配置的 location /static/ 指向正確的路徑。


課堂練習

  1. 配置一個簡單的 Blog 應用並部署到伺服器。
  2. 添加 HTTPS 支持並測試應用的安全性。
  3. 使用 PostgreSQL 儲存數據,並檢查連接是否成功。

作業

  1. 嘗試在伺服器上配置 Celery 和 Redis,實現後台任務調度功能。
  2. 探索 Docker 化部署,將 Django 和 PostgreSQL 部署為容器化應用。
  3. 設置應用監控(例如使用 Supervisor 或 systemd)。

本文章以 CC BY 4.0 授權