部署Django+React项目到服务器

服务器所用系统为ubuntu,采用的部署方式为Nginx+uWSGI

本地项目准备

在把项目部署到服务器之前先配置好setting.py

python 复制代码
import os
from pathlib import Path

# ===================== 基础路径 =====================
BASE_DIR = Path(__file__).resolve().parent.parent

# ===================== 核心安全配置(服务器必改) =====================
# 生产环境通过环境变量传递,禁止硬编码!
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', '请替换为随机字符串(生成命令:python -c "import secrets; print(secrets.token_hex(64))")')
# 服务器必须设为 False,否则暴露敏感信息
DEBUG = False
# 允许访问的域名/IP(填服务器公网IP/域名,多个用逗号分隔)
ALLOWED_HOSTS = ['127.0.0.1', '你的服务器IP', '你的域名']

# ===================== 应用与中间件(保留核心) =====================
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 自定义应用(替换为你的实际应用名)
    'apps.annotation',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'core.urls'
WSGI_APPLICATION = 'core.wsgi.application'

# ===================== 数据库(服务器推荐MySQL/PostgreSQL) =====================
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 替换为 postgresql 亦可
        'NAME': os.environ.get('MYSQL_NAME', 'annotation_db'),  # 数据库名
        'USER': os.environ.get('MYSQL_USER', 'root'),          # 数据库用户
        'PASSWORD': os.environ.get('MYSQL_PWD', '你的数据库密码'), # 环境变量传递,禁止硬编码
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},  # 支持特殊字符
    }
}

# ===================== 静态/媒体文件(对接Nginx关键) =====================
# 静态文件URL(对应Nginx的 /static/ 路径)
STATIC_URL = '/static/'
# 静态文件收集目录(必须与Nginx配置的alias路径一致!)
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 用户上传文件配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# ===================== 基础配置 =====================
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = True
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# ===================== 服务器安全强化(可选但推荐) =====================
if not DEBUG:
    # 启用HTTPS后开启(需配置SSL证书)
    # SECURE_SSL_REDIRECT = True
    # SESSION_COOKIE_SECURE = True
    # CSRF_COOKIE_SECURE = True
    pass

配置项目环境

  1. 服务器安装 Miniconda(轻量版,推荐),也可以用其他的工具

    如果服务器没有 Anaconda,先安装 Miniconda(比 Anaconda 体积小,功能足够):

    bash 复制代码
    # 1. 下载Miniconda安装脚本(Python3.9版本,可替换为其他版本)
    wget https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-x86_64.sh
    
    # 2. 执行安装脚本(一路回车,最后输入yes确认安装路径)
    bash Miniconda3-py39_24.1.2-0-Linux-x86_64.sh
    
    # 3. 激活conda环境(让终端识别conda命令)
    source ~/.bashrc  # 若用zsh则执行 source ~/.zshrc
    
    # 4. 验证安装成功(显示conda版本即正常)
    conda --version
  2. 创建并激活conda虚拟环境

    核心步骤:先创建环境,再激活(确保后续操作都在隔离环境中)。

    bash 复制代码
    # 1. 创建conda环境(指定环境名+Python版本,推荐与项目同名)
    # 语法:conda create -n 环境名 python=版本号
    # 示例:Python3.10.9,环境名Annotation
    conda create -n Annotation python=3.10.9  
    
    # 2. 激活环境(激活后终端前缀会显示环境名)
    conda activate Annotation
    
    # (可选)关闭环境的命令(部署时无需,后续维护用)
    # conda deactivate
  3. 拉取 Git 项目代码

    bash 复制代码
    # 克隆项目(HTTPS方式,需输入账号密码;或配置SSH免密)
    git clone https://github.com/your-username/your-django-project.git
    
    # 进入项目根目录(确保目录下有 requirements.txt 和 manage.py)
    cd your-django-project

配置数据库PostgreSQL

安装PostgreSQL

  1. 刷新服务器本地的软件包索引

    shell 复制代码
    sudo apt update
  2. 安装 Postgres 软件包以及一个 -contrib 软件包,该软件包添加了一些额外的实用工具和功能

    shell 复制代码
    sudo apt install -y postgresql postgresql-contrib
  3. 查看PostgreSQL的状态,如果看见active表示已经安装成功,并已经启动了

    shell 复制代码
    sudo systemctl status postgresql
  4. 进入数据库命令行

    进入后可使用 \l 列出数据库,\du 查看用户,\q 退出

    shell 复制代码
    # 切换到系统内置的 postgres 用户,并登录
    sudo -i -u postgres
    # 启动 PostgreSQL 的 命令行客户端工具 psql,并自动登录到数据库(免密登录)
    psql

    成功后提示符变为 postgres=## 表示超级用户权限)

  5. 修改当前登录用户(postgres)密码

    sql 复制代码
    ALTER USER postgres WITH PASSWORD 'your_strong_password';

    修改自定义用户的密码(如用户 testuser

    sql 复制代码
    ALTER USER testuser WITH PASSWORD 'testuser_password';

    刷新并退出

    sql 复制代码
    -- 刷新权限
    FLUSH PRIVILEGES;
    -- 退出 psql
    \q
  6. 输入密码登录

    sql 复制代码
    # 用修改后的密码登录 postgres 用户
    psql -U postgres -W

配置远程连接

配置远程

  1. 编辑主配置文件

    shell 复制代码
    sudo nano /etc/postgresql/*/main/postgresql.conf

    修改监听的ip地址,原来是localhost,现在改为*(全部)

    复制代码
    listen_addresses = '*'
  2. 编辑客户端认证文件

    shell 复制代码
    sudo nano /etc/postgresql/*/main/pg_hba.conf

    添加下面,表示允许任何 IPv4 地址的客户端,使用任何 PostgreSQL 用户名,通过密码(md5 加密)连接到服务器上的所有数据库。

    复制代码
    host    all    all    0.0.0.0/0    md5
  3. 重启服务

    shell 复制代码
    sudo systemctl restart postgresql
  4. 开放防火墙

    shell 复制代码
    sudo ufw allow 5432/tcp

    现在就可以通过用户名和密码连接远端服务器上的数据库了

配置uWSGI

安装 uWSGI(在 Conda 环境中安装)

uWSGI 是 Python 库,需在激活的 Conda 项目环境中安装(确保与项目依赖兼容):

shell 复制代码
# 先激活你的 Django 项目环境(关键!)
conda activate django_project_env  # 替换为你的环境名

# 安装 uWSGI(用 pip 安装,支持 Django 适配)
pip install uwsgi

# 验证 uWSGI 安装成功(显示版本即正常)
uwsgi --version

强制杀死 uWSGI 进程

shell 复制代码
# 查找 uWSGI 进程并杀死(精准匹配)
ps aux | grep uwsgi  # 查看 uwsgi 进程(输出 PID)
sudo kill -9 1234  # 替换 1234 为实际 PID(多个 PID 用空格分隔)

# 一键杀死所有 uWSGI 进程(快捷)
sudo pkill -f uwsgi

重启服务

shell 复制代码
# 1. 强制终止所有 uwsgi 相关进程(确保无残留,避免端口占用)
sudo kill -9 $(ps aux | grep uwsgi | grep -v grep | awk '{print $2}')

# 2. 验证 uwsgi 进程已完全停止(无输出说明成功)
ps aux | grep uwsgi | grep -v grep

# 3. 用项目虚拟环境启动 uwsgi(确保加载正确的依赖和配置)
/home/user/anaconda3/envs/Annotation/bin/uwsgi --ini /data/VideoAnalysis/Annotation/uwsgi.ini

# 4. 验证 uwsgi 重启成功(有 master 和 worker 进程说明正常)
ps aux | grep uwsgi | grep -v grep

配置uwsgi配置文件

根据自己配置的实际情况修改

ini 复制代码
[uwsgi]

# 1. 项目相关配置
# 指向 Django 项目的根目录(包含 manage.py 的目录)
chdir = /data/VideoAnalysis/Annotation
# 指定 Python 虚拟环境
home = /home/user/anaconda3/envs/Annotation
# 将项目根目录加入 Python 搜索路径,确保能导入 core 等模块
pythonpath = /data/VideoAnalysis/Annotation
# Django 项目的 WSGI 配置文件路径,等价于 core/wsgi.py
module = core.wsgi

# 2. 网络配置(uWSGI 监听的地址,供 Nginx 转发)
socket = 127.0.0.1:8000

# 3. 进程/线程配置(根据服务器 CPU 调整,推荐 2-4 进程)
workers = 2
threads = 2
master = true
# 记录 master 进程的 PID,用于重启 / 停止 uWSGI(如 uwsgi --stop /tmp/uwsgi_django.pid)
pidfile = /tmp/uwsgi_django.pid
# 后台运行并记录日志
daemonize = /var/log/uwsgi/django.log

# 4. 其他优化配置
vacuum = true
max-requests = 1000
harakiri = 60

Nginx

  1. 安装Nginx

    shell 复制代码
    sudo apt update
    sudo apt install -y nginx
  2. 验证是否安装好

    shell 复制代码
    # 检查 Nginx 版本
    nginx -v
    
    # 检查服务状态(Ubuntu 18.04+ 用 systemd)
    sudo systemctl status nginx
  3. Nginx核心目录说明

    先熟悉 Nginx 的目录结构,后续配置更清晰:

    目录 / 文件 作用
    /etc/nginx/ 核心配置目录(所有配置文件都在这里)
    /etc/nginx/nginx.conf 主配置文件(全局配置,一般不直接修改,通过 include 加载子配置)
    /etc/nginx/conf.d/ 自定义配置文件目录(.conf 后缀会被自动加载)
    /etc/nginx/sites-available/ 虚拟主机配置模板(不生效,需软链到 sites-enabled
    /etc/nginx/sites-enabled/ 启用的虚拟主机配置(软链自 sites-available
    /var/www/html/ 默认静态文件根目录(对应默认欢迎页)
    /var/log/nginx/ 日志目录(access.log 访问日志、error.log 错误日志)
    /var/run/nginx.pid Nginx 主进程 PID 文件(用于启停 / 重启)
  4. 创建Nginx配置文件

    shell 复制代码
    # Ubuntu:在 sites-available 目录创建配置文件(文件名自定义,如 django_project)
    sudo vim /etc/nginx/sites-available/django_project
    
    # CentOS:在 conf.d 目录创建配置文件
    sudo vim /etc/nginx/conf.d/django_project.conf
  5. 写入 Nginx 配置(复制粘贴,按需修改标注的路径 / IP)

    nginx 复制代码
    # Nginx 配置内容
    server {
        # 监听 80 端口(HTTP 默认端口,用户可直接通过 IP/域名访问)
        listen 80;
        # 服务器地址(填你的服务器 IP 或域名,与 Django ALLOWED_HOSTS 一致)
        server_name 127.0.0.1;
    
        # 编码设置(防止中文乱码)
        charset utf-8;
    
        # 1. 静态文件处理(直接返回,不经过 uWSGI)
        # 匹配 Django 的 STATIC_URL(/static/),转发到 STATIC_ROOT 目录
        location /static/ {
            alias /data/VideoAnalysis/Annotation/staticfiles/; 
            # 替换为你的 staticfiles 目录(必须带末尾 /)
            expires 30d;  # 静态文件缓存 30 天,提升性能
        }
    
        # (可选)媒体文件处理(如果项目有上传文件功能)
        location /media/ {
            alias /data/VideoAnalysis/Annotation/core/media/;  # 替换为你的 mediafiles 目录(必须带末尾 /)
        }
    
        # 2. 动态请求处理(转发给 uWSGI)
        location / {
            # 转发到 uWSGI 监听的地址(与 uwsgi.ini 中的 socket 一致)
            uwsgi_pass 127.0.0.1:8000;
            # 加载 uWSGI 配置参数(Nginx 自带模块,无需修改)
            include /etc/nginx/uwsgi_params;
        }
        # 日志配置
        access_log /var/log/nginx/annotation_access.log;
        error_log /var/log/nginx/annotation_error.log warn;
    
    }
  6. 检查配置语法

    shell 复制代码
    sudo nginx -t
  7. 建立虚拟连接

    shell 复制代码
    sudo ln -s /etc/nginx/sites-available/django_project /etc/nginx/sites-enabled/
  8. Nginx服务管理

    shell 复制代码
    # 启动 Nginx
    sudo systemctl start nginx
    
    # 停止 Nginx
    sudo systemctl stop nginx
    
    # 重启 Nginx(配置修改后生效)
    sudo systemctl restart nginx
    
    # 重新加载配置(不中断服务,推荐)
    sudo systemctl reload nginx
    
    # 设置开机自启
    sudo systemctl enable nginx
    
    # 查看开机自启状态
    sudo systemctl is-enabled nginx
  9. 输出日志

    shell 复制代码
    # 查看访问日志
    tail -f /var/log/nginx/annotation_access.log
    # 默认访问路径
    tail -f /var/log/nginx/access.log
    
    # 查看错误日志(重点关注)
    tail -f /var/log/nginx/annotation_error.log
    
    # 查看 Nginx 全局错误日志
    tail -f /var/log/nginx/error.log
    
    # 默认报错日志
    tail -f /var/log/nginx/error.log
相关推荐
光影少年20 小时前
react navite 跨端核心原理
前端·react native·react.js
用户298698530141 天前
在 React 中使用 JavaScript 合并 Excel 文件
前端·javascript·react.js
你好潘先生1 天前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
CaffeinePro2 天前
告别知识点零散!React零基础通关,从环境搭建到Ant Design页面实战
前端·react.js
程序员老赵2 天前
服务器文件不想 SFTP 上传?Docker 跑个 File Browser,浏览器就能管理
服务器·docker·开源
vivo互联网技术2 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
Ruihong3 天前
Vue withDefaults 转 React:VuReact 怎么处理?
vue.js·react.js·面试