老铁们,今天咱们聊聊Django部署到服务器这档子事。别以为跑个runserver就万事大吉了,那是开发环境,生产环境分分钟教你做人。我混迹互联网15年,见过太多人在这上面折戟沉沙。今天我就把压箱底的干货掏出来,给你一份避坑指南,看完你就能稳稳当当把Django项目送上线。
Django部署到服务器的核心三件套:Gunicorn、Nginx、supervisor
Django部署到服务器为什么不能用runserver?
先说说为什么runserver不行。runserver是Django自带的开发服务器,单线程,性能拉胯,而且没有经过安全加固。生产环境你要是敢直接用,分分钟被流量打爆,或者被黑客盯上。所以,我们需要用专业的WSGI服务器来跑Django应用,最主流的就是Gunicorn。
Gunicorn是一个Python写的WSGI HTTP服务器,专门用来跑Python web应用。它支持多进程,性能强劲,而且配置简单。但是,Gunicorn自己不能处理静态文件,而且直接暴露在外网也不安全,所以我们还需要一个反向代理服务器,就是Nginx。Nginx负责接收用户请求,把动态请求转发给Gunicorn,静态请求直接自己处理。
Django部署到服务器实战配置:一步步来
首先,你得有个服务器,Ubuntu或者CentOS都行。我用的是Ubuntu 20.04,例子基于这个。
1. 安装Python和虚拟环境:
```bash
sudo apt update
sudo apt install python3-pip python3-venv nginx
```
然后创建虚拟环境:
```bash
cd /var/www
mkdir myproject
cd myproject
python3 -m venv venv
source venv/bin/activate
```
2. 安装Gunicorn:
```bash
pip install gunicorn
```
3. 配置Gunicorn:
运行你的Django项目,确保依赖装好。然后测试Gunicorn:
```bash
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
```
没问题的话,接下来用supervisor管理Gunicorn进程,防止意外退出。
4. 配置Nginx:
新建一个站点配置文件:
```bash
sudo nano /etc/nginx/sites-available/myproject
```
内容如下:
```nginx
server {
listen 80;
server_name yourdomain.com;
location /static/ {
alias /var/www/myproject/static/;
}
location /media/ {
alias /var/www/myproject/media/;
}
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
然后启用站点,重启Nginx。
5. 管理静态文件:
在Django的settings.py中设置:
```python
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
```
执行`python manage.py collectstatic`收集所有静态文件到STATIC_ROOT。
Django部署到服务器常见坑:老司机带你绕过去
坑1:静态文件404
很多人部署完,打开网页,样式全丢了。原因就是没配置好Nginx的静态文件路径,或者Django的STATIC_ROOT没设对。记住,Nginx的alias路径一定要和STATIC_ROOT一致,而且目录权限要放开。
坑2:Gunicorn跑不起来
常见的错误是`gunicorn: command not found`,这是因为你没在虚拟环境里安装,或者没激活虚拟环境。激活虚拟环境,然后pip install gunicorn。如果出现端口被占用,检查一下是不是有进程占用了8000端口。
坑3:数据库连接不上去
生产环境一般用PostgreSQL或者MySQL,别再用SQLite了。改DB配置后,记得执行`python manage.py migrate`。还有,数据库的密码不要写在settings.py里,最好用环境变量。
坑4:上传文件不显示
MEDIA文件也是一样,Nginx配置里要有/media/的location,并且指向你的MEDIA_ROOT。
坑5:性能优化不够
默认的Gunicorn配置可能不够用。建议设置workers为CPU核心数的2-3倍,比如`--workers 3`。还可以加`--threads 2`开启多线程。另外,开启gzip压缩,在Nginx里配置。
Django部署到服务器安全加固:不能只求跑起来
开启HTTPS:Let's Encrypt免费证书
用certbot一键配置HTTPS。
```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com
```
自动续期:
```bash
sudo certbot renew --dry-run
```
环境变量管理
不要把SECRET_KEY、数据库密码硬编码在settings.py里,很容易泄露。用django-environ或python-decouple,从.env文件读取。
限制IP,防止恶意请求
在Nginx中可以配置allow/deny,或者用`limit_req`防刷。
Django部署到服务器扩展:当项目变大怎么办?
使用Docker容器化
Docker把环境和代码打包,部署更简单。但需要注意,容器内跑多个进程要特别处理,一般用gunicorn单独跑,Nginx可以在另一个容器或者宿主机。
使用负载均衡器
当流量大了,可以加一层负载均衡,比如HAProxy,或者云服务商的LB。
验证Django部署到服务器是否成功
部署完后,用curl测试一下响应头,看看Server字段是不是Nginx,检查静态文件是否返回200。
```bash
curl -I http://yourdomain.com
```
然后访问你的域名,看看有没有跳转到HTTPS,页面显示是否正常。
最后,别忘了监控日志,日志是你找问题的最好伙伴。
老司机 FAQ
问:Django部署到服务器,为什么我改了代码后,页面没变化?
答:因为Gunicorn不会自动重载代码,你需要手动重启Gunicorn进程。用supervisor的话,执行`sudo supervisorctl restart myproject`。也可以加`--reload`参数,但生产环境不建议,影响性能。
问:Django部署到服务器,静态文件收集后为什么还是404?
答:检查Nginx的alias路径是否写对,有没有给nginx用户读权限。用`ls -l /var/www/myproject/static`看看权限。另外,确认STATIC_ROOT和STATIC_URL在settings.py里配置正确,并且collectstatic执行了。
问:Django部署到服务器,用Docker部署时,环境变量怎么管理?
答:在Docker Compose中用environment或者env_file。但注意,secret key这类敏感信息千万别写在docker-compose.yml里,用环境变量文件,并在.gitignore里忽略。
本文深度聚焦关键词 django部署到服务器,Gunicorn,Nginx,静态文件,避坑指南。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。