Django部署到服务器:别被那些花里胡哨的教程骗了
兄弟们,今天咱们聊聊django部署到服务器这档子事。网上教程一堆,但大多是纸上谈兵,真到自己动手,坑多到能埋人。老司机我搞这行15年,踩过的坑比你吃过的盐都多,今天直接给你上干货,把django部署到服务器这件事掰开揉碎了讲清楚。
为什么你的Django项目总是部署失败?
很多新手喜欢把django部署到服务器跟本地跑通划等号,大错特错!本地用runserver跑得欢,一上服务器就各种404、500,为啥?因为生产环境和开发环境完全是两码事。你缺的不是代码,是生产环境下的部署思维。
核心问题就仨:
1. 进程管理:runserver是单进程的,根本扛不住生产流量,你得用Gunicorn或uWSGI。
2. 静态文件:Django自己处理静态文件在开发时没问题,但生产环境得交给Nginx,不然性能拖垮你。
3. 环境变量:密钥、数据库密码你敢明文写在settings.py里?等着被日吧。
今天这文章,就是带你逐个击破,把django部署到服务器整得明明白白。
django部署到服务器:准备工作不能含糊
1. 服务器选型与基础配置
别贪便宜买那种1核1G的机子,跑个Django + PostgreSQL + Redis,内存扛不住,迟早卡死。建议至少2核4G,系统用Ubuntu 20.04或22.04 LTS,稳。
登录服务器后,第一件事就是更新系统:
```bash
sudo apt update && sudo apt upgrade -y
```
创建部署用户,别用root直接跑应用:
```bash
sudo adduser deployer
sudo usermod -aG sudo deployer
```
2. 安装Python和虚拟环境
现在Python 3.10+是标配,别用3.6了,Django新特性用不上。用deadsnakes PPA装个最新稳定版。
```bash
sudo apt install python3.10 python3.10-venv python3.10-dev
```
接着创建虚拟环境:
```bash
python3.10 -m venv venv
source venv/bin/activate
```
3. 代码上传与依赖安装
别再用FTP传代码了,土不土?用Git。服务器上装个git,clone你的项目仓库。
```bash
git clone https://github.com/yourname/yourproject.git
cd yourproject
pip install -r requirements.txt
```
注意: requirements.txt一定要锁定版本,别装最新版,分分钟兼容性爆炸。
4. 环境变量管理
敏感信息必须用环境变量。本地开发用django-environ,服务器上可以配合systemd的EnvironmentFile。
```bash
pip install django-environ
```
在settings.py里加:
```python
import environ
env = environ.Env()
environ.Env.read_env('.env')
```
然后在项目根目录创建.env文件,把密钥、数据库密码写进去。记得加进.gitignore。
django部署到服务器:核心步骤实战
Gunicorn:让你的Django项目跑起来
Gunicorn是Python的WSGI服务器,生产环境跑它准没错。安装:
```bash
pip install gunicorn
```
先测试一下能不能跑:
```bash
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
```
如果访问IP:8000能看到页面,说明成功了。但这样跑在前台,关掉SSH就没了,得用systemd守护进程。
用systemd管理Gunicorn进程
创建服务文件:
```bash
sudo nano /etc/systemd/system/gunicorn.service
```
内容如下:
```ini
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=deployer
Group=www-data
WorkingDirectory=/home/deployer/yourproject
EnvironmentFile=/home/deployer/yourproject/.env
ExecStart=/home/deployer/yourproject/venv/bin/gunicorn --workers 3 --bind unix:/home/deployer/yourproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
```
注意: Workers数一般设为CPU核数*2+1,但别贪多,内存也要考虑。这里用socket通信,别用端口,性能更好。
启用并启动:
```bash
sudo systemctl enable gunicorn
sudo systemctl start gunicorn
```
Nginx:反向代理与静态文件处理
Nginx是前哨,所有外部请求先经过它,再转发给Gunicorn。
```bash
sudo apt install nginx
```
配置站点:
```bash
sudo nano /etc/nginx/sites-available/myproject
```
内容:
```nginx
server {
listen 80;
server_name yourdomain.com;
location /static/ {
alias /home/deployer/yourproject/staticfiles/;
}
location /media/ {
alias /home/deployer/yourproject/media/;
}
location / {
proxy_pass http://unix:/home/deployer/yourproject/myproject.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
```
启用配置并测试:
```bash
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
静态文件收集
别忘了收集静态文件,不然CSS、JS全挂了。
```bash
python manage.py collectstatic --noinput
```
坑: 如果使用Whitenoise,就不需要Nginx管静态文件了,性能也还行。但老司机建议还是交给Nginx,更干净。
数据库迁移与初始化
部署后别忘了跑迁移:
```bash
python manage.py migrate
```
别偷懒,生产数据库结构变了,不迁移等着报错吧。
django部署到服务器:避坑建议(老司机血的教训)
1. 别用SQLite,用PostgreSQL
SQLite在本地爽,上了服务器就是噩梦,并发一高直接锁库。换PostgreSQL,稳定高效。
2. 关闭DEBUG模式
settings.py里DEBUG必须设为False,不然错误信息全暴露给用户,安全漏洞大大的。
3. 处理允许的域名
ALLOWED_HOSTS设为你的域名或IP,不然请求直接拒。
4. 使用HTTPS
现在你用HTTP,浏览器直接标不安全。用Let's Encrypt免费证书,配上Certbot,一键搞定。
5. 日志监控
部署完别不管,配置日志轮转,用logrotate,不然磁盘爆了别怪我没提醒你。
还有,定期检查Gunicorn和Nginx的日志,$ tail -f /var/log/nginx/error.log,及时发现问题。
老司机 FAQ
Q1: Django部署到服务器后,静态文件404怎么办?
A: 先检查collectstatic有没有执行,并且STATIC_ROOT路径是否正确。然后确认Nginx配置中的location /static/的alias路径跟STATIC_ROOT是否一致。注意alias和root的区别,alias后面要跟实际路径,root则是拼接。另外,别忘了重启Nginx让配置生效。
Q2: 部署到服务器后,访问出现502 Bad Gateway,怎么排查?
A: 502说明Nginx连不上Gunicorn。先检查Gunicorn进程是否存活,$ sudo systemctl status gunicorn。如果挂了,看日志$ journalctl -u gunicorn。常见原因是socket文件权限不对,或WorkingDirectory、EnvironmentFile路径错误。还要确保Nginx配置中的proxy_pass的socket路径跟Gunicorn的–bind参数一致。最后,别忘了用nginx -t测试配置,并reload Nginx。
Q3: Django部署到服务器,性能优化有哪些要点?
A: 首先,Gunicorn的workers数要合理,太多内存爆炸,太少CPU闲置。其次,开启Django的缓存,用Redis或Memcached,别用LocMemCache。还有,数据库连接池用pgbouncer之类的。另外,静态文件交给Nginx,千万别用Django处理。最后,开启Gzip压缩,Nginx那边配好。
本文深度聚焦关键词 django部署到服务器,django部署,django生产环境,Gunicorn,Nginx。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。