任务1:项目部署方案说明(Gunicorn+Nginx)
一、部署架构 采用 Gunicorn + Nginx + MariaDB 架构:
-
Nginx(80端口):反向代理、静态文件服务、负载均衡
-
Gunicorn(127.0.0.1:8000):WSGI HTTP 服务器,运行 Django 应用
-
MariaDB:数据持久化存储
-
Django 3.2.25:Web 应用框架
二、环境准备
-
阿里云 ECS(CentOS 7.9)
-
Python 3.6.8
-
安全组开放 80、22 端口
-
域名/公网 IP:8.136.21.43
部署前准备工作
1. requirements.txt(项目依赖文件)
Django==3.2.25
mysqlclient==2.1.1
Pillow==8.4.0
gunicorn==20.1.0
2. .gitignore(忽略文件)
# Django
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
ENV/
# IDE
.vscode/
.idea/
# OS
.DS_Store
Thumbs.db
# Media/Static(部署时生成)
/staticfiles/
/media/
3. README.md(含部署过程)
# Django 个人主页项目
## 项目简介
基于 Django 的个人主页展示系统,包含课程验证、个人信息、学习笔记、项目展示等功能。
## 技术栈
- Django 3.2.25
- MariaDB 5.5
- Gunicorn + Nginx
- CentOS 7
## 部署步骤
### 1. 环境准备
```bash
# 安装系统依赖
yum install -y mariadb-server mariadb-devel nginx
systemctl start mariadb
systemctl enable mariadb
首先进入云服务器,阿里云云服务器ECS

克隆我的代码:

git clone https://gitcode.com/2301_80002322/main.git
cd main

系统依赖安装
yum install -y mariadb-server mariadb-devel nginx
systemctl start mariadb nginx
Python环境配置
python3 -m venv venv
source venv/bin/activate
pip install django==3.2.25 mysqlclient pillow gunicorn
数据库配置
-
创建数据库
teacher_site -
配置
settings.py连接 MariaDB -
执行
migrate迁移数据
Gunicorn 配置
创建 /etc/systemd/system/gunicorn.service:
[Unit]
Description=gunicorn for Django
After=network.target
[Service]
User=root
WorkingDirectory=/app/myproject/main
ExecStart=/app/myproject/main/venv/bin/gunicorn \
--workers 4 --bind 127.0.0.1:8000 \
teacher_site.wsgi:application
[Install]
WantedBy=multi-user.target
Nginx 配置
server {
listen 80;
server_name 8.136.21.43;
location /static/ {
alias /app/myproject/main/staticfiles/;
}
location /media/ {
alias /app/myproject/main/media/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
}
}

报错:502 Bad Gateway 的本质是 Nginx 无法连接到后端的 Gunicorn 服务,而 Gunicorn 反复崩溃的直接原因是我们在反复切换 MySQL 与 SQLite 配置的过程中,使用 sed 等命令行工具修改 teacher_site/settings.py 时引入了语法错误——具体表现为第 87 行出现了一个多余的 },导致 Python 导入 teacher_site.settings 模块时抛出 SyntaxError。这使得 Gunicorn 的 Worker 进程在启动阶段就立即退出,服务进入 failed 状态,Nginx 因找不到上游服务而持续返回 502 错误,直到手动删除该多余符号并验证配置语法无误后,服务才恢复正常。
确保防火墙开放 80 端口

最终效果:
服务器端:



本地:



1. 为什么用 Gunicorn?
Django 自带 runserver 的问题:
单线程,只能处理 1 个请求
没有进程管理,崩溃后不会自动重启
不适合生产环境(官方明确警告)
Gunicorn 的优势:
多进程:支持多个 worker(我们配置了 4 个),并发处理请求
进程管理:worker 崩溃自动重启,保证服务高可用
WSGI 标准:符合 Python Web 服务器网关接口规范
生产级: Instagram、Reddit 等大型网站都在用
2. 为什么还要 + Nginx?
Gunicorn 的短板:
处理静态文件(CSS/JS/图片)性能差
不支持 HTTP 缓存、压缩、负载均衡
直接暴露在互联网不安全
Nginx 的作用:
反向代理:接收80端口请求,转发给Gunicorn(8000)
静态文件服务:直接处理/static/和/media/,不经过Django
负载均衡:可配置多个Gunicorn实例分发请求
安全防护:隐藏后端服务器,防DDoS攻击
HTTP优化:支持gzip压缩、浏览器缓存
更多推荐




所有评论(0)