django部署到服务器,先搞懂这几点

很多新手把django部署到服务器,以为复制代码就完事。醒醒!部署不是过家家,你面对的是生产环境。老司机今天不扯虚的,直接上干货,从底层逻辑到避坑指南,手把手教你优雅地把django项目拎上线。

部署环境:别用Windows当服务器

首先,别想着用Windows服务器跑django,除非你想自虐。Linux(Ubuntu/CentOS)是主流,不仅稳定,而且各种工具链齐全。老司机推荐Ubuntu 20.04/22.04 LTS,不折腾。

项目准备:虚拟环境和依赖锁死

在本地,用venv或者pipenv创建虚拟环境,然后导出requirements.txt。注意,必须锁死版本号,别用>=这种,否则上线当天就是翻车现场。

```bash

pip freeze > requirements.txt

```

这个文件就是你的护身符,保证服务器上安装的依赖和本地一致。

django部署到服务器的核心三件套

Gunicorn:不是用runserver

生产环境千万别用python manage.py runserver,那是开发玩具。用Gunicorn,一个高性能的WSGI服务器。

安装:

```bash

pip install gunicorn

```

启动(在项目目录下):

```bash

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

```

这里注意,myproject换成你的项目名。绑定本地地址,别直接绑定公网,后面有Nginx挡子弹。

Nginx:反向代理和静态文件

Nginx是前台的保安,接收用户请求,转发给Gunicorn,并且处理静态文件。

安装:

```bash

sudo apt install nginx

```

配置一个`/etc/nginx/sites-available/myproject`文件:

```nginx

server {

listen 80;

server_name your_domain_or_ip;

location /static/ {

alias /path/to/your/staticfiles/;

}

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;

}

}

```

然后启用站点:

```bash

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/

sudo nginx -t

sudo systemctl reload nginx

```

静态文件收集大坑

django的静态文件是个坑。在settings.py里,设置`STATIC_ROOT`,然后运行`python manage.py collectstatic`,把静态文件收集到指定目录,否则Nginx找不到,样式全丢。

数据库:从SQLite换到PostgreSQL

别用SQLite生产,分分钟锁库。换PostgreSQL,功能强,性能好。

安装:

```bash

sudo apt install postgresql postgresql-contrib

sudo -u postgres createuser --interactive

sudo -u postgres createdb mydb

```

在django的settings.py里配置:

```python

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.postgresql',

'NAME': 'mydb',

'USER': 'myuser',

'PASSWORD': 'password',

'HOST': 'localhost',

'PORT': '5432',

}

}

```

记得安装适配器:`pip install psycopg2-binary`。

部署流程实战:一条龙服务

第一步:上传代码和依赖

用Git或者SCP把项目传到服务器,进入虚拟环境,安装依赖:

```bash

pip install -r requirements.txt

```

第二步:环境变量管理

别把SECRET_KEY、数据库密码写在代码里,用环境变量。在项目目录下创建`.env`文件(记得加入.gitignore),然后用`python-dotenv`或者`django-environ`加载。

第三步:迁移和静态文件

```bash

python manage.py makemigrations

python manage.py migrate

python manage.py collectstatic --noinput

```

第四步:测试Gunicorn

启动Gunicorn,看能否正常访问:

```bash

gunicorn myproject.wsgi --bind 127.0.0.1:8000

```

然后在浏览器访问服务器IP:8000,如果能看到页面,说明应用正常。

第五步:配置Nginx代理

按上面的Nginx配置,然后重启Nginx。这时访问80端口,应该OK。

第六步:守护进程

用systemd来管理Gunicorn,让它常驻后台,开机自启。创建`/etc/systemd/system/gunicorn.service`:

```ini

[Unit]

Description=gunicorn daemon

After=network.target

[Service]

User=www-data

Group=www-data

WorkingDirectory=/path/to/your/project

ExecStart=/path/to/your/venv/bin/gunicorn --workers 3 --bind unix:/path/to/your/project.sock myproject.wsgi:application

[Install]

WantedBy=multi-user.target

```

启用:

```bash

sudo systemctl start gunicorn

sudo systemctl enable gunicorn

```

注意,这里用Unix Socket,性能更好,Nginx也改成`proxy_pass http://unix:/path/to/your/project.sock;`

安全加固:别裸奔上线

关闭调试模式

`DEBUG=False`,否则错误信息泄露,很危险。

设置ALLOWED_HOSTS

只允许你的域名或IP,其他一律拒绝。

HTTPS加身

用Let's Encrypt免费证书,安装Certbot,一句命令搞定:

```bash

sudo certbot --nginx -d yourdomain.com

```

限制数据库访问

数据库只允许localhost,远程连接一律禁止,除非你有特殊情况。

常见坑和解决方案

静态文件404

检查Nginx的alias路径,确保`STATIC_ROOT`和配置路径一致。

上传文件权限

Mediastore目录需要写权限,`chmod 755`,并且属主改成运行用户。

迁移时表已存在

`python manage.py migrate --fake-initial`,但前提是表结构确实一致,别乱用。

老司机 FAQ

问:django部署到服务器时,为什么运行collectstatic后,样式还是不显示?

答:多半是Nginx配置问题。检查三点:1) `STATIC_ROOT`设置正确;2) Nginx的location /static/配置的alias路径无误;3) 确保alias路径有读取权限。别用root,用`www-data`或你的运行用户。

问:Gunicorn启动后,访问IP:8000很慢,怎么回事?

答:别用8000直接访问,没经Nginx,那是裸奔。慢可能是因为没启用Gzip,Nginx配置里加`gzip on;`。另外,检查数据库查询,是否有N+1问题。老司机建议用Django Debug Toolbar先在本地排查。

问:部署时数据库要不要迁移到PostgreSQL?

答:必须的。SQLite在生产环境就是个坑,并发一高就锁库。用PostgreSQL,然后注意迁移时先备份数据,用`dumpdata`导出,再在新库`loaddata`。别直接复制数据库文件,格式不兼容。

最后说一句,django部署到服务器不是一次性的活儿,上线后要监控日志,设置定时重启。老司机的经验就是多踩坑,多总结。别怕,照这个指南走,稳。

老司机实战心得:

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