Django 网站上线部署流程

Django 作者:Daemon | 发布时间:2026年6月10日 11:51 公开

一、购买服务器

本次部署使用的是:

腾讯云轻量应用服务器
地域:中国香港
系统:Ubuntu 22.04 LTS
配置:2核 2G / 40GB

选择香港服务器的原因:

不用备案
部署流程简单
适合个人学习项目

不选宝塔、WordPress、LAMP 这类应用镜像,而是选择:

系统镜像 Ubuntu

原因是可以完整练习真实部署流程:

GitHub 拉代码
Python 虚拟环境
Daphne 后台运行
Nginx 反向代理
域名解析
HTTPS 证书

二、服务器基础环境配置

登录服务器后,先更新系统并安装基础工具:

sudo apt update
sudo apt install -y python3 python3-pip python3-venv git nginx

检查版本:

python3 --version
git --version
nginx -v

这些工具的作用:

python3:运行 Django
pip:安装 Python 依赖
venv:创建虚拟环境
git:从 GitHub 拉代码
nginx:对外提供网站访问

三、从 GitHub 拉项目代码

先创建项目目录:

mkdir -p ~/projects
cd ~/projects

从 GitHub 拉取项目:

git clone 项目仓库地址
cd 项目目录

例如:

git clone https://github.com/xxx/my-study-site.git
cd my-study-site

四、创建虚拟环境并安装依赖

在项目目录中执行:

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

虚拟环境激活后,终端前面会出现:

(venv)

五、创建服务器环境变量文件

服务器上需要创建 .env 文件,用来保存生产环境配置。

例如:

DEBUG=False
SECRET_KEY=服务器自己的密钥
ALLOWED_HOSTS=服务器IP,localhost,127.0.0.1,域名,www.域名

注意:

SECRET_KEY 不要发给别人
.env 不要上传到 GitHub

六、初始化数据库和静态文件

执行数据库迁移:

python manage.py migrate

创建管理员账号:

python manage.py createsuperuser

收集静态文件:

python manage.py collectstatic

静态文件会被收集到:

staticfiles/

七、先用 runserver 临时测试

临时启动项目:

python manage.py runserver 0.0.0.0:8000

然后浏览器访问:

http://服务器IP:8000/

如果访问不了,要检查腾讯云防火墙是否开放:

TCP 8000

这个只是测试,正式部署不使用 runserver


八、配置 Daphne 后台运行

Django 项目正式运行使用 Daphne。

创建 systemd 服务文件:

sudo nano /etc/systemd/system/my-study-site.service

内容示例:

[Unit]
Description=My Study Site Daphne Service
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/projects/my-study-site
ExecStart=/home/ubuntu/projects/my-study-site/venv/bin/daphne -b 127.0.0.1 -p 8000 my_study_site.asgi:application
Restart=always

[Install]
WantedBy=multi-user.target

启动服务:

sudo systemctl daemon-reload
sudo systemctl start my-study-site
sudo systemctl enable my-study-site
sudo systemctl status my-study-site

看到:

active (running)

说明服务运行成功。


九、配置 Nginx 反向代理

创建 Nginx 配置文件:

sudo nano /etc/nginx/sites-available/my-study-site

示例配置:

server {
    listen 80;
    server_name 服务器IP 域名 www.域名;

    location /static/ {
        alias /home/ubuntu/projects/my-study-site/staticfiles/;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        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;
    }
}

启用配置:

sudo ln -s /etc/nginx/sites-available/my-study-site /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default

检查并重启 Nginx:

sudo nginx -t
sudo systemctl restart nginx

十、解决静态文件 403 问题

如果页面能打开,但是 CSS 没加载,并且访问 CSS 地址显示:

403 Forbidden

说明 Nginx 没权限读取静态文件。

执行:

sudo chmod o+x /home/ubuntu
sudo chmod o+x /home/ubuntu/projects
sudo chmod o+x /home/ubuntu/projects/my-study-site
sudo chmod -R 755 /home/ubuntu/projects/my-study-site/staticfiles
sudo nginx -t
sudo systemctl reload nginx

十一、购买域名

购买域名时选择普通域名即可,例如:

studylog.site

域名需要实名认证,但这不等于备案。

服务器在香港,一般不需要 ICP 备案。


十二、配置 DNS 解析

进入 DNSPod / DNS 解析页面,添加两条 A 记录:

主机记录:@
记录类型:A
记录值:服务器公网 IP
主机记录:www
记录类型:A
记录值:服务器公网 IP

作用:

域名.com        → 服务器 IP
www.域名.com    → 服务器 IP

十三、修改 Django 和 Nginx 域名配置

.env 中添加域名:

ALLOWED_HOSTS=服务器IP,localhost,127.0.0.1,域名,www.域名

Nginx 中修改:

server_name 服务器IP 域名 www.域名;

然后执行:

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart my-study-site

十四、配置 HTTPS

安装 Certbot:

sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot

申请 HTTPS 证书:

sudo certbot --nginx -d 域名 -d www.域名

中途选项:

是否同意协议:Y
是否接收邮件:N
是否跳转 HTTPS:Redirect

申请成功后,会看到类似:

Congratulations! You have successfully enabled HTTPS

测试自动续期:

sudo certbot renew --dry-run

如果出现:

all simulated renewals succeeded

说明自动续期正常。


十五、腾讯云防火墙最终保留端口

最终防火墙保留:

22    SSH 登录服务器
80    HTTP 访问 / 跳转 HTTPS
443   HTTPS 正式访问
Ping  可留可不留

正式上线后,测试用的:

8000

可以删除。


十六、HTTPS 后 CSRF 报错处理

如果登录、注册、发布笔记时报:

CSRF 验证失败

需要在 settings.py 中添加:

CSRF_TRUSTED_ORIGINS = [
    "https://域名",
    "https://www.域名",
]

SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

然后重启服务:

sudo systemctl restart my-study-site
sudo systemctl reload nginx

十七、以后更新网站的流程

以后主要在本地 PyCharm 修改代码,不直接在服务器上改代码。

本地修改后:

git add .
git commit -m "update"
git push

服务器更新:

cd ~/projects/my-study-site
git pull
source venv/bin/activate
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart my-study-site

如果只是改页面逻辑,可以只执行:

git pull
sudo systemctl restart my-study-site

如果改了 CSS / JS / 图片,要执行:

python manage.py collectstatic --noinput

如果改了 models.py,要执行:

python manage.py migrate

总结

完整部署流程:

本地 Django 项目
↓
Git 提交
↓
推送 GitHub
↓
购买香港服务器
↓
安装 Python / Git / Nginx
↓
服务器拉取代码
↓
创建虚拟环境
↓
安装依赖
↓
配置 .env
↓
数据库迁移
↓
收集静态文件
↓
Daphne 后台运行
↓
Nginx 反向代理
↓
购买域名
↓
DNS 解析到服务器 IP
↓
配置 HTTPS
↓
正式上线

核心结论:

本地负责开发
GitHub 负责同步代码
服务器负责运行网站
Nginx 负责对外访问
Daphne 负责运行 Django
域名负责替代 IP
HTTPS 负责安全访问

评论区

CC_dog 2026年6月10日 12:28

得吃

登录后发表评论