引言
最近在为团队搭建数仓配套的 Flask 接口服务时,先后遇到了 yum 源报错、SSL 模块编译失败、配置覆盖、软链接冲突等一系列问题。特此整理完整流程,包含所有问题的报错信息、排查思路和解决方案,给有同样需求的小伙伴避坑!
环境说明
- 系统:CentOS 7.x(64 位)
- 目标 Python 版本:3.11.6(Flask3.0.0 官方推荐 3.8~3.11,3.11.6 最稳定)
- 目标 Flask 版本:3.0.0
- 核心痛点:CentOS7 自带 OpenSSL 1.0.2(Python3.11+ 要求 1.1.1+)、官方 yum 源已停止维护
一、准备工作
1. 工具与源码下载
- 依赖工具:
gcc、make等编译工具(后续通过 yum 安装) - Python3.11.6 源码:清华镜像(推荐,速度快)
- OpenSSL1.1.1w 源码:官网地址(Python3.11+ 必需)
2. 提前说明
- 全程使用 root 用户操作(避免权限问题,非 root 需加
sudo) - 所有命令可直接复制执行,关键步骤会标注 “坑点” 和 “注意事项”
- 最终 Python 安装路径:
/usr/local/python3.11(避免覆盖系统默认 Python2.7)
二、分步搭建流程(含问题解决)
阶段 1:修复 yum 源(CentOS7 必做)
问题现象
执行 yum install 时报错:
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Name or service not known"
原因
CentOS7 已于 2024 年 6 月终止官方支持,mirrorlist.centos.org 失效,需替换为官方归档源。
解决方案
- 备份旧 repo 文件
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
- 创建新的 CentOS-Base.repo
vi /etc/yum.repos.d/CentOS-Base.repo
粘贴以下内容(官方归档源):
[base]
name=CentOS-7 - Base - vault.centos.org
baseurl=http://vault.centos.org/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-7 - Updates - vault.centos.org
baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-7 - Extras - vault.centos.org
baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7
- 清理并生成 yum 缓存
yum clean all
yum makecache
阶段 2:安装编译依赖库
# 安装开发工具组
yum groupinstall -y "Development Tools"
# 安装 Python 编译必需依赖
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
阶段 3:升级 OpenSSL 到 1.1.1w(核心步骤)
问题现象
直接编译 Python3.11.6 会报错:
Could not build the ssl module!
Python requires a OpenSSL 1.1.1 or newer
原因
CentOS7 自带 OpenSSL 1.0.2,不满足 Python3.11+ 要求,需手动升级。
解决方案
- 下载并解压 OpenSSL 源码
cd /usr/src
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
- 编译安装(指定自定义路径,避免覆盖系统默认)
./config --prefix=/usr/local/openssl-1.1.1 shared zlib
make -j$(nproc) # 多核加速编译
make install
- 配置系统识别新 OpenSSL
# 添加动态链接库缓存
echo '/usr/local/openssl-1.1.1/lib' > /etc/ld.so.conf.d/openssl-1.1.1.conf
ldconfig # 生效配置
# 验证版本
/usr/local/openssl-1.1.1/bin/openssl version # 应输出 OpenSSL 1.1.1w
阶段 4:编译安装 Python3.11.6(避坑重点)
坑点 1:连续执行 configure 导致配置覆盖
错误操作
./configure --prefix=/usr/local/python3.11 --with-ssl=/usr/local/openssl-1.1.1
./configure --enable-optimizations # 第二次执行覆盖了第一次的 --with-ssl 参数
后果
编译时仍会缺失 SSL 模块,白折腾!
正确步骤
- 下载并解压 Python 源码
cd /home/ga/python # 自定义目录,可修改
wget https://mirrors.tuna.tsinghua.edu.cn/python/3.11.6/Python-3.11.6.tgz
curl -O https://mirrors.tuna.tsinghua.edu.cn/python/3.11.6/Python-3.11.6.tgz #curl比wget效率更高
tar -xzf Python-3.11.6.tgz
cd Python-3.11.6
- 清理残留配置(若之前编译失败过)
make distclean # 彻底清理,比 make clean 更彻底
- 一次性配置编译参数(关键!)
# 设置环境变量,强制指定 OpenSSL 路径(双重保险)
export LDFLAGS="-L/usr/local/openssl-1.1.1/lib -Wl,-rpath,/usr/local/openssl-1.1.1/lib"
export CPPFLAGS="-I/usr/local/openssl-1.1.1/include"
# 合并所有参数执行 configure
./configure \
--prefix=/usr/local/python3.11 \
--with-ssl=/usr/local/openssl-1.1.1 \
--enable-optimizations # 编译优化(提升 Python 性能)
- 编译 + 安装
make -j$(nproc) # 多核加速,时间 5-20 分钟
make altinstall # 用 altinstall 避免覆盖系统 Python2.7
- 验证 Python 与 SSL 模块
# 调用新安装的 Python
/usr/local/python3.11/bin/python3.11 -c "
import ssl
print('SSL 模块加载成功!')
print('OpenSSL 版本:', ssl.OPENSSL_VERSION) # 应输出 1.1.1w
"
成功输出
SSL 模块加载成功!
OpenSSL 版本: OpenSSL 1.1.1w 11 Sep 2023
阶段 5:配置 Python 环境变量(软链接)
问题现象
创建软链接时报错:
ln: failed to create symbolic link ‘/usr/bin/pip3’: File exists
原因
之前安装过其他 Python 版本,旧软链接未删除。
解决方案
- 删除旧软链接
# 强制删除旧的 python3 和 pip3 软链接
rm -f /usr/bin/python3
rm -f /usr/bin/pip3
- 创建新软链接
# 关联 Python3.11.6
ln -s /usr/local/python3.11/bin/python3.11 /usr/bin/python3
ln -s /usr/local/python3.11/bin/pip3.11 /usr/bin/pip3
- 验证
python3 -V # 输出 Python 3.11.6
pip3 -V # 输出 pip 23.2.1 from /usr/local/python3.11/lib/python3.11/site-packages/pip (python 3.11)
阶段 6:安装 Flask3.0.0
- 配置 pip 国内源(加速安装)
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
成功输出
Writing to /root/.config/pip/pip.conf
- 升级 pip 并安装 Flask
pip3 install --upgrade pip # 升级 pip 到最新版
pip3 install Flask==3.0.0
- 验证 Flask 安装
python3 -c "import flask; print('Flask 版本:', flask.__version__)"
成功输出(注意:DeprecationWarning 是正常提示,不影响使用)
<string>:1: DeprecationWarning: The '__version__' attribute is deprecated and will be removed in Flask 3.1. Use feature detection or 'importlib.metadata.version("flask")' instead.
Flask 版本: 3.0.0
三、核心坑点总结
- yum 源失效:CentOS7 必须换
vault.centos.org归档源,否则无法安装依赖; - OpenSSL 版本低:Python3.11+ 强制要求 1.1.1+,需手动编译安装并配置环境变量;
- configure 配置覆盖:参数必须一次合并执行,不能分两次
./configure; - 软链接冲突:创建新链接前,先删除旧的
python3/pip3软链接; - SSL 模块编译失败:通过
LDFLAGS/CPPFLAGS强制指定 OpenSSL 路径,双重保险。
四、最终验证
# 完整环境验证脚本
python3 -c "
import ssl
import flask
print('✅ 系统环境验证通过!')
print(f'Python 版本:{ssl.__version__}')
print(f'OpenSSL 版本:{ssl.OPENSSL_VERSION}')
print(f'Flask 版本:{flask.__version__}')
"
输出结果
✅ 系统环境验证通过!
Python 版本:3.11.6
OpenSSL 版本:OpenSSL 1.1.1w 11 Sep 2023
Flask 版本:3.0.0
至此,CentOS7 上的 Python3.11.6+Flask3.0.0 环境搭建完成!如果遇到其他问题,欢迎在评论区留言交流~