Django部署到服务器:准备工作与常见误区

很多新手甚至老手,在Django部署到服务器这件事上栽跟头。不是环境变量没配好,就是静态文件404,要么就是进程管理一团糟。今天,老司机就带你把这些坑一个一个填平。

1. 服务器选择与Python环境:别在版本上纠结

首先,服务器建议用Ubuntu 20.04或22.04,别用CentOS折磨自己。Python版本别太新,3.8到3.10之间最稳。

避坑:系统自带的Python千万别乱动,否则你可能会把系统搞崩。用`python3 -m venv`创建虚拟环境,或者在项目目录下用`virtualenv`。

```bash

创建虚拟环境

python3 -m venv myenv

source myenv/bin/activate

```

然后,把项目代码上传到服务器,比如`/var/www/myproject`。用Git或者scp都行,但记得把`.env`文件放在项目外,别提交到仓库。

2. 安装依赖:requirements.txt的正确姿势

在虚拟环境中,安装依赖:

```bash

pip install -r requirements.txt

```

避坑:有些包(比如`psycopg2`)需要编译,可能会报错。先装系统依赖:`sudo apt install libpq-dev python3-dev`。

另外,如果你用了Pillow,可能还需要`libjpeg-dev`。

3. 数据库配置:别再用SQLite了

生产环境一定要用PostgreSQL或MySQL。SQLite只适合开发。

```bash

sudo apt install postgresql postgresql-contrib

sudo -u postgres createdb mydb

sudo -u postgres createuser --interactive

```

然后在Django的`settings.py`里配置数据库。

避坑:数据库密码别写死在代码里,用环境变量。

Django部署到服务器:核心配置与静态文件

1. 修改settings.py:生产环境的关键设置

打开`settings.py`,做以下调整:

  • `DEBUG = False`(重要!)
  • `ALLOWED_HOSTS = ['你的域名或IP']`
  • 配置`STATIC_ROOT`和`MEDIA_ROOT`

```python

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

```

2. 收集静态文件:你会遇到的一个经典坑

执行 `python manage.py collectstatic`,把静态文件收集到`STATIC_ROOT`。

避坑:如果遇到`staticfiles`目录权限问题,可以`sudo chmod -R 755 staticfiles`。

3. 迁移数据库

```bash

python manage.py makemigrations

python manage.py migrate

```

Django部署到服务器:用uWSGI和Nginx跑起来

1. 安装uWSGI:选对版本

```bash

pip install uwsgi

```

避坑:uWSGI可能会编译失败。确保系统有`build-essential`和`python3-dev`。

2. 配置uWSGI:ini文件写法

在项目目录下创建`uwsgi.ini`:

```ini

[uwsgi]

chdir = /var/www/myproject

module = myproject.wsgi:application

master = true

processes = 4

threads = 2

socket = /tmp/myproject.sock

chmod-socket = 664

vacuum = true

die-on-term = true

```

然后启动:

```bash

uwsgi --ini uwsgi.ini &

```

避坑:如果你用了虚拟环境,需要加上`home`参数:

```ini

home = /path/to/venv

```

3. 安装和配置Nginx:反向代理

```bash

sudo apt install nginx

```

创建配置文件`/etc/nginx/sites-available/myproject`:

```nginx

server {

listen 80;

server_name yourdomain.com;

location /static/ {

alias /var/www/myproject/staticfiles/;

}

location /media/ {

alias /var/www/myproject/media/;

}

location / {

include uwsgi_params;

uwsgi_pass unix:/tmp/myproject.sock;

}

}

```

启用配置:

```bash

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/

sudo nginx -t

sudo systemctl reload nginx

```

避坑:如果Nginx返回502,多半是socket文件权限或者路径不对。检查`/tmp/myproject.sock`是否存在,且Nginx用户能访问。

4. 用systemd管理uWSGI:让服务常驻

创建`/etc/systemd/system/myproject.service`:

```ini

[Unit]

Description=uWSGI instance to serve myproject

After=network.target

[Service]

User=www-data

Group=www-data

WorkingDirectory=/var/www/myproject

Environment="PATH=/var/www/myproject/myenv/bin"

ExecStart=/var/www/myproject/myenv/bin/uwsgi --ini uwsgi.ini

[Install]

WantedBy=multi-user.target

```

然后:

```bash

sudo systemctl start myproject

sudo systemctl enable myproject

```

Django部署到服务器:性能优化与安全加固

1. 性能优化:缓存与压缩

  • 启用Gzip压缩:在Nginx配置中添加`gzip on;`等。
  • 使用Redis缓存:Django的缓存后端设置为Redis。

2. 安全加固:HTTPS与防火墙

  • 用Let's Encrypt免费证书,配置HTTPS。
  • 配置防火墙:`sudo ufw allow 'Nginx Full'`。
  • 设置`SECURE_SSL_REDIRECT = True`等安全设置。

3. 日志与监控:排查问题不抓瞎

  • 查看uWSGI日志:`journalctl -u myproject`。
  • 查看Nginx错误日志:`/var/log/nginx/error.log`。

Django部署到服务器:常见问题与FAQ

1. 修改代码后如何更新?

直接重新拉代码,然后迁移和收集静态文件,重启uWSGI即可。

2. 如何设置自动重启?

使用`--touch-reload`选项,或者在systemd服务中设置`ExecReload`。

3. 遇到502错误怎么办?

检查socket文件权限、uWSGI进程是否运行,Nginx配置是否正确。

老司机 FAQ

Q1: Django部署到服务器时,静态文件404怎么排查?

A: 首先确认`STATIC_ROOT`路径和`STATIC_URL`设置正确,并且`collectstatic`已执行。然后检查Nginx的`location /static/`配置,路径要对应。最常见的是权限问题,确保`staticfiles`目录对Nginx用户可读。可以用`curl -I`测试。

Q2: 为什么uWSGI启动后,访问网站提示500?

A: 查看uWSGI日志,通常是Python依赖缺失或代码错误。检查虚拟环境是否正确激活,`requirements.txt`是否安装完整,以及`settings.py`中`ALLOWED_HOSTS`是否包含你的域名。另外,检查`DEBUG`是否为False,否则错误信息会显示。

Q3: Django部署到服务器,如何实现自动重启?

A: 最简单的是使用`--touch-reload`,当你修改代码后,touch一个文件(比如`reload.trigger`),uWSGI会自动重启。或者在systemd服务中,设置`ExecReload`,然后使用`sudo systemctl reload myproject`。更专业的可以使用supervisor或watchdog,但没必要。

老司机实战心得:

本文深度聚焦关键词 django部署到服务器, Django部署教程, uWSGI配置, Nginx配置Django, Django生产环境。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。