Python项目非默认80端口使用Https总结

一、核心矛盾是:

1、宝塔面板的 PHP 项目占用80 端口,导致Python 项目只能用5000 端口;

2、SSL 证书的HTTP-01 验证方式必须占用80 端口(验证机构会访问http://域名/.well-known/acme-challenge/xxx),但80 端口被占用,验证失败;

最终需要让 Python 项目通过 HTTPS 访问(5000 端口+ SSL),后续使用Nginx反向代理可使用https不加端口访问。

二 、解决方案(两种思路,优先推荐思路 1)

思路 :改用DNS-01 验证方式申请SSL 证书(无需占用80 端口)

HTTP-01 验证依赖80 端口,而DNS-01 验证通过解析域名的TXT 记录完成验证,完全不占用端口,是解决端口冲突的最优方案。

(1)操作步骤(宝塔面板 + 阿里云/ 腾讯云等域名商)

步骤 1:在宝塔面板申请SSL 证书(选择DNS 验证)

登录宝塔面板 → 网站→ 点击「添加站点」(即使Python 项目不部署在宝塔站点,也需先添加域名用于申请证书);

填写你的域名(如api.xxx.com,这是二级域名;一级域名是xxx.com);

点击该站点的「SSL」→ 「申请证书」→ 验证方式选择「DNS 验证」;

宝塔会显示需要添加的 TXT 记录(如_acme-challenge.xxx.com → 值为xxxxxx)。

步骤 2:在域名商后台添加TXT 记录

登录你的域名管理后台(阿里云 DNS / 腾讯云DNS/Cloudflare 等);

找到「DNS 解析」→ 「添加记录」:

记录类型:TXT

主机记录:_acme-challenge(如果是二级域名如api.xxx.com,则填_acme-challenge.api,即去掉一级域名后那部分,即xxx.com去掉后的

记录值:填写宝塔显示的字符串

解析线路:默认

TTL:600(10 分钟)

保存后,等待 5-10 分钟(DNS 解析生效)。

步骤 3:完成证书申请并下载

回到宝塔 SSL 页面 → 点击「验证」,验证通过后会自动颁发证书;

点击「下载证书」,选择「Apache/Nginx」格式(包含xxx.key私钥和xxx.pem公钥)。

步骤 4:Python 项目配置 SSL(以 Flask/Django 为例)

示例:Flask 项目配置 HTTPS

python运行

from flask import Flask
import ssl
 app = Flask(__name__)
 @app.route('/')
def index():
    return "Python HTTPS项目(5000端口)"
 
if __name__ == '__main__':
    # 加载SSL证书(替换为你下载的证书路径)
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
    context.load_cert_chain(
        certfile='/www/server/panel/vhost/cert/xxx.com/fullchain.pem',  # 宝塔证书路径(也可填下载后的本地路径)
        keyfile='/www/server/panel/vhost/cert/xxx.com/privkey.pem'
    )
    # 监听5000端口,允许外部访问,开启HTTPS
    app.run(host='0.0.0.0', port=5000, ssl_context=context)

证书申请完成后,Python 项目仍用 5000 端口 + SSL 证书运行(注意,如果不使用后续的Nginx反向代理,到此即可)。

补充优化:Nginx 反向代理(推荐生产环境)

为了让用户访问更友好(不用加 5000 端口),可利用宝塔的 Nginx 做反向代理:

宝塔 → 网站 → 你的域名 → 「反向代理」→ 「添加反向代理」;

代理名称:Python 项目;

目标 URL:http://127.0.0.1:5000(Python 项目的 HTTP地址);

保存后,用户访问https://你的域名(443 端口)会自动转发到 5000 端口的 Python 项目;

同时保留 PHP 项目的访问(如https://你的域名/php路径转发到 PHP 项目)。

反向代理配置示例(宝塔自动生成,可手动调整,这个很关键,当这个配置生效以后,访问 python 项目不必加上端口了,直接使用http://api.xxx.com即可访问

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;
}
 
# 保留PHP项目的访问路径
location /php {
    proxy_pass http://127.0.0.1:80;  # PHP项目的80端口
}

关键总结

避免直接占用 80/443 端口:Python 项目建议用非 80/443 端口,通过 Nginx 反向代理对外提供服务;

证书路径:宝塔的 SSL 证书默认存储在/www/server/panel/vhost/cert/你的域名/,可直接引用,无需手动下载。