一、核心矛盾是:
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/你的域名/,可直接引用,无需手动下载。