将本地应用部署到云服务器示例
本文介绍了本地服务到云服务器的部署教程,主要内容包括: 系统架构:基于Python FastAPI的后端服务+Docker容器化部署,搭配Tengine(Nginx)作为反向代理服务器 部署步骤: 服务器环境准备(Alibaba Cloud Linux 3) 安装配置Tengine和Docker 项目文件准备与上传 Docker容器构建与启动 反向代理配置 前端静态文件部署 系统管理: 日志查看方

# AI辅助Meta分析Screening应用部署教程
## 📋 目录
- [项目概述](#项目概述)
- [环境准备](#环境准备)
- [第一步:安装Web服务器](#第一步安装web服务器)
- [第二步:安装Docker](#第二步安装docker)
- [第三步:准备项目文件](#第三步准备项目文件)
- [第四步:上传项目到服务器](#第四步上传项目到服务器)
- [第五步:配置Docker部署](#第五步配置docker部署)
- [第六步:配置反向代理](#第六步配置反向代理)
- [第七步:上传前端文件](#第七步上传前端文件)
- [管理和维护](#管理和维护)
- [常见问题](#常见问题)
---
## 项目概述
本项目是一个AI辅助的Meta分析文献筛选系统,包含:
- **后端**:Python FastAPI服务,调用MedLive等AI API
- **前端**:静态HTML页面
- **部署方式**:Docker容器化 + Tengine反向代理
### 技术栈
- Python 3.10 + FastAPI
- Docker & Docker Compose
- Tengine (阿里巴巴的Nginx发行版)
- 服务器系统:Alibaba Cloud Linux 3
---
## 环境准备
### 服务器要求
- 云服务器(本教程使用阿里云ECS)
- 操作系统:Alibaba Cloud Linux 3 或 CentOS/RHEL 8+
- 至少 2GB RAM
- 开放端口:80 (HTTP), 22 (SSH)
### 本地要求
- Windows系统(使用PowerShell)
- 已安装SSH客户端
- 项目源代码
---
## 第一步:安装Web服务器
### 1.1 SSH登录服务器
```bash
# 在本地PowerShell或终端执行
ssh root@你的服务器IP
# 例如:
ssh root@123.45.67.89
注意:如果连接超时,需要在云服务器控制台的安全组规则中开放22端口。
1.2 查看系统信息
# 查看系统版本
cat /etc/os-release
1.3 安装Tengine
由于标准仓库中没有nginx,我们使用阿里云优化的Tengine:
# 安装Tengine
sudo yum install tengine -y
# 启动Tengine
sudo systemctl start tengine
# 设置开机自启
sudo systemctl enable tengine
# 检查状态
sudo systemctl status tengine
按 q 退出状态查看。
1.4 验证安装
在浏览器访问:http://你的服务器IP
如果看到 "Welcome to tengine!" 页面,说明安装成功!
注意:如果无法访问,需要在云服务器控制台的安全组规则中开放80端口。
第二步:安装Docker
本项目使用Docker容器化部署Python应用。
2.1 检查Docker是否已安装
docker --version
如果显示版本号(如 Docker version 26.1.3),说明已安装,跳到2.3。
2.2 安装Docker(如果需要)
# 安装Docker
sudo yum install docker-ce -y
# 启动Docker
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker
2.3 配置Docker镜像源
由于国内网络原因,需要配置国内镜像源加速:
# 备份原配置(如果存在)
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak 2>/dev/null || true
# 创建新配置
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证Docker状态
sudo systemctl status docker
按 q 退出。
第三步:准备项目文件
3.1 项目结构
你的本地项目应该有以下结构:
screening/
├── app.py # FastAPI主程序
├── initial_screen.py # 核心逻辑
├── static/
│ └── index.html # 前端页面
├── demo_input.xlsx # 示例文件
├── demo_output.xlsx
└── ... 其他文件
3.2 在本地创建Docker配置文件
在项目根目录下创建以下文件:
3.2.1 创建 requirements.txt
cd "你的项目路径"
# 例如:cd "E:\Projects\screening"
# 创建requirements.txt
@"
fastapi
uvicorn[standard]
python-dotenv
pandas
openpyxl
requests
aiofiles
python-multipart
"@ | Out-File -FilePath requirements.txt -Encoding utf8
3.2.2 创建 Dockerfile
@"
FROM python:3.10-slim
WORKDIR /app
# 配置pip使用国内镜像源
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
pip config set install.trusted-host mirrors.aliyun.com
# 升级pip
RUN pip install --upgrade pip --default-timeout=100
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt --default-timeout=100
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
"@ | Out-File -FilePath Dockerfile -Encoding utf8
3.2.3 创建 docker-compose.yml
@"
services:
screening-api:
build: .
ports:
- "8000:8000"
env_file:
- .env
restart: unless-stopped
volumes:
- ./demo_input.xlsx:/app/demo_input.xlsx
- ./demo_output.xlsx:/app/demo_output.xlsx
"@ | Out-File -FilePath docker-compose.yml -Encoding utf8
3.2.4 创建 .dockerignore
@"
__pycache__
*.pyc
*.pyo
*.pyd
.Python
.env
.venv
venv/
*.log
.git
.gitignore
"@ | Out-File -FilePath .dockerignore -Encoding utf8
3.2.5 创建 .env.example(模板,不含真实密钥)
@"
# API配置
API_KEY=your_api_key_here
BASE_URL=https://...//chat
# 服务配置
PORT=8000
MAX_FILE_SIZE=10485760
ANALYSIS_TIMEOUT=300
"@ | Out-File -FilePath .env.example -Encoding utf8
3.3 验证文件创建
# 检查所有文件是否创建成功
dir Dockerfile, docker-compose.yml, requirements.txt, .env.example, .dockerignore
第四步:上传项目到服务器
4.1 打包项目(排除敏感文件)
# 在项目目录下执行
tar -czf screening.tar.gz --exclude=.env --exclude=__pycache__ --exclude=*.pyc --exclude=*.log *
# 检查打包是否成功
dir screening.tar.gz
4.2 上传到服务器
# 上传压缩包(替换成你的实际服务器IP)
scp screening.tar.gz root@你的服务器IP:/var/www/
# 例如:
scp screening.tar.gz root@123.45.67.89:/var/www/
输入服务器密码后等待上传完成。
第五步:配置Docker部署
5.1 在服务器上解压项目
切换到服务器SSH终端:
# 创建目录并解压
cd /var/www
mkdir -p screening-app
tar -xzf screening.tar.gz -C screening-app
cd screening-app
# 查看文件
ls -la
5.2 创建环境变量文件(包含真实API密钥)
使用cat命令创建 .env 文件:
cat > .env << 'EOF'
# API配置
API_KEY=your_api_key_here
BASE_URL=https://...//chat
PORT=8000
MAX_FILE_SIZE=10485760
ANALYSIS_TIMEOUT=300
EOF
重要:将占位符替换为你的实际API配置信息!
各参数说明:
API_KEY: 模型密钥BASE_URL: 调用地址
5.3 验证.env文件
# 查看文件(确认内容正确,但注意不要泄露密钥)
ls -la .env
5.4 构建并启动Docker容器
# 构建并启动(首次运行需要下载镜像,约2-5分钟)
docker compose up -d --build
# 查看日志(确认启动成功)
docker compose logs -f
成功的日志应该显示:
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000
按 Ctrl+C 退出日志查看(容器会继续运行)。
5.5 测试API服务
# 测试健康检查端点
curl http://localhost:8000/health
# 应该返回:{"status":"ok"}
# 查看容器状态
docker compose ps
第六步:配置反向代理
6.1 创建网站目录
# 创建前端文件目录
sudo mkdir -p /var/www/tool
# 设置权限
sudo chmod -R 755 /var/www/tool
sudo chown -R tengine:tengine /var/www/tool
6.2 禁用Tengine默认server块
# 备份主配置
sudo cp /etc/tengine/nginx.conf /etc/tengine/nginx.conf.backup
# 查看默认server块的位置
grep -n "listen.*80 default_server" /etc/tengine/nginx.conf
# 注释掉默认server块(通常是第41-62行,具体以实际为准)
sudo sed -i '41,62s/^/# /' /etc/tengine/nginx.conf
6.3 创建应用配置文件
# 创建配置文件(将YOUR_SERVER_IP替换为你的实际服务器IP)
cat > /etc/tengine/conf.d/tool.conf << 'EOF'
server {
listen 80;
server_name YOUR_SERVER_IP _;
# 前端静态文件
location / {
root /var/www/tool;
index index.html;
try_files $uri $uri/ /index.html;
}
# API代理到Docker容器
location /api/ {
proxy_pass http://127.0.0.1:8000;
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_read_timeout 300s;
client_max_body_size 100M;
}
# 健康检查端点
location /health {
proxy_pass http://127.0.0.1:8000;
}
}
EOF
重要:使用vi或sed命令将配置文件中的
YOUR_SERVER_IP替换为你的实际服务器IP!
# 方法1:使用sed替换(推荐)
sudo sed -i 's/YOUR_SERVER_IP/你的实际IP/g' /etc/tengine/conf.d/tool.conf
# 方法2:使用vi手动编辑
sudo vi /etc/tengine/conf.d/tool.conf
# 按i进入编辑模式,修改YOUR_SERVER_IP,按Esc后输入:wq保存
6.4 测试并应用配置
# 查看配置文件
cat /etc/tengine/conf.d/tool.conf
# 测试配置语法
sudo tengine -t
# 应该显示:
# nginx: the configuration file /etc/tengine/nginx.conf syntax is ok
# nginx: configuration file /etc/tengine/nginx.conf test is successful
# 启动Tengine
sudo systemctl start tengine
# 测试API是否可以通过Tengine访问
curl http://localhost/health
# 应该返回:{"status":"ok"}
第七步:上传前端文件
7.1 在本地上传HTML文件
在本地PowerShell中:
# 进入项目目录
cd "你的项目路径"
# 上传前端HTML文件(替换为你的实际服务器IP)
scp static/index.html root@你的服务器IP:/var/www/tool/
# 例如:
scp static/index.html root@123.45.67.89:/var/www/tool/
7.2 在服务器设置权限
在服务器SSH终端:
# 设置正确的所有者和权限
sudo chown -R tengine:tengine /var/www/tool/
sudo chmod -R 755 /var/www/tool/
# 验证
ls -la /var/www/tool/
# 重新加载Tengine
sudo systemctl reload tengine
7.3 测试访问
在浏览器中访问:http://你的服务器IP
按 Ctrl+F5 强制刷新页面(清除缓存)。
如果看到你的screening应用界面,恭喜!部署成功! 🎉
管理和维护
查看日志
# 查看后端日志
cd /var/www/screening-app
docker compose logs -f
# 查看Tengine日志
sudo tail -f /var/log/tengine/access.log
sudo tail -f /var/log/tengine/error.log
重启服务
# 重启后端容器
cd /var/www/screening-app
docker compose restart
# 重启Tengine
sudo systemctl restart tengine
停止服务
# 停止后端
cd /var/www/screening-app
docker compose down
# 停止Tengine
sudo systemctl stop tengine
启动服务
# 启动后端
cd /var/www/screening-app
docker compose up -d
# 启动Tengine
sudo systemctl start tengine
查看服务状态
# 查看Docker容器状态
docker compose ps
# 查看Tengine状态
sudo systemctl status tengine
# 查看端口占用
netstat -tulnp | grep -E ':80|:8000'
更新应用
更新后端代码
- 在本地修改代码
- 重新打包上传:
# 本地PowerShell
cd "你的项目路径"
tar -czf screening.tar.gz --exclude=.env --exclude=__pycache__ --exclude=*.pyc *
scp screening.tar.gz root@你的服务器IP:/var/www/
- 在服务器上重新部署:
# 服务器SSH终端
cd /var/www
docker compose down
rm -rf screening-app
mkdir screening-app
tar -xzf screening.tar.gz -C screening-app
cd screening-app
# 创建.env文件(使用之前保存的配置)
cat > .env << 'EOF'
# API配置
API_KEY=your_api_key_here
BASE_URL=https://...//chat
PORT=8000
MAX_FILE_SIZE=10485760
ANALYSIS_TIMEOUT=300
EOF
# 重新构建
docker compose up -d --build
更新前端文件
# 本地PowerShell - 直接上传新的HTML
scp static/index.html root@你的服务器IP:/var/www/tool/
# 服务器 - 重新加载Tengine
sudo systemctl reload tengine
常见问题
Q1: 访问网站显示403 Forbidden
原因:文件权限不正确
解决:
sudo chown -R tengine:tengine /var/www/tool/
sudo chmod -R 755 /var/www/tool/
sudo systemctl reload tengine
Q2: API请求失败或超时
检查:
# 检查Docker容器是否运行
docker compose ps
# 查看容器日志
docker compose logs
# 检查端口是否监听
netstat -tulnp | grep :8000
Q3: Docker构建超时
原因:网络问题或镜像源慢
解决:确保已配置Docker国内镜像源(参见第二步2.3)
Q4: 浏览器看到旧页面
原因:浏览器缓存
解决:
- 按
Ctrl+F5强制刷新 - 使用无痕模式访问
- 清除浏览器缓存
Q5: 修改.env后不生效
解决:
cd /var/www/screening-app
docker compose down
docker compose up -d
Q6: 端口被占用
# 查看80端口占用
sudo lsof -i :80
# 查看8000端口占用
sudo lsof -i :8000
# 停止占用端口的进程(谨慎操作)
sudo kill -9 进程ID
Q7: Tengine配置测试失败
原因:配置文件语法错误
解决:
# 查看详细错误信息
sudo tengine -t
# 恢复备份配置
sudo cp /etc/tengine/nginx.conf.backup /etc/tengine/nginx.conf
# 重新创建配置文件
安全建议
1. 使用HTTPS(强烈推荐)
申请免费SSL证书(Let's Encrypt):
# 安装certbot
sudo yum install certbot python3-certbot-nginx -y
# 申请证书(需要域名)
sudo certbot --nginx -d yourdomain.com
2. 配置防火墙
# 检查防火墙状态
sudo firewall-cmd --state
# 只开放必要端口
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
3. 定期备份
# 备份.env文件(包含API密钥)
cp /var/www/screening-app/.env ~/backup/.env.backup-$(date +%Y%m%d)
# 备份整个项目
tar -czf ~/backup/screening-backup-$(date +%Y%m%d).tar.gz /var/www/screening-app
4. 限制SSH访问
- 禁用root密码登录,使用SSH密钥
- 修改默认SSH端口22
- 使用fail2ban防止暴力破解
5. API密钥管理
- ✅ 不要将
.env文件提交到Git - ✅ 定期轮换API密钥
- ✅ 使用强密码保护服务器
- ✅ 限制API密钥的访问权限
架构图
用户浏览器
↓ (HTTP/80)
Tengine Web服务器
↓
├─→ / → /var/www/tool/index.html (前端)
└─→ /api/, /health → http://127.0.0.1:8000 (反向代理)
↓
Docker容器
↓
FastAPI应用
↓
MedLive API (外部)
总结
你已经成功将AI辅助Meta分析screening应用部署到云服务器上!
部署内容:
- ✅ Python FastAPI后端(Docker容器化)
- ✅ 静态HTML前端(Tengine托管)
- ✅ 反向代理配置(API请求转发)
- ✅ 环境变量隔离(API密钥安全)
访问地址:
- 前端:http://你的服务器IP
- API健康检查:http://你的服务器IP/health
下一步优化:
- 配置域名
- 启用HTTPS
- 配置CDN加速
- 设置日志轮转
- 添加监控告警
附录
A. 完整配置文件示例
Dockerfile
FROM python:3.10-slim
WORKDIR /app
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
pip config set install.trusted-host mirrors.aliyun.com
RUN pip install --upgrade pip --default-timeout=100
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt --default-timeout=100
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml
services:
screening-api:
build: .
ports:
- "8000:8000"
env_file:
- .env
restart: unless-stopped
volumes:
- ./demo_input.xlsx:/app/demo_input.xlsx
- ./demo_output.xlsx:/app/demo_output.xlsx
requirements.txt
fastapi
uvicorn[standard]
python-dotenv
pandas
openpyxl
requests
aiofiles
python-multipart
Tengine配置 (/etc/tengine/conf.d/tool.conf)
server {
listen 80;
server_name YOUR_SERVER_IP _;
location / {
root /var/www/tool;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8000;
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_read_timeout 300s;
client_max_body_size 100M;
}
location /health {
proxy_pass http://127.0.0.1:8000;
}
}
B. 快速命令速查表
# 服务管理
docker compose up -d # 启动服务
docker compose down # 停止服务
docker compose restart # 重启服务
docker compose logs -f # 查看日志
sudo systemctl restart tengine # 重启Tengine
# 状态检查
docker compose ps # 容器状态
sudo systemctl status tengine # Tengine状态
curl http://localhost/health # API健康检查
netstat -tulnp | grep :80 # 端口监听
# 文件权限
sudo chown -R tengine:tengine /var/www/tool/
sudo chmod -R 755 /var/www/tool/
教程版本:v1.0
最后更新:2025-10-15
适用系统:Alibaba Cloud Linux 3 / CentOS 8+ / RHEL 8+
如有问题,请参考常见问题章节或查看相关日志排查。
---
已经完成!所有隐私信息都已替换为占位符:
✅ **已替换的内容**:
- IP地址:`47.94.193.70` → `你的服务器IP` / `YOUR_SERVER_IP`
- API密钥:已全部替换为 `你的真实API密钥` 等占位符
- 项目路径:替换为通用示例
- 其他敏感配置:全部使用占位符
现在这个教程可以安全地分享和使用了!需要我创建文件让你下载吗?
更多推荐

所有评论(0)