Django部署到服务器:为什么你总是不成功?
兄弟们,是不是每次照着网上的教程部署Django,总是卡在某个地方?要么是静态文件加载不出来,要么是Python版本不对,要么是数据库连接失败。今天老司机就带你走一遍完整流程,直接把坑给你填平,让你的Django项目稳稳上线。
准备工作:服务器和Python环境
首先,你得有一台服务器,推荐Ubuntu 20.04或22.04,别用CentOS,坑太多。这里假设你已经有root权限。
1. 更新系统
```bash
sudo apt update && sudo apt upgrade -y
```
2. 安装Python和虚拟环境
Python3.8以上版本最佳,建议装3.10或3.11。直接装python3-venv和nginx等。
```bash
sudo apt install python3-pip python3-venv nginx -y
```
3. 创建项目目录
```bash
mkdir -p /var/www/myproject && cd /var/www/myproject
```
部署代码:别用FTP,Git才是王道
1. 克隆项目
```bash
git clone https://your-repo.git .
```
2. 创建虚拟环境
```bash
python3 -m venv venv
source venv/bin/activate
```
3. 安装依赖
```bash
pip install -r requirements.txt
```
注意:如果你的项目里没有requirements.txt,赶紧用`pip freeze > requirements.txt`生成。
配置数据库:别用SQLite,上PostgreSQL
SQLite在开发时用用就行,生产环境必须上PostgreSQL,不然并发一高就崩。
1. 安装PostgreSQL
```bash
sudo apt install postgresql postgresql-contrib -y
```
2. 创建数据库和用户
```bash
sudo -u postgres psql
CREATE DATABASE mydb;
CREATE USER myuser WITH PASSWORD 'mypassword';
ALTER ROLE myuser SET client_encoding TO 'utf8';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
\q
```
3. 修改Django配置
在settings.py里改为:
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
```
然后执行迁移:
```bash
python manage.py migrate
```
静态文件和媒体文件:别踩这个坑
1. 收集静态文件
在settings.py中设置:
```python
STATIC_ROOT = '/var/www/myproject/static'
STATIC_URL = '/static/'
```
然后运行:
```bash
python manage.py collectstatic
```
2. 媒体文件
设置MEDIA_ROOT和MEDIA_URL,同样上传目录。
```python
MEDIA_ROOT = '/var/www/myproject/media'
MEDIA_URL = '/media/'
```
3. 别忘了nginx配置,下面会讲到。
配置Gunicorn:你的应用服务器
Gunicorn是个简单的WSGI服务器,专门跑Django。
1. 安装
```bash
pip install gunicorn
```
2. 测试启动
```bash
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
```
如果没问题,Ctrl+C停止。
3. 创建systemd服务
这样服务器重启后自动运行。
```bash
sudo nano /etc/systemd/system/gunicorn.service
```
内容如下:
```ini
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/gunicorn --workers 3 --bind unix:/var/www/myproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
```
然后启动:
```bash
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
```
配置Nginx:反向代理和静态文件
Nginx负责处理静态文件,以及把请求转发给Gunicorn。
1. 配置站点
```bash
sudo nano /etc/nginx/sites-available/myproject
```
内容:
```nginx
server {
listen 80;
server_name your_domain_or_ip;
location /static/ {
alias /var/www/myproject/static/;
}
location /media/ {
alias /var/www/myproject/media/;
}
location / {
include proxy_params;
proxy_pass http://unix:/var/www/myproject/myproject.sock;
}
}
```
2. 启用站点
```bash
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```
常见问题与避坑指南
1. 静态文件404
检查nginx的alias路径是否对,确保collectstatic已经执行。
2. ALLOWED_HOSTS
别忘了在settings.py里加上你的域名或IP,不然会报错。
3. 权限问题
确保`/var/www/myproject`目录归属www-data用户,否则读写会失败。
4. 使用HTTPS
现在不搞HTTPS都不好意思,用Let's Encrypt免费证书,装个certbot,几分钟搞定。
5. 部署后代码更新
每次更新代码,直接git pull,然后重启gunicorn和nginx:
```bash
sudo systemctl restart gunicorn nginx
```
别用python manage.py runserver,那只是开发用的。
老司机 FAQ
问:Django部署到服务器时,为什么我执行collectstatic后,静态文件还是404?
答:兄弟,你八成是nginx配置的alias路径写错了。记得要在location /static/ 里用alias指向你真实的static目录,别忘了末尾的斜杠。另外,确保你的STATIC_ROOT和alias路径一致。
问:Django部署到服务器时,用runserver和gunicorn有什么本质区别?
答:runserver是Django自带的开发服务器,它处理静态文件,但不适合生产环境,性能差且不安全。Gunicorn是一个独立的Python WSGI服务器,专门用于生产,配合Nginx做反向代理,能处理高并发,而且静态文件交给Nginx,效率高得多。
问:Django部署到服务器时,如何防止数据库被SQL注入?
答:Django的ORM本身就有参数化查询,只要你别用原生的字符串拼接,一般不会中招。另外,一定不要把数据库密码硬编码在settings.py里,用环境变量。还有,数据库用户权限要严格,只给必要的权限,别用root。
就这样,部署其实不复杂,按照步骤来,半小时搞定。有问题评论区见,老司机带你飞!
本文深度聚焦关键词 django部署到服务器,Django服务器部署,nginx gunicorn django, django 部署 实战, django 上线 避坑。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。