Django部署到服务器:别被那些花里胡哨的教程骗了

兄弟们,今天咱们聊聊django部署到服务器这档子事。网上教程一堆,但大多是纸上谈兵,真到自己动手,坑多到能埋人。老司机我搞这行15年,踩过的坑比你吃过的盐都多,今天直接给你上干货,把django部署到服务器这件事掰开揉碎了讲清楚。

为什么你的Django项目总是部署失败?

很多新手喜欢把django部署到服务器跟本地跑通划等号,大错特错!本地用runserver跑得欢,一上服务器就各种404、500,为啥?因为生产环境和开发环境完全是两码事。你缺的不是代码,是生产环境下的部署思维。

核心问题就仨:

1. 进程管理:runserver是单进程的,根本扛不住生产流量,你得用Gunicorn或uWSGI。

2. 静态文件:Django自己处理静态文件在开发时没问题,但生产环境得交给Nginx,不然性能拖垮你。

3. 环境变量:密钥、数据库密码你敢明文写在settings.py里?等着被日吧。

今天这文章,就是带你逐个击破,把django部署到服务器整得明明白白。

django部署到服务器:准备工作不能含糊

1. 服务器选型与基础配置

别贪便宜买那种1核1G的机子,跑个Django + PostgreSQL + Redis,内存扛不住,迟早卡死。建议至少2核4G,系统用Ubuntu 20.04或22.04 LTS,稳。

登录服务器后,第一件事就是更新系统:

```bash

sudo apt update && sudo apt upgrade -y

```

创建部署用户,别用root直接跑应用:

```bash

sudo adduser deployer

sudo usermod -aG sudo deployer

```

2. 安装Python和虚拟环境

现在Python 3.10+是标配,别用3.6了,Django新特性用不上。用deadsnakes PPA装个最新稳定版。

```bash

sudo apt install python3.10 python3.10-venv python3.10-dev

```

接着创建虚拟环境:

```bash

python3.10 -m venv venv

source venv/bin/activate

```

3. 代码上传与依赖安装

别再用FTP传代码了,土不土?用Git。服务器上装个git,clone你的项目仓库。

```bash

git clone https://github.com/yourname/yourproject.git

cd yourproject

pip install -r requirements.txt

```

注意: requirements.txt一定要锁定版本,别装最新版,分分钟兼容性爆炸。

4. 环境变量管理

敏感信息必须用环境变量。本地开发用django-environ,服务器上可以配合systemd的EnvironmentFile。

```bash

pip install django-environ

```

在settings.py里加:

```python

import environ

env = environ.Env()

environ.Env.read_env('.env')

```

然后在项目根目录创建.env文件,把密钥、数据库密码写进去。记得加进.gitignore。

django部署到服务器:核心步骤实战

Gunicorn:让你的Django项目跑起来

Gunicorn是Python的WSGI服务器,生产环境跑它准没错。安装:

```bash

pip install gunicorn

```

先测试一下能不能跑:

```bash

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

```

如果访问IP:8000能看到页面,说明成功了。但这样跑在前台,关掉SSH就没了,得用systemd守护进程。

用systemd管理Gunicorn进程

创建服务文件:

```bash

sudo nano /etc/systemd/system/gunicorn.service

```

内容如下:

```ini

[Unit]

Description=gunicorn daemon

After=network.target

[Service]

User=deployer

Group=www-data

WorkingDirectory=/home/deployer/yourproject

EnvironmentFile=/home/deployer/yourproject/.env

ExecStart=/home/deployer/yourproject/venv/bin/gunicorn --workers 3 --bind unix:/home/deployer/yourproject/myproject.sock myproject.wsgi:application

[Install]

WantedBy=multi-user.target

```

注意: Workers数一般设为CPU核数*2+1,但别贪多,内存也要考虑。这里用socket通信,别用端口,性能更好。

启用并启动:

```bash

sudo systemctl enable gunicorn

sudo systemctl start gunicorn

```

Nginx:反向代理与静态文件处理

Nginx是前哨,所有外部请求先经过它,再转发给Gunicorn。

```bash

sudo apt install nginx

```

配置站点:

```bash

sudo nano /etc/nginx/sites-available/myproject

```

内容:

```nginx

server {

listen 80;

server_name yourdomain.com;

location /static/ {

alias /home/deployer/yourproject/staticfiles/;

}

location /media/ {

alias /home/deployer/yourproject/media/;

}

location / {

proxy_pass http://unix:/home/deployer/yourproject/myproject.sock;

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

```

静态文件收集

别忘了收集静态文件,不然CSS、JS全挂了。

```bash

python manage.py collectstatic --noinput

```

坑: 如果使用Whitenoise,就不需要Nginx管静态文件了,性能也还行。但老司机建议还是交给Nginx,更干净。

数据库迁移与初始化

部署后别忘了跑迁移:

```bash

python manage.py migrate

```

别偷懒,生产数据库结构变了,不迁移等着报错吧。

django部署到服务器:避坑建议(老司机血的教训)

1. 别用SQLite,用PostgreSQL

SQLite在本地爽,上了服务器就是噩梦,并发一高直接锁库。换PostgreSQL,稳定高效。

2. 关闭DEBUG模式

settings.py里DEBUG必须设为False,不然错误信息全暴露给用户,安全漏洞大大的。

3. 处理允许的域名

ALLOWED_HOSTS设为你的域名或IP,不然请求直接拒。

4. 使用HTTPS

现在你用HTTP,浏览器直接标不安全。用Let's Encrypt免费证书,配上Certbot,一键搞定。

5. 日志监控

部署完别不管,配置日志轮转,用logrotate,不然磁盘爆了别怪我没提醒你。

还有,定期检查Gunicorn和Nginx的日志,$ tail -f /var/log/nginx/error.log,及时发现问题。

老司机 FAQ

Q1: Django部署到服务器后,静态文件404怎么办?

A: 先检查collectstatic有没有执行,并且STATIC_ROOT路径是否正确。然后确认Nginx配置中的location /static/的alias路径跟STATIC_ROOT是否一致。注意alias和root的区别,alias后面要跟实际路径,root则是拼接。另外,别忘了重启Nginx让配置生效。

Q2: 部署到服务器后,访问出现502 Bad Gateway,怎么排查?

A: 502说明Nginx连不上Gunicorn。先检查Gunicorn进程是否存活,$ sudo systemctl status gunicorn。如果挂了,看日志$ journalctl -u gunicorn。常见原因是socket文件权限不对,或WorkingDirectory、EnvironmentFile路径错误。还要确保Nginx配置中的proxy_pass的socket路径跟Gunicorn的–bind参数一致。最后,别忘了用nginx -t测试配置,并reload Nginx。

Q3: Django部署到服务器,性能优化有哪些要点?

A: 首先,Gunicorn的workers数要合理,太多内存爆炸,太少CPU闲置。其次,开启Django的缓存,用Redis或Memcached,别用LocMemCache。还有,数据库连接池用pgbouncer之类的。另外,静态文件交给Nginx,千万别用Django处理。最后,开启Gzip压缩,Nginx那边配好。

老司机实战心得:

本文深度聚焦关键词 django部署到服务器,django部署,django生产环境,Gunicorn,Nginx。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。