部署是一個將 Django 應用從開發環境轉移到生產環境的過程。這包括設置伺服器、配置數據庫、處理靜態文件,以及確保應用的性能和安全性。
課程目標
- 學習 Django 部署的基本流程。
- 使用 Gunicorn 和 Nginx 部署 Django 應用。
- 配置 PostgreSQL 作為生產環境數據庫。
- 管理靜態文件與環境變數。
課程內容
1. 部署的基本流程
- 設置伺服器環境(Linux 伺服器推薦使用 Ubuntu)。
- 安裝依賴工具和軟件(Python、PostgreSQL、Nginx 等)。
- 配置應用伺服器(Gunicorn)。
- 設置反向代理(Nginx)。
- 配置域名與 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
步驟 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/
指向正確的路徑。
課堂練習
- 配置一個簡單的 Blog 應用並部署到伺服器。
- 添加 HTTPS 支持並測試應用的安全性。
- 使用 PostgreSQL 儲存數據,並檢查連接是否成功。
作業
- 嘗試在伺服器上配置 Celery 和 Redis,實現後台任務調度功能。
- 探索 Docker 化部署,將 Django 和 PostgreSQL 部署為容器化應用。
- 設置應用監控(例如使用 Supervisor 或 systemd)。