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, 部署避坑。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。