服务器所用系统为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
配置项目环境
-
服务器安装 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 -
创建并激活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 -
拉取 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
-
刷新服务器本地的软件包索引
shellsudo apt update -
安装 Postgres 软件包以及一个
-contrib软件包,该软件包添加了一些额外的实用工具和功能shellsudo apt install -y postgresql postgresql-contrib -
查看PostgreSQL的状态,如果看见active表示已经安装成功,并已经启动了
shellsudo systemctl status postgresql -
进入数据库命令行
进入后可使用
\l列出数据库,\du查看用户,\q退出shell# 切换到系统内置的 postgres 用户,并登录 sudo -i -u postgres # 启动 PostgreSQL 的 命令行客户端工具 psql,并自动登录到数据库(免密登录) psql成功后提示符变为
postgres=#(#表示超级用户权限) -
修改当前登录用户(postgres)密码
sqlALTER USER postgres WITH PASSWORD 'your_strong_password';修改自定义用户的密码(如用户
testuser)sqlALTER USER testuser WITH PASSWORD 'testuser_password';刷新并退出
sql-- 刷新权限 FLUSH PRIVILEGES; -- 退出 psql \q -
输入密码登录
sql# 用修改后的密码登录 postgres 用户 psql -U postgres -W
配置远程连接
配置远程
-
编辑主配置文件
shellsudo nano /etc/postgresql/*/main/postgresql.conf修改监听的ip地址,原来是
localhost,现在改为*(全部)listen_addresses = '*' -
编辑客户端认证文件
shellsudo nano /etc/postgresql/*/main/pg_hba.conf添加下面,表示允许任何 IPv4 地址的客户端,使用任何 PostgreSQL 用户名,通过密码(md5 加密)连接到服务器上的所有数据库。
host all all 0.0.0.0/0 md5 -
重启服务
shellsudo systemctl restart postgresql -
开放防火墙
shellsudo 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
-
安装Nginx
shellsudo apt update sudo apt install -y nginx -
验证是否安装好
shell# 检查 Nginx 版本 nginx -v # 检查服务状态(Ubuntu 18.04+ 用 systemd) sudo systemctl status nginx -
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.pidNginx 主进程 PID 文件(用于启停 / 重启) -
创建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 -
写入 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; } -
检查配置语法
shellsudo nginx -t -
建立虚拟连接
shellsudo ln -s /etc/nginx/sites-available/django_project /etc/nginx/sites-enabled/ -
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 -
输出日志
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