django部署到服务器,为啥总是一堆坑?
兄弟们,别以为django部署到服务器就是`python manage.py runserver`那么简单。实际上一堆人栽在这里:静态文件死活加载不出来、环境变量搞不对、数据库连接不上、权限问题、进程崩溃……说实话,我见过太多新手被这些坑折磨得头皮发麻。今天老司机就带你把django部署到服务器的每个环节都踩一遍,让你少走弯路。
一、django部署到服务器,先搞懂底层逻辑
首先,你的django项目在本地跑得好好的,那是因为开发服务器帮你了。但生产环境讲究的是稳定和效率。你需要一个WSGI服务器(比如Gunicorn)来跟django交互,然后前面再挂一个反向代理(Nginx)来处理静态文件、负载均衡、HTTPS等。整个链路就是:Nginx -> Gunicorn -> Django。
为啥要Nginx? 因为Gunicorn处理静态文件能力很弱,而Nginx是静态文件的好手。而且,Nginx还能防止一些攻击,比如慢速请求。
二、实战:django部署到服务器的步骤
好了,基础知识够了,直接开干。假设你用Ubuntu 20.04,Python 3.10,项目在/home/user/myproject。
2.1 环境准备
首先,更新系统,然后安装必要软件:
```bash
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv nginx -y
```
然后,进入项目目录,创建虚拟环境,安装依赖:
```bash
cd ~/myproject
python3 -m venv venv
source venv/bin/activate
pip install gunicorn psycopg2-binary
pip install -r requirements.txt
```
避坑:一定要用虚拟环境,别偷懒,不然依赖冲突会让你怀疑人生。
2.2 配置django项目
在settings.py中,做以下硬核配置:
```python
DEBUG = False
ALLOWED_HOSTS = ['your_domain.com', '服务器IP']
```
注意:DEBUG务必设为False,否则会暴露敏感信息。ALLOWED_HOSTS记得填全,不然没法访问。
另外,设置静态文件和媒体文件的路径:
```python
STATIC_ROOT = '/home/user/myproject/staticfiles'
MEDIA_ROOT = '/home/user/myproject/media'
```
然后执行:
```bash
python manage.py collectstatic
```
避坑:这里很容易漏,很多人忘记collectstatic,导致静态文件404。
2.3 配置Gunicorn
先测试一下Gunicorn能不能跑起来:
```bash
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
```
如果没问题,就创建系统服务,让Gunicorn后台运行。用systemd:
在`/etc/systemd/system/gunicorn.service`写入:
```ini
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=user
Group=www-data
WorkingDirectory=/home/user/myproject
ExecStart=/home/user/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
```
然后:
```bash
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
```
避坑:workers数量按CPU核数*2+1,别乱设。sock文件路径别搞错,权限要设置好。
2.4 配置Nginx
在`/etc/nginx/sites-available/myproject`写入:
```nginx
server {
listen 80;
server_name your_domain.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user/myproject;
}
location /media/ {
root /home/user/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/user/myproject/myproject.sock;
}
}
```
然后:
```bash
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
```
避坑:静态文件的路径要注意,上面配置的是`root /home/user/myproject`,然后`location /static/`会映射到`/home/user/myproject/static/`,所以你的`STATIC_ROOT`必须设置为`/home/user/myproject/static`,但collectstatic会生成到staticfiles,所以要么改root,要么改映射。这里我建议直接改settings,让STATIC_ROOT='/home/user/myproject/static',然后collectstatic,但注意别把原来的static覆盖了。更稳妥的做法是,STATIC_ROOT设为staticfiles,然后Nginx配置中location /static/的alias指向`/home/user/myproject/staticfiles/`。
2.5 数据库配置
最好用PostgreSQL,别用SQLite。安装:
```bash
sudo apt install postgresql libpq-dev -y
```
创建数据库和用户:
```bash
sudo -u postgres psql
CREATE DATABASE mydb;
CREATE USER myuser WITH PASSWORD 'mypass';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
```
然后在settings中配置:
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypass',
'HOST': 'localhost',
'PORT': '',
}
}
```
然后迁移:
```bash
python manage.py makemigrations
python manage.py migrate
```
避坑:数据库密码别写死在settings里,用环境变量。后面会说。
2.6 环境变量管理
别把密钥明文写在代码里。用`python-dotenv`或直接在systemd服务中设置。推荐用`environment`变量:
在gunicorn.service中:
```ini
Environment="SECRET_KEY=your-secret-key"
Environment="DB_NAME=mydb"
Environment="DB_USER=myuser"
Environment="DB_PASSWORD=mypass"
```
然后在settings中读取环境变量。这样万一代码泄露,密钥也安全。
三、django部署到服务器的大坑与解决方案
坑1:静态文件404
这个最常见。检查一下:
- 是否执行了`collectstatic`?
- Nginx的路径配置是否正确?
- 是否给了Nginx读取权限?
有时候,用户目录权限不行,需要`chmod o+x /home/user`。
坑2:502 Bad Gateway
这通常是Gunicorn没跑起来,或者sock文件权限不对。检查一下服务状态:
```bash
sudo systemctl status gunicorn
```
看日志:`journalctl -u gunicorn`。
如果权限不对,把user加到www-data组:
```bash
sudo usermod -a -G www-data user
```
并确保目录对www-data可读。
坑3:数据库连接失败
检查数据库服务是否启动,用户权限是否正确。如果内存不够,可能连不上。
坑4:提高性能的一些建议
- 使用CDN加速静态文件。
- 设置Gunicorn的workers为2-4即可,多了反而耗内存。
- 开启Nginx gzip压缩。
- 使用HTTPS,申请Let's Encrypt免费证书。
总结
django部署到服务器,其实就是这么回事。别被复杂的过程吓到,按部就班,每一步验证。最关键的还是要动手做,踩过坑才能记住。我把经验都分享出来了,剩下的看你了。如果你还有问题,翻翻下面的FAQ。
老司机FAQ
Q1:django部署到服务器,用uWSGI好还是Gunicorn好?
A:说实话,我推荐Gunicorn。因为配置简单,性能也不差,而且用的人多,社区教程多。uWSGI功能强大,但配置复杂,容易把自己绕晕。如果你的项目很大,需要定制,可以考虑uWSGI,但一般项目Gunicorn足够了。
Q2:django部署到服务器,静态文件加载不出来怎么办?
A:先确认你有没有执行collectstatic,然后检查Nginx配置。重点看路径是否匹配,权限是否正确。记住,Nginx是sudo运行,而你的项目可能在home目录,所以需要chmod o+x /home/user,否则Nginx无法访问。另外,如果用了STATIC_ROOT='/srv/myproject/static/',就要确保Nginx的root指向/srv/myproject。总之,静下心一步步查。
Q3:django部署到服务器时,遇到502错误,如何快速排查?
A:先看Nginx错误日志:`sudo tail -f /var/log/nginx/error.log`。如果是“connect() failed (111: Connection refused) while connecting to upstream”,说明Gunicorn没跑起来,查看Gunicorn状态和日志。如果显示“permission denied”,那是sock文件权限问题,把用户加入www-data组。如果Gunicorn正常,那就可能配置有问题。总之,逐步排查,日志是宝。
本文深度聚焦关键词 django部署到服务器, django部署, Nginx+Gunicorn, django服务器部署教程。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。