部署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
相关推荐
王火火(DDoS CC防护)34 分钟前
服务器隐藏源IP要如何操作呢?
服务器·ddos攻击
草莓熊Lotso35 分钟前
Git 多人协作全流程实战:分支协同 + 冲突解决 + 跨分支协助
linux·运维·服务器·人工智能·经验分享·git·python
hhwyqwqhhwy11 小时前
Linux file->private
linux·运维·服务器
WongKyunban11 小时前
在Linux下制作软件安装包
linux·运维·服务器
hweiyu0012 小时前
Linux 命令:parted
linux·运维·服务器
烽火聊员12 小时前
CertificateCreator生成服务器证书server.pfx
运维·服务器
菜鸟冲锋号13 小时前
问题:增量关联(实时同步新数据) 这个场景中,如果hudi_pay 变更了一条数据,hudi_order_pay_join 结果的数据会跟着变化吗
服务器·前端·数据库
wanhengidc13 小时前
使用云手机都要注意哪些?
运维·服务器·科技·游戏·智能手机
移远通信13 小时前
配网-复杂场景
服务器·开发语言·php