目录
-
- 概述
- 第一步:配置域名解析
- 第二步:服务器环境配置
- 第三步:申请SSL证书
- 第四步:配置Nginx反向代理
- 第五步:部署Flask应用
- 第六步:验证部署
- 重要补充事项
-
- [1. 安全组配置](#1. 安全组配置)
- [2. 证书续期](#2. 证书续期)
- [3. 防火墙配置(如启用)](#3. 防火墙配置(如启用))
- 常见问题排查
-
- 问题1:无法访问网站
- 问题2:证书无效或不安全
- [问题3:502 Bad Gateway](#问题3:502 Bad Gateway)
- 生产环境优化建议
-
- [1. 使用进程管理工具](#1. 使用进程管理工具)
- [2. 启用访问日志](#2. 启用访问日志)
- [3. 性能优化](#3. 性能优化)
- 一些问题排查
-
-
- [📋 问题现象](#📋 问题现象)
- [🔍 排查过程](#🔍 排查过程)
- [🎯 根本原因](#🎯 根本原因)
- [✅ 解决方案](#✅ 解决方案)
-
- [1. Gunicorn 超时设置](#1. Gunicorn 超时设置)
- [2. Nginx HTTPS 超时设置](#2. Nginx HTTPS 超时设置)
- [🚀 性能优化](#🚀 性能优化)
-
- [使用 gevent 异步 Worker + 增加 Worker 数量](#使用 gevent 异步 Worker + 增加 Worker 数量)
- [📊 最终配置对比](#📊 最终配置对比)
- [💡 经验教训](#💡 经验教训)
-
概述
完成HTTPS部署需要完成4个核心步骤:
- 域名解析 - 将域名指向服务器IP
- 环境配置 - 安装Nginx、Certbot等工具
- SSL证书 - 申请并配置免费证书
- 反向代理 - 配置Nginx转发HTTPS请求到Flask
第一步:配置域名解析
登录腾讯云购买域名:腾讯云购买域名

操作步骤
- 登录腾讯云控制台 → 域名注册 → 选择已购买的域名(如
example.top) - 进入域名解析 页面,点击添加记录
解析配置
| 记录类型 | 主机记录 | 记录值 | TTL |
|---|---|---|---|
| A | @ | 你的服务器公网IP | 600 |
| A | www | 你的服务器公网IP | 600 |
配置说明:
@- 支持直接访问根域名(如example.top)www- 支持www子域名访问(如www.example.top)- TTL 600秒 - 约10分钟生效
验证解析
等待5-10分钟后,在本地终端执行:
bash
ping 你的域名
若能返回服务器IP地址,说明解析已生效。
第二步:服务器环境配置
登录服务器
通过腾讯云控制台使用一键登录功能,或使用SSH客户端登录。
安装必备软件
bash
# 更新系统软件包(适用于Ubuntu/Debian)
sudo apt update && sudo apt upgrade -y
# 安装Nginx(Web服务器)
apt install nginx -y
# 安装Certbot(SSL证书工具)
apt install certbot python3-certbot-nginx -y
# 安装Gunicorn(生产级WSGI服务器)
pip3 install gunicorn
工具说明:
- Nginx - 反向代理服务器,处理HTTPS请求
- Certbot - 自动化SSL证书管理工具
- Gunicorn - 替代Flask开发服务器,更稳定高效
第三步:申请SSL证书
腾讯云提供免费DV证书 (有效期90天):https://cloud.tencent.com/document/product/400/89868
申请流程
-
进入证书管理
- 腾讯云控制台搜索 SSL证书 → 证书管理 → 申请免费证书
-
证书配置:
- 域名类型:选「单域名」→ 输入你的域名(如
xxx.top); - 验证方式:选「DNS验证」(自动配置,最省心);
- 其他默认,点击「提交申请」。

- 域名类型:选「单域名」→ 输入你的域名(如
-
自动验证:腾讯云会自动给你的域名添加DNS验证记录,等待5-10分钟,证书状态变成「已签发」。

-
下载证书
- 点击下载 → 选择 Nginx 版本
- 解压获得两个文件:
example.top_bundle.crt(证书文件)example.top.key(私钥文件)
上传证书到服务器
bash
# 创建证书目录
mkdir -p /etc/nginx/cert
# 使用SFTP工具(如FileZilla、Xftp)上传证书文件到此目录
# 上传后目录结构:
# /etc/nginx/cert/
# ├── example.top_bundle.crt
# └── example.top.key
第四步:配置Nginx反向代理
创建配置文件
bash
# 备份默认配置(可选)
mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.bak
# 创建新配置
vim /etc/nginx/sites-available/flask-app
Nginx配置内容
nginx
# HTTP自动跳转HTTPS
server {
listen 80;
server_name example.top www.example.top;
return 301 https://$host$request_uri;
}
# HTTPS主配置
server {
listen 443 ssl http2;
server_name example.top www.example.top;
# SSL证书配置
ssl_certificate /etc/nginx/cert/example.top_bundle.crt;
ssl_certificate_key /etc/nginx/cert/example.top.key;
# SSL安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 反向代理到Flask应用
location / {
proxy_pass http://127.0.0.1:5000;
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;
}
}
配置说明:
- 替换
example.top为你的实际域名 - 替换证书文件路径为实际路径
proxy_pass指向Flask应用监听的端口(默认5000)
启用配置
bash
# 创建软链接
ln -s /etc/nginx/sites-available/flask-app /etc/nginx/sites-enabled/
# 测试配置语法
nginx -t
# 重启Nginx
systemctl restart nginx
# 设置开机自启
systemctl enable nginx


第五步:部署Flask应用
安装项目依赖
bash
# 进入项目目录
cd /path/to/your/flask/project
# 安装依赖
pip3 install -r requirements.txt
生成requirements.txt(如未创建):
bash
# 方法1:导出当前环境所有包
pip freeze > requirements.txt
# 方法2:仅导出项目实际使用的包(推荐)
pip install pipreqs
pipreqs . --encoding=utf8 --force
启动Flask服务
bash
# 使用Gunicorn后台运行(4个工作进程)
nohup gunicorn -w 4 -b 127.0.0.1:5000 app:app > flask.log 2>&1 &

参数说明:
-w 4- 4个工作进程(建议为CPU核心数的2-4倍)-b 127.0.0.1:5000- 绑定到本地5000端口app:app- 第一个app是文件名(如app.py),第二个app是Flask实例变量名nohup ... &- 后台运行,断开SSH不会终止进程
此时容易多进程被kill,可以尝试:
nohup gunicorn -w 4 -b 127.0.0.1:5000 --timeout 240 app_v6:app > flask.log 2>&1 &
进程管理(可选)
查看运行状态:
bash
ps aux | grep gunicorn
停止服务:
bash
pkill gunicorn
第六步:验证部署
-
浏览器访问
- 打开
https://你的域名 - 地址栏应显示🔒锁图标
- 页面正常加载
- 打开
-
SSL证书检查
- 点击地址栏锁图标
- 查看证书信息,确认颁发机构为TrustAsia
-
HTTP跳转测试
- 访问
http://你的域名 - 应自动跳转到HTTPS版本
- 访问
重要补充事项
1. 安全组配置
确保腾讯云安全组已放行必要端口:
- 登录云服务器控制台 → 安全组
- 添加入站规则:
| 协议 | 端口 | 来源 | 策略 |
|---|---|---|---|
| TCP | 80 | 0.0.0.0/0 | 允许 |
| TCP | 443 | 0.0.0.0/0 | 允许 |
2. 证书续期
- 免费证书有效期1年
- 到期前腾讯云会通过邮件/短信提醒
- 重新申请流程与首次相同
3. 防火墙配置(如启用)
bash
# 允许HTTP和HTTPS
ufw allow 80/tcp
ufw allow 443/tcp
ufw reload
常见问题排查
问题1:无法访问网站
排查步骤:
-
检查域名解析
bashping 你的域名 # 应返回服务器IP -
检查Nginx状态
bashsystemctl status nginx # 应显示active (running) -
检查安全组
- 确认80和443端口已放行
-
查看Nginx错误日志
bashtail -f /var/log/nginx/error.log
问题2:证书无效或不安全
可能原因:
- 证书文件路径错误
- 证书与域名不匹配
- 中间证书缺失
解决方法:
bash
# 检查证书文件权限
ls -l /etc/nginx/cert/
# 验证证书内容
openssl x509 -in /etc/nginx/cert/example.top_bundle.crt -text -noout
问题3:502 Bad Gateway
原因: Nginx无法连接到Flask应用
解决方法:
bash
# 检查Flask是否运行
ps aux | grep gunicorn
# 检查端口监听
netstat -tlnp | grep 5000
# 重启Flask应用
pkill gunicorn
cd /path/to/project
nohup gunicorn -w 4 -b 127.0.0.1:5000 app:app > flask.log 2>&1 &
生产环境优化建议
1. 使用进程管理工具
推荐使用Supervisor或systemd管理Gunicorn进程:
bash
# 安装Supervisor
apt install supervisor -y
# 创建配置文件
vim /etc/supervisor/conf.d/flask-app.conf
配置内容:
ini
[program:flask-app]
directory=/path/to/your/project
command=gunicorn -w 4 -b 127.0.0.1:5000 app:app
user=www-data
autostart=true
autorestart=true
stderr_logfile=/var/log/flask-app.err.log
stdout_logfile=/var/log/flask-app.out.log
2. 启用访问日志
在Nginx配置中添加:
nginx
access_log /var/log/nginx/flask-app-access.log;
error_log /var/log/nginx/flask-app-error.log;
3. 性能优化
nginx
# 启用Gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;
# 静态文件缓存
location /static {
alias /path/to/your/project/static;
expires 30d;
add_header Cache-Control "public, immutable";
}
一些问题排查
📋 问题现象
在 Flask + Gunicorn + Nginx 部署的 Word 文档格式化服务中,两个请求同时提交时,一个成功,另一个报错:
处理失败:Unexpected token '<', "..." is not valid JSON
🔍 排查过程
| 步骤 | 检查内容 | 结果 |
|---|---|---|
| 1 | 代码并发问题(文件路径冲突) | ✅ 代码已使用 process_id,无问题 |
| 2 | Flask 日志 | ✅ 两个请求都处理成功 |
| 3 | 浏览器 Network 面板 | ❌ 发现 504 Gateway Timeout |
| 4 | Nginx 配置 | ❌ HTTPS 配置缺少超时设置 |
🎯 根本原因
双重超时问题:LLM API调用耗时较长,触发了超时限制。
用户请求 → Nginx (60秒超时) → Gunicorn (30秒超时) → Flask →LLM API (耗时1-2分钟)
↓ ↓
504 错误页面(HTML) Worker 被杀死
↓
前端收到 HTML 而非 JSON
↓
JSON.parse() 失败:"Unexpected token '<'"
✅ 解决方案
1. Gunicorn 超时设置
bash
# 之前(默认30秒)
gunicorn -w 4 -b 127.0.0.1:5000 app_v6:app
# 之后(240秒)
gunicorn -w 4 -b 127.0.0.1:5000 --timeout 240 app_v6:app
2. Nginx HTTPS 超时设置
修改 /etc/nginx/conf.d/flask_https.conf:
nginx
location / {
proxy_pass http://127.0.0.1:5000;
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;
# 新增:超时设置(5分钟)
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
}
🚀 性能优化
使用 gevent 异步 Worker + 增加 Worker 数量
bash
# 安装 gevent
pip install gevent --break-system-packages
# 优化后的启动命令
nohup gunicorn -w 8 -k gevent -b 127.0.0.1:5000 --timeout 240 app_v6:app > flask.log 2>&1 &
| 参数 | 含义 | 效果 |
|---|---|---|
-w 8 |
8 个 worker | 提升并发处理能力 |
-k gevent |
异步模式 | 单个 worker 可处理多个请求 |
--timeout 240 |
4 分钟超时 | 容纳 LLM API 长耗时 |
📊 最终配置对比
| 组件 | 修改前 | 修改后 |
|---|---|---|
| Gunicorn Worker | 4 个同步 | 8 个异步 (gevent) |
| Gunicorn 超时 | 30 秒 | 240 秒 |
| Nginx 超时 | 60 秒 | 300 秒 |
💡 经验教训
-
"Unexpected token '<'" = 收到了 HTML 而非 JSON,通常是代理层返回的错误页面
-
涉及外部 API 的服务,必须检查整条链路的超时:
- 前端 fetch(用户浏览器) → Nginx → Gunicorn → Flask → 外部 API
(前端) (门卫) (管理员) (员工) (外包公司)
- 前端 fetch(用户浏览器) → Nginx → Gunicorn → Flask → 外部 API
完整请求流程
1. 用户点击"开始处理"
↓
2. 浏览器 fetch 发送 POST 请求
↓
3. Nginx 收到请求(HTTPS 解密)
↓ 转发到 127.0.0.1:5000
4. Gunicorn 收到请求,分配给空闲 Worker
↓
5. Flask 执行 continue_processing()
↓ 调用外部 API
6. LLM 返回 AI 结果(耗时最长)
↓
7. Flask 处理文档,返回 JSON
↓
8. Gunicorn → Nginx → 浏览器
↓
9. 前端显示"处理成功"
-
并发问题不一定是代码 bug,也可能是基础设施配置问题
-
排查顺序:浏览器 Network 面板 → 服务器日志 → 配置文件