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服务器部署教程。在技术迭代飞快的今天,唯有坚持原创和实战,才能在搜索引擎的博弈中立于不败之地。如有疑问,欢迎在后台交流。