记录我的django部署到服务器的全流程
学生第一次django部署到服务器记录的过程
用这篇文章记录一下我第一次django部署过程,以防以后再次部署类似的时候要重新来。
1、检查修改后端代码
1.1检查修改setting.py
检查ALLOWED_HOSTS ,开发环境是ALLOWED_HOSTS = [‘*’],生产环境要可以根据服务器需要修改,或者不修改
#开发环境允许所有
ALLOWED_HOSTS = ['*']
生产环境要可以根据服务器需要修改,或者不修改
检查database,部署后要记得改成服务器上的数据库连接信息
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "xxx", # 服务器上改数据库名
"HOST": "localhost", # 服务器上改主机地址
"PORT": "3306", # 服务器上改端口
"USER": "root", # 服务器上改用户名
"PASSWORD": "12345678", # 服务器上改密码
'OPTIONS': {
'charset': 'utf8mb4',
}
}
}
1.2检查其他的文件
检查不要出现绝对路径,这个下次开发的时候要记得开发的时候就不要出现绝对路径,用相对路径,比如
# ❌ 原来的(绝对路径):
custom_dir = "D:/pycharm 项目库/djangoProject/static/media/processed_image"
# ✅ 改为(相对路径):
custom_dir = os.path.join(settings.MEDIA_ROOT, 'processed_image')```
有密码这种的不要出现在代码里,比如微信小程序的appid和secret,改成在服务器终端的环境变量设置和获取
2、购买服务器
我是在阿里云上购买的,因为我是学生有免费试用1个月的优惠,在https://www.aliyun.com/上查看,我试用的是轻量应用服务器,在产品中找到云服务器ECS,你会看到有免费试用的字样,点击自己选自己需要的,我选择的是如图这个
3、迁移数据库
我使用的mysql,我就记录我的mysql数据库迁移过程,我这个有宝塔面板感觉下什么东西都挺方便
3.1下载mysql
先在cmd输入
mysql --version
查看开发用的mysql版本,然后在软件商店下载mysql,选择对应的版本。如果没有宝塔面板的话我估计就问ai怎么下了。没有相同的版本可以选择最近的版本。
3.2下载mysql可视化
我在宝塔面板的软件商店里正好有phpmyadmin这个工具,我就使用的这个,直接根据它的提示去下载需要的php版本,下载完可以检查,在终端输入
php -v
检查安装是否成功,然后提示还需要下载Nginx / Apache / OpenLiteSpeed三选1,我下的是Nginx,然后下载phpadmin就可以了。如果不用的话可以用dbeaver连接也可以。
我遇到的问题是这个phpadmin和php有版本兼容问题,我最后降低php版本为7.4,phpadmin是5。0。
3.3数据库迁移
点击面板里的数据库,点击添加数据库,自己写设置,访问权限选本地服务器。添加完毕后点击管理自动跳转phpadmin登录界面,输入刚才设置的进入数据库界面。如果忘记了密码可以在终端输入
# 1. 停止MySQL
service mysqld stop
# 2. 安全模式启动
mysqld_safe --skip-grant-tables &
# 3. 登录MySQL(不用密码)
mysql -u root
# 4. 重置密码
USE mysql;
UPDATE user SET authentication_string=PASSWORD('你的新密码') WHERE User='root';
FLUSH PRIVILEGES;
exit;
# 5. 重启MySQL
service mysqld restart
在本地的数据库,先创建一个和你本地一样名字的数据库再导入,这一步很重要。要进入这个数据库。然后用你的可视化工具把你开发时本地用的数据库导出为sql语句,然后用压缩工具压缩为zip,然后在phpadmin界面选择导入,选择你的zip上传,然后点击执行就可以了。成功的话你在左侧能看见你本地开发一样的数据库.
4、配置运行环境
4.1上传代码文件
在本地把整个项目压缩为zip,然后在宝塔面板进入/www/wwwroot/,点击上传吧项目zip上传,完成后右键解压就可以了。
4.2安装对应python和pip
安装pip和用本地对应版本的python,我这时候我用软件商店python版本改不了,我就在终端下载编译的,我要用python3.10。终端输入
sudo yum groupinstall -y "Development Tools"
sudo yum install -y openssl-devel bzip2-devel libffi-devel wget sqlite-devel
sudo yum install -y gcc make zlib-devel readline-devel
# 进入临时目录
cd /tmp
# 下载Python 3.10.13(较稳定的版本)
wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz
# 解压
tar -xvf Python-3.10.13.tgz
cd Python-3.10.13
# 配置编译选项
./configure --enable-optimizations --enable-shared
# 编译安装(-j 参数根据CPU核心数调整)
make -j $(nproc)
sudo make altinstall
# 检查Python 3.10是否安装成功
python3.10 --version
# 如果显示 Python 3.10.13 表示成功
# 添加Python库路径到系统
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/python3.10.conf
# 更新动态链接库缓存
sudo ldconfig
# 验证配置
ldconfig -p | grep python3.10
# 创建软链接(方便使用)
sudo ln -sf /usr/local/bin/python3.10 /usr/local/bin/python3
sudo ln -sf /usr/local/bin/python3.10 /usr/local/bin/python
# 再次验证
python3 --version
python --version
#成功就继续安装pip
# 安装pip
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10
# 检查pip版本
pip3.10 --version
pip3 --version
# 安装virtualenv
pip3.10 install virtualenv
# 验证virtualenv
virtualenv --version
其中我遇到的问题,在# 编译安装(-j 参数根据CPU核心数调整)
make -j $(nproc)
sudo make altinstall的时候很慢,是正常的,要耐心等。然后检查pip版本都没问题的话,记得后面pip下载要用pip3,不然会显示没有pip。
4.3用requirement下载环境
我这个是用yolov11识别的django项目,所以我有个问题就是这个requirement太大了,有很多没有用到,我的解决方法是把我的所有1代码给ai让它给我写一个精简版的requirement。不用担心会不会少,少环境运行会提醒你,你再加上需要的就再重下就行了。
requirement准备好就可以继续。
#先cd到requirement路径
cd /www/wwwroot/djangoProject
#用pip下载环境
pip install -r requirements.txt
如果有什么问题要删除之前下载的,
#卸载单个包
pip uninstall package_name
#卸载requirement里的所有包
pip uninstall -r requirements.txt -y
# 卸载多个包
pip uninstall package1 package2 package3
# 或使用循环
for package in package1 package2 package3; do
pip uninstall -y $package
#退出sql
done
遇到的问题1:note: This error originates from a subprocess, and is likely not a problem with pip.
这个错误表明系统缺少 MySQL 客户端开发库。
解决方法如下:
# 安装 MySQL 开发包
sudo yum install mysql-devel
# 或者如果上面不行,尝试:
sudo yum install mariadb-devel
# 如果使用 Amazon Linux 2:
sudo yum install mysql-devel gcc python3-devel
#然后安装python开发包
# CentOS/RHEL
sudo yum install python3-devel
# Ubuntu/Debian
sudo apt-get install python3-dev
#安装构建工具
# CentOS/RHEL
sudo yum install gcc
# Ubuntu/Debian
sudo apt-get install build-essential
#清理缓存后重新安装
# 清理 pip 缓存
python3 -m pip cache purge
# 重新安装 requirements.txt
python3 -m pip install -r requirements.txt
下载完在项目文件夹里新建一个py测试mysql还有没有问题
#!/usr/bin/env python3
import MySQLdb
try:
# 使用正确的配置
conn = MySQLdb.connect(
host='localhost',
user='用户名',
passwd='密码',
db='数据库名字',
port=3306,
charset='utf8mb4'
)
print('✅ 数据库连接成功!')
# 测试查询
cursor = conn.cursor()
# 检查 django_migrations 表
cursor.execute("SELECT COUNT(*) FROM django_migrations")
result = cursor.fetchone()
print(f'✅ django_migrations 表中有 {result[0]} 条记录')
# 检查 auth_user 表
cursor.execute("SELECT COUNT(*) FROM auth_user")
result = cursor.fetchone()
print(f'✅ auth_user 表中有 {result[0]} 条用户记录')
# 列出所有表
cursor.execute("SHOW TABLES")
tables = cursor.fetchall()
print('✅ 数据库中的表:')
for i, table in enumerate(tables, 1):
print(f' {i:2d}. {table[0]}')
cursor.close()
conn.close()
except MySQLdb.Error as e:
print(f'❌ MySQL 连接错误: {e}')
print(f' 错误代码: {e.args[0]}')
print(f' 错误信息: {e.args[1]}')
except Exception as e:
print(f'❌ 其他错误: {e}')
新建完在终端运行这个py测试是否修好
问题2: MySQL 连接错误: (2002, “Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)”)
错误代码: 2002
错误信息: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
解决方法如下:
我在终端执行检查
# 尝试启动 MySQL(根据你看到的服务名)
systemctl start mysqld
# 或者
systemctl start mysql
# 设置开机自启
systemctl enable mysqld
systemctl enable mysql
# 再次检查状态
systemctl status mysqld
发现报错[root@iZ2zeccueqitwdmdo2s0nnZ djangoProject]# ls -la /var/lib/mysql/mysql.sock 2>/dev/null || echo “mysql.sock 不存在”
mysql.sock 不存在
[root@iZ2zeccueqitwdmdo2s0nnZ djangoProject]# find / -name “*.sock” 2>/dev/null | grep mysql
/tmp/mysql.sock
/tmp/mysqlx.sock,问题是MySQL 正在运行,但是 socket 文件在 /tmp/mysql.sock 而不是默认的 /var/lib/mysql/mysql.sock,我就指定sock路径。
在我项目里的setting里修改数据库指定sock路径就解决了。
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "xxx",
"USER": "xxx",
"PASSWORD": "xxx",
"HOST": "127.0.0.1", # 或者保持 localhost
"PORT": "3306",
"OPTIONS": {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
"unix_socket": "/tmp/mysql.sock", # 添加这行指定 socket 路径
}
}
}
问题3,如果是用户有问题可以在终端进入mysql,用sql语句修改
# 首先使用用户登录 MySQL
mysql -u 用户名 -p密码 -S /tmp/mysql.sock
-- 查看所有用户
SELECT user, host FROM mysql.user;
-- 查看数据库的权限
SELECT * FROM mysql.db WHERE Db = '数据库名字';
-- 授予对 zimu 数据库的所有权限
GRANT ALL PRIVILEGES ON 数据库名字.* TO '用户名'@'localhost';
GRANT ALL PRIVILEGES ON 数据库名字.* TO '用户名'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 再次查看权限确认
SHOW GRANTS FOR '用户名'@'localhost';
exit;
4.4测试django是否能运行
终端执行
# 测试开发服务器(Ctrl+C 停止)
python3 manage.py runserver 0.0.0.0:8000
如果终端输出和开发时输出一样那就是部署全部成功了。可以用下面的指令测试接口是否正常
curl -v "你的url"
遇到的问题1:我运行发现缺少opencv库,原因是我的requirement里是opencv-python-headless:无 GUI 版本,缺少 libGL.so.1,需要的是opencv-python:完整版,包含 GUI 支持,需要图形库
解决方法:
改成opencv-python==4.13.0.90然后终端运行
# 1. 安装图形库依赖(必须先做)
yum install -y mesa-libGL libXrender libXext libSM libICE libX11
# 2. 直接安装 requirements.txt
cd /www/wwwroot/djangoProject
pip install -r requirements.txt
# 3. 测试
python3 -c "import cv2; print('OpenCV OK')" && python3 manage.py check
5、使用Gunicorn启动生产服务器
安装Gunicorn和依赖
先停止开发服务器
# 1. 找到并停止正在运行的Django开发服务器
ps aux | grep runserver
# 2. 如果有在8000端口运行的进程,停止它
# 使用pkill(如果知道具体进程)
pkill -f "runserver"
# 3. 确认8000端口已释放
netstat -tlnp | grep :8000
然后终端执行来安装Gunicorn
# 进入项目目录
cd /www/wwwroot/djangoProject
# 安装生产环境依赖
pip3 install gunicorn gevent
创建Gunicorn配置文件
在项目文件夹里创建gunicorn_config.py
import multiprocessing
# 1. 网络绑定
bind = "127.0.0.1:8001" # Nginx代理到这个端口
# 2. 工作进程数(根据服务器CPU调整)
workers = multiprocessing.cpu_count() * 2 + 1 # 你的2核服务器 = 5个worker
# 3. 工作模式(gevent处理并发更好)
worker_class = "gevent"
worker_connections = 1000 # 每个worker最大并发
# 4. 超时设置(微信小程序可能需要长时间连接)
timeout = 120
keepalive = 2
# 5. 重启策略(防止内存泄漏)
max_requests = 1000
max_requests_jitter = 50
# 6. 日志配置
accesslog = "/www/wwwroot/djangoProject/logs/gunicorn_access.log"
errorlog = "/www/wwwroot/djangoProject/logs/gunicorn_error.log"
loglevel = "info"
# 7. 性能优化
preload_app = True # 预加载应用,启动快
reload = False # 生产环境不自动重载
# 8. 进程名(方便管理)
proc_name = "django_api"
# 9. 连接队列
backlog = 2048
然后创建日志目录
# 创建日志和运行目录
mkdir -p /www/wwwroot/djangoProject/logs
mkdir -p /www/wwwroot/djangoProject/run
# 设置权限
chown -R www:www /www/wwwroot/djangoProject/logs
chmod -R 755 /www/wwwroot/djangoProject/logs
测试运行,按ctrl+c停止
cd /www/wwwroot/djangoProject
gunicorn -c gunicorn_config.py api.djangoProject.wsgi:application
监控命令有:
# 查看实时日志
sudo journalctl -u django-gunicorn -f
# 或查看文件日志
tail -f /www/wwwroot/djangoProject/logs/gunicorn_access.log
# 查看进程
ps aux | grep gunicorn
# 查看端口
netstat -tlnp | grep :8001
我遇到的问题1:Gunicorn找不到正确Python路径。
解决方法:终端运行这些知道真实Python版本和路径以及直接运行gunicorn的结果。
which python3 && python3 --version && pip3 show django
/usr/bin/python3 -m gunicorn --bind 127.0.0.1:8001 djangoProject.wsgi:application
然后修改gunicorn_config.py强制使用正确python路径。我的是这样的:
#!/usr/bin/env python3
import os
import sys
# 强制使用Python 3.10路径
sys.path.insert(0, '/www/wwwroot/djangoProject')
sys.path.insert(0, '/usr/local/lib/python3.10/site-packages')
sys.path.insert(0, '/usr/lib64/python3.10/site-packages')
# 告诉Gunicorn使用哪个Python
pythonpath = '/usr/local/bin/python3'
# Gunicorn配置
bind = "127.0.0.1:8001"
workers = 3
worker_class = "gevent"
timeout = 120
keepalive = 2
# 日志
accesslog = "/www/wwwroot/djangoProject/logs/gunicorn_access.log"
errorlog = "/www/wwwroot/djangoProject/logs/gunicorn_error.log"
loglevel = "info"
# 性能
preload_app = True
max_requests = 1000
max_requests_jitter = 50
# 进程名
proc_name = "django_api"
再运行测试就可以了。
问题2:Python环境有Django但没有Gunicorn。终端执行
# 1. 先检查
which gunicorn
gunicorn --version
# 2. 如果没有,安装
/usr/bin/pip3 install gunicorn gevent --force-reinstall
# 3. 验证
/usr/local/bin/python3 -c "import gunicorn; print('成功')"
# 4. 测试启动
cd /www/wwwroot/djangoProject
gunicorn --bind 127.0.0.1:8001 djangoProject.wsgi:application
6、配置Nginx反向代理
6.1在宝塔面板添加网站
在宝塔面板添加网站
登录宝塔面板,点击左侧「网站」→「添加站点」
填写:域名:(你的IP)
根目录:/www/wwwroot/djangoProject
PHP版本:选择「纯静态」
其他默认
点击「提交」
我们依旧会支持flowchart.js的流程图语法:
6.2配置Nginx反向代理
点击刚创建的网站 → 「设置」
点击「反向代理」→「添加反向代理」
填写:代理名称:django_api
目标URL:http://127.0.0.1:8001
其他默认
点击「提交」
6.3修改Nginx配置
点击刚创建的网站 → 「设置」
点击「配置文件」,他有已经写好的,找到include /www/server/panel/vhost/nginx/proxy/47.93.186.129/*.conf;下面添加反向代理设置,我的是微信小程序前端所以是如下这样,具体要根据自己的情况修改
# ============ Django 反向代理配置 ============
# 静态文件 - 对应你的 STATIC_ROOT
location /static/ {
alias /www/wwwroot/djangoProject/static/;
expires 30d;
access_log off;
}
# 媒体文件 - 对应你的 MEDIA_ROOT
location /media/ {
alias /www/wwwroot/djangoProject/static/media/; # 你的配置
expires 30d;
access_log off;
}
# 主API代理(简化版)
location / {
proxy_pass http://127.0.0.1:8001;
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;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 120s;
# 微信小程序CORS
add_header Access-Control-Allow-Origin 'https://servicewechat.com' always;
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header Access-Control-Allow-Headers 'Content-Type, Authorization, X-CSRFToken, X-Requested-With, X-WX-Code, X-WX-Encrypted-Data, X-WX-IV' always;
add_header Access-Control-Allow-Credentials 'true' always;
# 处理OPTIONS预检请求
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin 'https://servicewechat.com';
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type, Authorization, X-CSRFToken, X-Requested-With, X-WX-Code, X-WX-Encrypted-Data, X-WX-IV';
add_header Access-Control-Allow-Credentials 'true';
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
}
# ============ 配置结束 ============
#如果不需要php就找到类似
include enable-php.conf;的注释掉.
遇到的问题:保存失败,因为检测到被修改的配置文件存在错误:
nginx version: nginx/1.26.1
nginx: [emerg] duplicate location “/” in /www/server/panel/vhost/nginx/47.93.186.129.conf:48
nginx: configuration file /www/server/nginx/conf/nginx.conf test failed
错误是因为有重复的 location / 配置,删除就行,修改后重启nginx。
# 停止所有Nginx进程
pkill nginx
# 等待2秒
sleep 2
# 再启动
nginx
现在用刚才的方法测试后端接口,应该可以成功获取了。
7、配置SSL证书
配置这个才能使用https访问网页。在宝塔界面找到网站,添加站点,然后点击设置,找到ssl,申请证书就可以了。但是很贵。
我的申请的是测试证书,这个需要你有域名,在阿里云网页里申请就可以了这个很便宜,但是需要备案,需要等待备案成功。
以后使用的流程,登录面板,终端输入
# 登录服务器
ssh root@47.93.186.129
# 进入项目目录
cd /www/wwwroot/djangoProject
# 停止之前可能运行的Gunicorn
pkill -f gunicorn
# 启动Gunicorn(生产环境)
gunicorn -c gunicorn_config.py djangoProject.wsgi:application &
# 或者简单启动
gunicorn --bind 127.0.0.1:8001 --workers 3 --worker-class=sync djangoProject.wsgi:application &
更多推荐
所有评论(0)