Django部署到服务器,这些坑我先踩为敬
各位老铁,我搞了15年web开发,今天来聊聊Django部署到服务器这件事。大部分人一上来就照着网上的教程敲命令,结果各种报错,一脸懵逼。别急,今天我就把这套部署流程掰碎了讲,全是实战经验,保证让你少走弯路。
1. 准备工作:服务器和本地环境,确认好这几点
先把服务器买好(别问哪家,都行),系统建议选Ubuntu 20.04 LTS或22.04 LTS,别整CentOS了,现在人家都搞Stream了,兼容性麻烦。然后本地环境,你用的Python版本和服务器上的一定要一致!我见过太多本地3.10,服务器3.6,然后跑不起来直接崩溃。
另外,你的Django项目一定要用虚拟环境(virtualenv或pipenv),千万别把系统Python搞乱。还有,数据库如果是SQLite,趁早换PostgreSQL或MySQL,生产别用SQLite,并发不行,数据丢了哭都来不及。
2. 服务器端环境配置:Python和数据库,一步到位
登录服务器,更新系统包:
```bash
sudo apt update && sudo apt upgrade -y
```
安装Python和pip,这里用Python3.10为例:
```bash
sudo apt install python3.10 python3.10-venv python3.10-dev -y
```
然后安装数据库(以PostgreSQL为例):
```bash
sudo apt install postgresql libpq-dev -y
sudo -u postgres createuser --interactive
sudo -u postgres createdb mydb
```
记得给数据库设置密码,并允许远程连接(如果你需要)。这些细节都要弄好,不然Django连不上数据库,白忙活。
3. 项目部署:代码传输和依赖安装,小心这些坑
用Git或者scp把项目上传到服务器,比如放到`/srv/myproject`。接着创建虚拟环境并安装依赖:
```bash
cd /srv/myproject
python3.10 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
注意:`requirements.txt`要固定版本,别用`>=`,明天依赖更新了,你项目就挂了。另外,`DEBUG`一定要设为`False`,`ALLOWED_HOSTS`要填你的域名或IP,不然Django会拒绝请求。
4. 静态文件和媒体文件:这是最容易出bug的地方
Django在生产环境不会处理静态文件,所以要用`collectstatic`把静态文件收集到一个目录。在`settings.py`里设置:
```python
STATIC_ROOT = '/srv/myproject/staticfiles/'
```
然后运行:
```bash
python manage.py collectstatic --noinput
```
媒体文件(用户上传的)也要单独设置,用`MEDIA_ROOT`和`MEDIA_URL`,后面Nginx要配置到。
还有,如果你用了django-cors-headers或者其他中间件,顺序别搞错,不然会出现奇怪的错误。
5. 数据库迁移:生产环境操作要小心
在服务器上执行:
```bash
python manage.py migrate
```
但在此之前,先备份你的数据库(如果有数据)。迁移后,要创建超级用户:
```bash
python manage.py createsuperuser
```
小技巧:如果本地和服务器数据库有差异,最好用`makemigrations`在本地生成,然后提交到代码库,服务器上直接`migrate`,因为现场`makemigrations`容易因为环境差异生成不一致的迁移文件。
6. 部署运行:Gunicorn和Nginx,最佳搭档
用Gunicorn跑Django,先安装:
```bash
pip install gunicorn
```
然后测试运行:
```bash
gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
```
如果没问题,就配置systemd服务,让Gunicorn后台运行,开机自启。创建一个服务文件`/etc/systemd/system/gunicorn.service`,内容大致如下:
```ini
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/srv/myproject
ExecStart=/srv/myproject/venv/bin/gunicorn --workers 3 --bind unix:/srv/myproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
```
这里用Unix socket,性能更好。然后启动:
```bash
sudo systemctl start gunicorn && sudo systemctl enable gunicorn
```
接着配置Nginx,安装后创建站点配置文件`/etc/nginx/sites-available/myproject`,里面配置反向代理和静态文件服务。
```nginx
server {
listen 80;
server_name yourdomain.com;
location /static/ {
alias /srv/myproject/staticfiles/;
}
location /media/ {
alias /srv/myproject/media/;
}
location / {
proxy_pass http://unix:/srv/myproject/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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
然后启用站点并重启Nginx。别忘了检查防火墙(ufw)开放80端口。
7. 安全加固:禁止明文传输,开启HTTPS
现在百度搜索强制HTTPS了,所以你也要开启HTTPS。用Let's Encrypt免费证书,安装certbot然后:
```bash
sudo certbot --nginx -d yourdomain.com
```
它会自动配置证书并重定向HTTP到HTTPS。开启后,要设置`SECURE_SSL_REDIRECT = True`,`SESSION_COOKIE_SECURE = True`,`CSRF_COOKIE_SECURE = True`。
还有,别忘了在Nginx配置里隐藏服务器版本号,限制请求体大小,防止上传太大文件。这些都是老司机必备。
8. 调试和日志:出了问题怎么排查
部署后,如果页面报错,先看日志:Gunicorn日志和Nginx错误日志。设置Gunicorn的accesslog和errorlog,方便排查。也可以用`tail -f /var/log/nginx/error.log`实时查看。
另外,把Django的异常栈记录到日志里,设置`LOGGING`配置,否则你只能看到500,什么都不知道。
9. 部署后检查清单:这些别漏掉
最后,给你一份检查清单,跟着做一遍,确保万无一失:
- [ ] `DEBUG = False`,`ALLOWED_HOSTS`包含你的域名/IP
- [ ] 静态文件收集完成,Nginx能正常访问
- [ ] 数据库迁移成功,权限正确
- [ ] 防火墙开放80和443端口
- [ ] 定时任务(如果有)配置好(比如Celery)
如果都通过了,恭喜你,Django部署到服务器大功告成!
老司机FAQ
Q1: Django部署到服务器后,为什么访问网站一直显示500,但本地没问题?
A1: 大概率是环境不一致。首先查一下`DEBUG`是否设为False,如果为False,500不会显示具体错误。看日志!查看Gunicorn的错误日志,如果是`ModuleNotFoundError`,那说明依赖没安装全,用`pip freeze`对比一下;如果是`DatabaseError`,检查数据库连接和迁移;如果是权限问题,检查静态文件或socket文件权限。也可以临时将`DEBUG`改为True,但绝对不能在生产这样干。
Q2: 部署时用什么方式运行Django最好?
A2: 如果你只用一台服务器,推荐用Gunicorn+Nginx,简单高效。Gunicorn支持多worker,性能不错。如果你要更强的并发和异步支持,可以考虑uvicorn(配合ASGI),但需要额外配置。千万别用runserver,那是开发用的,不仅慢还不安全。如果你要极致的性能,可以考虑用Docker容器化,但部署复杂度上升,看你自己需要。
Q3: 静态文件404,怎么解决?
A3: 典型Nginx配置问题。先确认你运行了`collectstatic`,并且`STATIC_ROOT`设置的路径正确。然后检查Nginx的配置,`location /static/` 的alias是否指向正确的目录,注意路径结尾的斜杠。用`curl -I http://你的域名/static/xxx.css`测试一下,看返回什么状态码。另外,确保Nginx进程的权限能读取静态文件目录,通常用`www-data`用户,所以静态文件所在目录的权限要设置好,比如`sudo chown -R www-data:www-data /srv/myproject/staticfiles/`。
本文深度聚焦关键词 django部署到服务器, Django部署教程, Gunicorn, Nginx, 部署避坑。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。