腾讯云域名配置HTTPS完整指南:从0到1部署Flask应用

目录

概述

完成HTTPS部署需要完成4个核心步骤

  1. 域名解析 - 将域名指向服务器IP
  2. 环境配置 - 安装Nginx、Certbot等工具
  3. SSL证书 - 申请并配置免费证书
  4. 反向代理 - 配置Nginx转发HTTPS请求到Flask

第一步:配置域名解析

登录腾讯云购买域名:腾讯云购买域名

操作步骤

  1. 登录腾讯云控制台域名注册 → 选择已购买的域名(如 example.top
  2. 进入域名解析 页面,点击添加记录

解析配置

记录类型 主机记录 记录值 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

申请流程

  1. 进入证书管理

    • 腾讯云控制台搜索 SSL证书证书管理申请免费证书
  2. 证书配置:

    • 域名类型:选「单域名」→ 输入你的域名(如 xxx.top);
    • 验证方式:选「DNS验证」(自动配置,最省心);
    • 其他默认,点击「提交申请」。
  3. 自动验证:腾讯云会自动给你的域名添加DNS验证记录,等待5-10分钟,证书状态变成「已签发」。

  4. 下载证书

    • 点击下载 → 选择 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

第六步:验证部署

  1. 浏览器访问

    • 打开 https://你的域名
    • 地址栏应显示🔒锁图标
    • 页面正常加载
  2. SSL证书检查

    • 点击地址栏锁图标
    • 查看证书信息,确认颁发机构为TrustAsia
  3. HTTP跳转测试

    • 访问 http://你的域名
    • 应自动跳转到HTTPS版本

重要补充事项

1. 安全组配置

确保腾讯云安全组已放行必要端口:

  1. 登录云服务器控制台安全组
  2. 添加入站规则:
协议 端口 来源 策略
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:无法访问网站

排查步骤:

  1. 检查域名解析

    bash 复制代码
    ping 你的域名
    # 应返回服务器IP
  2. 检查Nginx状态

    bash 复制代码
    systemctl status nginx
    # 应显示active (running)
  3. 检查安全组

    • 确认80和443端口已放行
  4. 查看Nginx错误日志

    bash 复制代码
    tail -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 秒

💡 经验教训

  1. "Unexpected token '<'" = 收到了 HTML 而非 JSON,通常是代理层返回的错误页面

  2. 涉及外部 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. 前端显示"处理成功"
  1. 并发问题不一定是代码 bug,也可能是基础设施配置问题

  2. 排查顺序:浏览器 Network 面板 → 服务器日志 → 配置文件

相关推荐
teamlet5 小时前
多域名TLS 证书的自动签名和续期
golang·https·letsencrypt·acmev2
lx188548698961 天前
HTTPS总结
服务器·网络协议·https
2501_915106321 天前
App HTTPS 抓包实战解析,从代理调试到真实网络流量观察的完整抓包思路
网络协议·http·ios·小程序·https·uni-app·iphone
TG:@yunlaoda360 云老大1 天前
如何了解腾讯云国际站代理商CSS的服务流程是怎样的?
css·云计算·腾讯云
游戏开发爱好者81 天前
苹果App Store应用程序上架方式全面指南
android·小程序·https·uni-app·iphone·webview
故乡de云1 天前
腾讯云国内信用卡/银联卡注册教程
腾讯云
2501_916008891 天前
深入理解 iPhone 文件管理,从沙盒结构到开发调试的多工具协同实践
android·ios·小程序·https·uni-app·iphone·webview
华仔-_-1 天前
腾讯云centos+gitee 前端自动化部署
gitee·centos·腾讯云
gAlAxy...1 天前
详解 Gitee/GitHub 中 HTTPS/SSH 方式数据库仓库创建与本地连接
https·gitee·github