0. 环境准备(SSH 登录/基础工具)
-
用 SSH 连接你的服务器:
bash复制编辑ssh root@47.120.45.1 -
更新系统,安装必要工具(如已安装可略过):
bash复制编辑sudo apt update && sudo apt upgrade -y sudo apt install git curl vim python3 python3-pip python3-venv -y
1. 项目代码准备与虚拟环境
1.1 上传项目代码到服务器
- 推荐用
git clone,也可以用scp或ftp上传代码到/srv/medical-companion-server-python目录。
1.2 进入项目目录并创建虚拟环境
bash复制编辑cd /srv/medical-companion-server-python
python3 -m venv venv # 注意:使用系统自带 venv,不要用 pip install virtualenv,否则会报“externally-managed-environment”错误
source venv/bin/activate
- 注意: 没有
venv/bin/activate是因为没创建虚拟环境,先执行python3 -m venv venv。
2. 安装依赖
-
如果有
requirements.txt:bash复制编辑pip install -r requirements.txt -
如果没有,手动安装所需库(如 Django、djangorestframework、mysqlclient 等):
bash复制编辑pip install django djangorestframework mysqlclient drf-yasg
3. MySQL 数据库配置
3.1 MySQL 安装与创建数据库
-
(如已安装可跳过)安装 MySQL:
bash复制编辑sudo apt install mysql-server libmysqlclient-dev -
登录 MySQL 创建数据库和授权账号(如果已创建可跳过):
sql复制编辑CREATE DATABASE medical_companion_system DEFAULT CHARACTER SET utf8mb4; GRANT ALL PRIVILEGES ON medical_companion_system.* TO 'root'@'%' IDENTIFIED BY 'Wanglizhi2$'; FLUSH PRIVILEGES;
3.2 settings.py 配置
-
检查你的
settings.py数据库配置(注意端口字段应该是PORT,不是POST!):python复制编辑DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "medical_companion_system", "USER": "root", "PASSWORD": "Wanglizhi2$", "HOST": "47.120.45.1", "PORT": 3306, } } -
注意事项:
-
配置错端口字段会导致连接失败。
-
MySQL 用户需有远程权限(如果数据库和 web 分别在不同服务器)。
-
4. 项目基础配置
-
修改
settings.py,静态资源路径和主机名等关键项:python复制编辑import os STATIC_ROOT = os.path.join(BASE_DIR, 'static') ALLOWED_HOSTS = ['47.120.45.1', 'localhost', '127.0.0.1'] -
注意事项:
-
ALLOWED_HOSTS里必须有公网 IP,才能被外部访问。 -
部署生产时建议
DEBUG = False,开发测试可以先DEBUG = True。
-
5. 数据迁移和超级管理员
5.1 迁移数据库表结构
bash复制编辑python manage.py makemigrations
python manage.py migrate
- 作用: 把 models.py 的结构映射到数据库,创建所需数据表。
5.2 创建超级管理员账户(可选但建议)
bash复制编辑python manage.py createsuperuser
- 说明: 如果需要用 Django 自带后台,务必创建;不用后台可跳过。
6. 收集静态文件
-
设置好
STATIC_ROOT后,执行:bash复制编辑python manage.py collectstatic -
注意事项:
- 生产环境静态文件需用 Nginx 提供访问,Django 本身不托管静态资源。
7. 运行 Gunicorn(生产部署应用服务器)
7.1 安装 Gunicorn
bash复制编辑pip install gunicorn
7.2 启动 Gunicorn 测试
bash复制编辑gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000
-
保持终端打开,刷新浏览器看效果。
-
注意: 关掉终端进程会消失,正式部署需后台启动。
7.3 Gunicorn 后台启动(建议用 nohup 或 supervisor)
-
快速后台运行:
bash复制编辑nohup gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000 > gunicorn.log 2>&1 & -
推荐用 supervisor 保证重启/掉线服务不断,见下方扩展说明。
8. Nginx 反向代理和静态资源托管
8.1 安装 Nginx
bash复制编辑sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
8.2 配置 Nginx
-
编辑
/etc/nginx/sites-available/medcomp(推荐用此新建文件,不要直接改nginx.conf):nginx复制编辑server { listen 80; server_name 47.120.45.1; location /static/ { alias /srv/medical-companion-server-python/static/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } -
建立软链接并重载 Nginx:
bash复制编辑sudo ln -s /etc/nginx/sites-available/medcomp /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx -
注意事项:
-
proxy_pass地址和 Gunicorn 启动端口要完全一致。 -
每次改配置要
nginx -t检查并 reload。
-
9. 防火墙和安全组放行
-
阿里云安全组: 登录云控制台 → 安全组 → 放行 80 端口(HTTP)、如需 443(HTTPS)也要放。
-
Ubuntu 本地防火墙(如启用):
bash复制编辑sudo ufw allow 80 sudo ufw allow 8000 sudo ufw reload
10. 访问网站
-
用浏览器访问
http://47.120.45.1/检查页面能否打开。 -
后台管理(如创建了管理员):
http://47.120.45.1/admin
11. 常见问题与排查
11.1 502 Bad Gateway(Nginx 访问报错)
-
最常见原因:
-
Gunicorn 没有启动,或端口写错
-
Gunicorn 进程崩溃(数据库连接异常等)
-
Nginx 配置有误,proxy_pass 地址和 Gunicorn 不一致
-
-
排查办法:
-
用
ps aux | grep gunicorn确认进程是否存活 -
用
netstat -tunlp | grep 8000检查 8000 端口是否有监听 -
检查 Gunicorn 启动命令终端是否报错
-
检查 Nginx 配置 proxy_pass 与 Gunicorn 保持一致
-
每次改完 Nginx 配置要重载(
sudo nginx -t && sudo systemctl reload nginx)
-
11.2 requirements.txt 找不到
- 只需手动安装项目依赖,后期可用
pip freeze > requirements.txt生成,方便下次迁移部署。
11.3 端口写错(POST → PORT)
- 数据库配置用
PORT,写错会导致数据库连接失败。
11.4 静态资源 404
- 没有执行
python manage.py collectstatic或 Nginx 静态资源路径 alias 配置错误。
11.5 externally-managed-environment 报错
- 不要用
pip install --user,要用python3 -m venv venv创建虚拟环境,再source venv/bin/activate。
12. 推荐的 Gunicorn 永久运行方式
用 supervisor 守护 Gunicorn(推荐生产环境)
-
安装 supervisor:
bash复制编辑sudo apt install supervisor -
新建
/etc/supervisor/conf.d/gunicorn_medcomp.conf内容如下(注意路径换成你的):ini复制编辑[program:gunicorn_medcomp] directory=/srv/medical-companion-server-python command=/srv/medical-companion-server-python/venv/bin/gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000 autostart=true autorestart=true user=root stdout_logfile=/srv/medical-companion-server-python/gunicorn_supervisor.log stderr_logfile=/srv/medical-companion-server-python/gunicorn_supervisor_error.log -
加载并启动:
bash复制编辑sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start gunicorn_medcomp -
重启 supervisor 后 Gunicorn 会自动随系统启动、异常自动重启。
总结表
步骤
命令/配置
说明(注意项)
环境准备
apt update、apt install ...
基础包/工具,系统要最新
项目上传
git clone / scp / ftp
推荐用 git,目录结构要对
虚拟环境
python3 -m venv venv + source venv/bin/activate
别用 --user、别忘记激活
依赖安装
pip install -r requirements.txt / 手动装
requirements.txt 没有就手动安装
MySQL 配置
settings.py,注意 PORT,账号权限
HOST/PORT 必须写对
数据迁移
python manage.py makemigrations/migrate
表结构写入数据库
管理员
python manage.py createsuperuser
建议创建,用于后台
静态资源
python manage.py collectstatic
STATIC_ROOT 路径和 nginx 保持一致
Gunicorn 启动
gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000
必须后台或用 supervisor
Nginx 配置
sites-available/medcomp + enable + reload
alias/proxy_pass 必须对应端口
安全组
阿里云后台放行 80,ufw 允许 80/8000
否则外部访问不到
访问
浏览器访问 http://公网IP/
页面正常即成功
如哪一步出错或不明白,把命令和报错贴给我,我帮你继续定位!
如果你想后续加 React/Vue 管理后台或开启 HTTPS,也可以问我要流程。
如何再次后台启动
ChatGPT 说:
👌 你现在已经杀掉进程了,如果要 再次后台启动 gunicorn,有两种常见方式:
🔹 方法 1:命令行直接后台启动
进入你的项目目录 /srv/medical-companion-server-python:
cd /srv/medical-companion-server-python
source venv/bin/activate
gunicorn medical_companion_server.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 4 \
--daemon \
--pid /tmp/gunicorn.pid
说明:
-
--workers 4:开启 4 个 worker 进程(根据 CPU 调整) -
--daemon:后台运行(和-D一样) -
--pid /tmp/gunicorn.pid:写入 PID 文件,方便之后停止/重启
🔹 方法 2:用 nohup 后台运行(不依赖 gunicorn 自带的 daemon)
cd /srv/medical-companion-server-python
source venv/bin/activate
nohup gunicorn medical_companion_server.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 4 > gunicorn.log 2>&1 &
echo $! > /tmp/gunicorn.pid
-
日志会输出到
gunicorn.log -
$!保存最后一个后台进程的 PID,写入/tmp/gunicorn.pid
🔹 方法 3(推荐生产环境):用 systemd 管理
写一个 /etc/systemd/system/gunicorn.service,以后就能用:
sudo systemctl start gunicorn
sudo systemctl stop gunicorn
sudo systemctl restart gunicorn