在阿里云上部署 Django 应用:完整部署指南
Deploy Django Application on Aliyun: Complete Deployment Guide
本文详细介绍如何在阿里云服务器上部署 Django 应用,包括服务器初始化、环境配置、Nginx 配置、Gunicorn 部署、SSL 证书配置以及自动化部署等完整流程。适用于 Ubuntu/Debian 系统的生产环境部署。
一、部署前的准备
1.1 服务器准备
购买和配置云服务器
- 购买云服务器:在阿里云控制台购买 ECS 实例
- 购买域名:购买域名并完成备案(如需要)
- 域名解析:将域名解析到服务器公网 IP
服务器初始化
重要提示:服务器购买成功后,建议执行一次重新初始化磁盘操作(需要先停止服务器),确保系统镜像干净。执行该操作时,网页会提示设置远程登录密码。
远程登录服务器
1 2 3 4
| ssh root@your-server-ip
|
1.2 系统更新和用户创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| apt-get update
apt-get upgrade -y
useradd -m -s /bin/bash django usermod -a -G sudo django passwd django
su - django
|
1.3 配置 SSH 密钥(推荐)
1 2 3 4 5 6 7 8
| ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ssh-copy-id django@your-server-ip
ssh django@your-server-ip
|
1.4 配置防火墙
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| sudo apt-get install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
|
二、安装基础软件
2.1 安装 Python 和 pip
1 2 3 4 5 6 7 8 9 10
| sudo apt-get update sudo apt-get install -y python3 python3-pip python3-venv
python3 --version pip3 --version
pip3 install --upgrade pip
|
2.2 安装 Git
1 2 3 4 5 6 7 8 9
| sudo apt-get install -y git
git config --global user.name "Your Name" git config --global user.email "your_email@example.com"
git --version
|
2.3 安装 Nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| sudo apt-get install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
ps -ef | grep nginx
|
常用 Nginx 命令:
1 2 3 4 5 6 7 8
| sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx sudo systemctl reload nginx
sudo nginx -t
|
2.4 安装 MySQL 数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| netstat -tap | grep mysql
sudo apt-get install -y mysql-server mysql-client
sudo systemctl start mysql
sudo systemctl enable mysql
sudo systemctl status mysql
ps -ef | grep mysql
|
MySQL 安全配置
1 2 3 4 5 6 7 8
| sudo mysql_secure_installation
|
创建数据库和用户
1 2 3 4
| sudo mysql -u root -p
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| CREATE DATABASE myproject CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'django_user'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON myproject.* TO 'django_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
|
修改 MySQL root 密码
1 2 3 4 5
| sudo mysqladmin -u root -p password 'newpassword'
sudo mysql -u root -p
|
1 2
| ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword'; FLUSH PRIVILEGES;
|
三、部署 Django 应用
3.1 创建项目目录
1 2 3 4 5 6 7
| mkdir -p ~/sites/myproject cd ~/sites/myproject
mkdir -p ~/sites/www.example.com cd ~/sites/www.example.com
|
3.2 创建虚拟环境
1 2 3 4 5 6 7 8 9
| python3 -m venv env
source env/bin/activate
which python python --version
|
3.3 克隆项目代码
1 2 3 4 5 6 7 8
| git clone https://github.com/yourusername/yourproject.git
git clone git@github.com:yourusername/yourproject.git
cd yourproject
|
3.4 安装项目依赖
1 2 3 4 5 6 7 8 9 10 11 12 13
| source ~/sites/myproject/env/bin/activate
pip install -r requirements.txt
sudo apt-get install -y libmysqlclient-dev default-libmysqlclient-dev
sudo apt-get install -y libpq-dev
|
3.5 配置 Django 项目
创建或修改 settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
import os from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = os.environ.get('SECRET_KEY', 'your-secret-key-here') DEBUG = False ALLOWED_HOSTS = ['www.example.com', 'example.com', 'your-server-ip']
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'myproject', 'USER': 'django_user', 'PASSWORD': 'your_secure_password', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8mb4', }, } }
STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True
|
使用环境变量管理敏感信息
1 2 3 4 5 6 7 8
| cat > .env << EOF SECRET_KEY=your-secret-key-here DB_NAME=myproject DB_USER=django_user DB_PASSWORD=your_secure_password DEBUG=False EOF
|
1 2 3 4 5 6 7 8
| pip install python-decouple
from decouple import config
SECRET_KEY = config('SECRET_KEY') DEBUG = config('DEBUG', default=False, cast=bool)
|
3.6 执行数据库迁移
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| source env/bin/activate
cd yourproject
python manage.py makemigrations
python manage.py sqlmigrate app_name 0001
python manage.py migrate
python manage.py createsuperuser
|
3.7 收集静态文件
1 2 3 4 5
| python manage.py collectstatic
|
3.8 测试 Django 应用
1 2 3 4 5
| python manage.py runserver 0.0.0.0:8000
|
四、配置 Nginx
4.1 创建 Nginx 配置文件
1 2
| sudo nano /etc/nginx/sites-available/www.example.com
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
server { listen 80; server_name www.example.com example.com; charset utf-8; client_max_body_size 75M;
location /static { alias /home/django/sites/www.example.com/yourproject/static; expires 30d; add_header Cache-Control "public, immutable"; }
location /media { alias /home/django/sites/www.example.com/yourproject/media; }
location / { 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; proxy_pass http://unix:/tmp/www.example.com.socket; proxy_read_timeout 300s; proxy_connect_timeout 75s; }
location ~ /\. { deny all; access_log off; log_not_found off; } }
|
4.2 启用站点配置
1 2 3 4 5 6 7 8 9 10 11
| sudo ln -s /etc/nginx/sites-available/www.example.com /etc/nginx/sites-enabled/www.example.com
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
|
4.3 配置 SSL 证书(HTTPS)
使用 Let’s Encrypt 免费证书
1 2 3 4 5 6 7 8 9 10 11 12
| sudo apt-get update sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d www.example.com -d example.com
sudo certbot renew --dry-run
sudo certbot certificates
|
Certbot 会自动修改 Nginx 配置文件,添加 SSL 配置。
手动配置 SSL(如果使用其他证书)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| server { listen 443 ssl http2; server_name www.example.com example.com;
ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
}
server { listen 80; server_name www.example.com example.com; return 301 https://$server_name$request_uri; }
|
五、使用 Gunicorn 部署
5.1 安装 Gunicorn
1 2 3 4 5 6 7 8
| source ~/sites/www.example.com/env/bin/activate
pip install gunicorn
gunicorn --version
|
5.2 创建 Gunicorn 配置文件
1 2 3 4 5
| mkdir -p ~/sites/www.example.com/config
nano ~/sites/www.example.com/config/gunicorn_config.py
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
import multiprocessing
bind = "unix:/tmp/www.example.com.socket" backlog = 2048
workers = multiprocessing.cpu_count() * 2 + 1 worker_class = "sync" worker_connections = 1000 timeout = 30 keepalive = 2
accesslog = "/home/django/sites/www.example.com/logs/access.log" errorlog = "/home/django/sites/www.example.com/logs/error.log" loglevel = "info"
proc_name = "gunicorn_www.example.com"
daemon = False pidfile = "/home/django/sites/www.example.com/gunicorn.pid" umask = 0 user = None group = None tmp_upload_dir = None
|
5.3 创建日志目录
1 2 3 4 5
| mkdir -p ~/sites/www.example.com/logs
chmod 755 ~/sites/www.example.com/logs
|
5.4 测试 Gunicorn
1 2 3 4 5 6 7 8 9 10 11 12 13
| source ~/sites/www.example.com/env/bin/activate
cd ~/sites/www.example.com/yourproject
gunicorn --config ~/sites/www.example.com/config/gunicorn_config.py yourproject.wsgi:application
gunicorn --bind unix:/tmp/www.example.com.socket --workers 3 yourproject.wsgi:application
|
5.5 配置 Systemd 服务(推荐)
1 2
| sudo nano /etc/systemd/system/gunicorn-www.example.com.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [Unit] Description=Gunicorn daemon for www.example.com After=network.target
[Service] User=django Group=django WorkingDirectory=/home/django/sites/www.example.com/yourproject Environment="PATH=/home/django/sites/www.example.com/env/bin" ExecStart=/home/django/sites/www.example.com/env/bin/gunicorn \ --config /home/django/sites/www.example.com/config/gunicorn_config.py \ yourproject.wsgi:application
Restart=always RestartSec=3
[Install] WantedBy=multi-user.target
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| sudo systemctl daemon-reload
sudo systemctl start gunicorn-www.example.com
sudo systemctl enable gunicorn-www.example.com
sudo systemctl status gunicorn-www.example.com
sudo journalctl -u gunicorn-www.example.com -f
|
常用 systemd 命令:
1 2 3 4 5 6 7 8 9
| sudo systemctl start gunicorn-www.example.com sudo systemctl stop gunicorn-www.example.com sudo systemctl restart gunicorn-www.example.com sudo systemctl reload gunicorn-www.example.com
sudo systemctl status gunicorn-www.example.com sudo journalctl -u gunicorn-www.example.com -n 50
|
六、部署后操作
6.1 更新代码流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| ssh django@your-server-ip
cd ~/sites/www.example.com/yourproject
source ../env/bin/activate
git pull origin main
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart gunicorn-www.example.com
sudo systemctl reload nginx
|
6.2 创建部署脚本
1 2
| nano ~/sites/www.example.com/deploy.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/bin/bash
set -e
echo "开始部署..."
cd ~/sites/www.example.com/yourproject
source ../env/bin/activate
echo "拉取最新代码..." git pull origin main
echo "安装依赖..." pip install -r requirements.txt
echo "执行数据库迁移..." python manage.py migrate
echo "收集静态文件..." python manage.py collectstatic --noinput
echo "重启 Gunicorn..." sudo systemctl restart gunicorn-www.example.com
echo "重载 Nginx..." sudo systemctl reload nginx
echo "部署完成!"
|
1 2 3 4 5
| chmod +x ~/sites/www.example.com/deploy.sh
~/sites/www.example.com/deploy.sh
|
6.3 设置文件权限
1 2 3 4 5
| sudo chown -R django:django ~/sites/www.example.com
|
七、性能优化
7.1 Gunicorn 优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
workers = 4
worker_class = "gevent" worker_connections = 1000
timeout = 30 graceful_timeout = 30
|
7.2 Nginx 优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
location / { proxy_cache my_cache; proxy_cache_valid 200 60m; }
|
7.3 Django 优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
DATABASES = { 'default': { 'CONN_MAX_AGE': 600, } }
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.redis.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', } }
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
|
八、监控和日志
8.1 日志管理
1 2 3 4 5 6 7 8 9 10
| tail -f ~/sites/www.example.com/logs/error.log tail -f ~/sites/www.example.com/logs/access.log
sudo tail -f /var/log/nginx/access.log sudo tail -f /var/log/nginx/error.log
sudo journalctl -u gunicorn-www.example.com -f
|
8.2 日志轮转
1 2
| sudo nano /etc/logrotate.d/gunicorn-www.example.com
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| /home/django/sites/www.example.com/logs/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 django django sharedscripts postrotate systemctl reload gunicorn-www.example.com > /dev/null 2>&1 || true endscript }
|
九、常见问题和故障排查
9.1 502 Bad Gateway
原因:Gunicorn 未运行或 socket 文件路径不正确
1 2 3 4 5 6 7 8
| sudo systemctl status gunicorn-www.example.com
ls -l /tmp/www.example.com.socket
sudo chmod 666 /tmp/www.example.com.socket
|
9.2 静态文件 404
原因:静态文件路径配置错误或未收集静态文件
1 2 3 4 5 6 7 8
| ls -la ~/sites/www.example.com/yourproject/static
python manage.py collectstatic
sudo nginx -t
|
9.3 数据库连接错误
1 2 3 4 5 6 7
| sudo systemctl status mysql
mysql -u django_user -p -h localhost myproject
|
9.4 权限问题
1 2 3 4 5 6 7 8
| ls -la ~/sites/www.example.com
sudo chown -R django:django ~/sites/www.example.com
ls -l /tmp/www.example.com.socket
|
十、安全建议
10.1 Django 安全设置
1 2 3 4 5 6 7 8 9 10 11 12 13
|
DEBUG = False ALLOWED_HOSTS = ['www.example.com', 'example.com']
SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SECURE_BROWSER_XSS_FILTER = True SECURE_CONTENT_TYPE_NOSNIFF = True X_FRAME_OPTIONS = 'DENY'
|
10.2 服务器安全
1 2 3 4 5 6 7 8 9 10 11 12
| sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban
sudo nano /etc/ssh/sshd_config
sudo systemctl restart sshd
|
十一、总结
通过本文的步骤,您已经完成了:
- ✅ 服务器初始化:系统更新、用户创建、防火墙配置
- ✅ 环境搭建:Python、Nginx、MySQL 安装配置
- ✅ Django 部署:代码部署、数据库迁移、静态文件收集
- ✅ Nginx 配置:反向代理、静态文件服务、SSL 证书
- ✅ Gunicorn 部署:WSGI 服务器配置、systemd 服务
- ✅ 自动化部署:部署脚本、日志管理
现在您的 Django 应用应该已经成功部署在阿里云服务器上了!
十二、相关参考