django部署到服务器,先搞懂这几点
很多新手把django部署到服务器,以为复制代码就完事。醒醒!部署不是过家家,你面对的是生产环境。老司机今天不扯虚的,直接上干货,从底层逻辑到避坑指南,手把手教你优雅地把django项目拎上线。
部署环境:别用Windows当服务器
首先,别想着用Windows服务器跑django,除非你想自虐。Linux(Ubuntu/CentOS)是主流,不仅稳定,而且各种工具链齐全。老司机推荐Ubuntu 20.04/22.04 LTS,不折腾。
项目准备:虚拟环境和依赖锁死
在本地,用venv或者pipenv创建虚拟环境,然后导出requirements.txt。注意,必须锁死版本号,别用>=这种,否则上线当天就是翻车现场。
```bash
pip freeze > requirements.txt
```
这个文件就是你的护身符,保证服务器上安装的依赖和本地一致。
django部署到服务器的核心三件套
Gunicorn:不是用runserver
生产环境千万别用python manage.py runserver,那是开发玩具。用Gunicorn,一个高性能的WSGI服务器。
安装:
```bash
pip install gunicorn
```
启动(在项目目录下):
```bash
gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
```
这里注意,myproject换成你的项目名。绑定本地地址,别直接绑定公网,后面有Nginx挡子弹。
Nginx:反向代理和静态文件
Nginx是前台的保安,接收用户请求,转发给Gunicorn,并且处理静态文件。
安装:
```bash
sudo apt install nginx
```
配置一个`/etc/nginx/sites-available/myproject`文件:
```nginx
server {
listen 80;
server_name your_domain_or_ip;
location /static/ {
alias /path/to/your/staticfiles/;
}
location / {
proxy_pass http://127.0.0.1:8000;
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
```
静态文件收集大坑
django的静态文件是个坑。在settings.py里,设置`STATIC_ROOT`,然后运行`python manage.py collectstatic`,把静态文件收集到指定目录,否则Nginx找不到,样式全丢。
数据库:从SQLite换到PostgreSQL
别用SQLite生产,分分钟锁库。换PostgreSQL,功能强,性能好。
安装:
```bash
sudo apt install postgresql postgresql-contrib
sudo -u postgres createuser --interactive
sudo -u postgres createdb mydb
```
在django的settings.py里配置:
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '5432',
}
}
```
记得安装适配器:`pip install psycopg2-binary`。
部署流程实战:一条龙服务
第一步:上传代码和依赖
用Git或者SCP把项目传到服务器,进入虚拟环境,安装依赖:
```bash
pip install -r requirements.txt
```
第二步:环境变量管理
别把SECRET_KEY、数据库密码写在代码里,用环境变量。在项目目录下创建`.env`文件(记得加入.gitignore),然后用`python-dotenv`或者`django-environ`加载。
第三步:迁移和静态文件
```bash
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --noinput
```
第四步:测试Gunicorn
启动Gunicorn,看能否正常访问:
```bash
gunicorn myproject.wsgi --bind 127.0.0.1:8000
```
然后在浏览器访问服务器IP:8000,如果能看到页面,说明应用正常。
第五步:配置Nginx代理
按上面的Nginx配置,然后重启Nginx。这时访问80端口,应该OK。
第六步:守护进程
用systemd来管理Gunicorn,让它常驻后台,开机自启。创建`/etc/systemd/system/gunicorn.service`:
```ini
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/your/venv/bin/gunicorn --workers 3 --bind unix:/path/to/your/project.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
```
启用:
```bash
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
```
注意,这里用Unix Socket,性能更好,Nginx也改成`proxy_pass http://unix:/path/to/your/project.sock;`
安全加固:别裸奔上线
关闭调试模式
`DEBUG=False`,否则错误信息泄露,很危险。
设置ALLOWED_HOSTS
只允许你的域名或IP,其他一律拒绝。
HTTPS加身
用Let's Encrypt免费证书,安装Certbot,一句命令搞定:
```bash
sudo certbot --nginx -d yourdomain.com
```
限制数据库访问
数据库只允许localhost,远程连接一律禁止,除非你有特殊情况。
常见坑和解决方案
静态文件404
检查Nginx的alias路径,确保`STATIC_ROOT`和配置路径一致。
上传文件权限
Mediastore目录需要写权限,`chmod 755`,并且属主改成运行用户。
迁移时表已存在
`python manage.py migrate --fake-initial`,但前提是表结构确实一致,别乱用。
老司机 FAQ
问:django部署到服务器时,为什么运行collectstatic后,样式还是不显示?
答:多半是Nginx配置问题。检查三点:1) `STATIC_ROOT`设置正确;2) Nginx的location /static/配置的alias路径无误;3) 确保alias路径有读取权限。别用root,用`www-data`或你的运行用户。
问:Gunicorn启动后,访问IP:8000很慢,怎么回事?
答:别用8000直接访问,没经Nginx,那是裸奔。慢可能是因为没启用Gzip,Nginx配置里加`gzip on;`。另外,检查数据库查询,是否有N+1问题。老司机建议用Django Debug Toolbar先在本地排查。
问:部署时数据库要不要迁移到PostgreSQL?
答:必须的。SQLite在生产环境就是个坑,并发一高就锁库。用PostgreSQL,然后注意迁移时先备份数据,用`dumpdata`导出,再在新库`loaddata`。别直接复制数据库文件,格式不兼容。
最后说一句,django部署到服务器不是一次性的活儿,上线后要监控日志,设置定时重启。老司机的经验就是多踩坑,多总结。别怕,照这个指南走,稳。
本文深度聚焦关键词 django部署到服务器,django部署,django服务器部署,Gunicorn配置,Nginx反向代理,PostgreSQL迁移。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。