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