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