老铁们,今天咱们聊聊Django部署到服务器这档子事。别以为跑个runserver就万事大吉了,那是开发环境,生产环境分分钟教你做人。我混迹互联网15年,见过太多人在这上面折戟沉沙。今天我就把压箱底的干货掏出来,给你一份避坑指南,看完你就能稳稳当当把Django项目送上线。

Django部署到服务器的核心三件套:Gunicorn、Nginx、supervisor

Django部署到服务器为什么不能用runserver?

先说说为什么runserver不行。runserver是Django自带的开发服务器,单线程,性能拉胯,而且没有经过安全加固。生产环境你要是敢直接用,分分钟被流量打爆,或者被黑客盯上。所以,我们需要用专业的WSGI服务器来跑Django应用,最主流的就是Gunicorn。

Gunicorn是一个Python写的WSGI HTTP服务器,专门用来跑Python web应用。它支持多进程,性能强劲,而且配置简单。但是,Gunicorn自己不能处理静态文件,而且直接暴露在外网也不安全,所以我们还需要一个反向代理服务器,就是Nginx。Nginx负责接收用户请求,把动态请求转发给Gunicorn,静态请求直接自己处理。

Django部署到服务器实战配置:一步步来

首先,你得有个服务器,Ubuntu或者CentOS都行。我用的是Ubuntu 20.04,例子基于这个。

1. 安装Python和虚拟环境

```bash

sudo apt update

sudo apt install python3-pip python3-venv nginx

```

然后创建虚拟环境:

```bash

cd /var/www

mkdir myproject

cd myproject

python3 -m venv venv

source venv/bin/activate

```

2. 安装Gunicorn

```bash

pip install gunicorn

```

3. 配置Gunicorn

运行你的Django项目,确保依赖装好。然后测试Gunicorn:

```bash

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

```

没问题的话,接下来用supervisor管理Gunicorn进程,防止意外退出。

4. 配置Nginx

新建一个站点配置文件:

```bash

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

```

内容如下:

```nginx

server {

listen 80;

server_name yourdomain.com;

location /static/ {

alias /var/www/myproject/static/;

}

location /media/ {

alias /var/www/myproject/media/;

}

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;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

```

然后启用站点,重启Nginx。

5. 管理静态文件

在Django的settings.py中设置:

```python

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

```

执行`python manage.py collectstatic`收集所有静态文件到STATIC_ROOT。

Django部署到服务器常见坑:老司机带你绕过去

坑1:静态文件404

很多人部署完,打开网页,样式全丢了。原因就是没配置好Nginx的静态文件路径,或者Django的STATIC_ROOT没设对。记住,Nginx的alias路径一定要和STATIC_ROOT一致,而且目录权限要放开。

坑2:Gunicorn跑不起来

常见的错误是`gunicorn: command not found`,这是因为你没在虚拟环境里安装,或者没激活虚拟环境。激活虚拟环境,然后pip install gunicorn。如果出现端口被占用,检查一下是不是有进程占用了8000端口。

坑3:数据库连接不上去

生产环境一般用PostgreSQL或者MySQL,别再用SQLite了。改DB配置后,记得执行`python manage.py migrate`。还有,数据库的密码不要写在settings.py里,最好用环境变量。

坑4:上传文件不显示

MEDIA文件也是一样,Nginx配置里要有/media/的location,并且指向你的MEDIA_ROOT。

坑5:性能优化不够

默认的Gunicorn配置可能不够用。建议设置workers为CPU核心数的2-3倍,比如`--workers 3`。还可以加`--threads 2`开启多线程。另外,开启gzip压缩,在Nginx里配置。

Django部署到服务器安全加固:不能只求跑起来

开启HTTPS:Let's Encrypt免费证书

用certbot一键配置HTTPS。

```bash

sudo apt install certbot python3-certbot-nginx

sudo certbot --nginx -d yourdomain.com

```

自动续期:

```bash

sudo certbot renew --dry-run

```

环境变量管理

不要把SECRET_KEY、数据库密码硬编码在settings.py里,很容易泄露。用django-environ或python-decouple,从.env文件读取。

限制IP,防止恶意请求

在Nginx中可以配置allow/deny,或者用`limit_req`防刷。

Django部署到服务器扩展:当项目变大怎么办?

使用Docker容器化

Docker把环境和代码打包,部署更简单。但需要注意,容器内跑多个进程要特别处理,一般用gunicorn单独跑,Nginx可以在另一个容器或者宿主机。

使用负载均衡器

当流量大了,可以加一层负载均衡,比如HAProxy,或者云服务商的LB。

验证Django部署到服务器是否成功

部署完后,用curl测试一下响应头,看看Server字段是不是Nginx,检查静态文件是否返回200。

```bash

curl -I http://yourdomain.com

```

然后访问你的域名,看看有没有跳转到HTTPS,页面显示是否正常。

最后,别忘了监控日志,日志是你找问题的最好伙伴。

老司机 FAQ

问:Django部署到服务器,为什么我改了代码后,页面没变化?

答:因为Gunicorn不会自动重载代码,你需要手动重启Gunicorn进程。用supervisor的话,执行`sudo supervisorctl restart myproject`。也可以加`--reload`参数,但生产环境不建议,影响性能。

问:Django部署到服务器,静态文件收集后为什么还是404?

答:检查Nginx的alias路径是否写对,有没有给nginx用户读权限。用`ls -l /var/www/myproject/static`看看权限。另外,确认STATIC_ROOT和STATIC_URL在settings.py里配置正确,并且collectstatic执行了。

问:Django部署到服务器,用Docker部署时,环境变量怎么管理?

答:在Docker Compose中用environment或者env_file。但注意,secret key这类敏感信息千万别写在docker-compose.yml里,用环境变量文件,并在.gitignore里忽略。

老司机实战心得:

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