CentOS 7 云服务器部署踩坑记(二):Python 3.11 编译与 SSL 模块配置

背景#

CentOS 7 自带 Python 2.7,部署 Streamlit 和 Flask 需要 Python 3.10+。直接编译安装 Python 3.11,结果各种报错,其中最坑的是 SSL 模块缺失——import ssl 直接失败,导致所有涉及网络的包都无法用。

根本原因:CentOS 7 自带 OpenSSL 1.0.2,而 Python 3.10+ 要求 OpenSSL 1.1.1+。必须先手动编译 OpenSSL,再编译 Python。


问题一:编译警告 stdatomic.h#

提示信息:

configure: Your compiler or platform does have a working C11 stdatomic.h.
A future version of Python may require stdatomic.h.

只是警告,不影响安装,直接继续执行 sudo make altinstall


问题二:python3.11 命令找不到#

报错信息:

sudo: python3.11: command not found

使用 altinstall 安装时不会覆盖系统默认版本,可执行文件在 /usr/local/bin/,需要手动建软链接:

ls /usr/local/bin/python*
sudo ln -s /usr/local/bin/python3.11 /usr/bin/python3.11
python3.11 --version

问题三:venv 创建失败,encodings 模块找不到#

报错信息:

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
ModuleNotFoundError: No module named 'encodings'

Python 编译不完整,标准库未正确安装。重新编译:

cd /opt/Python-3.11.9
sudo make clean
sudo ./configure --with-ensurepip=install
sudo make -j2
sudo make altinstall

问题四:profile-opt 编译错误#

报错信息:

SystemError: <built-in function compile> returned NULL without setting an exception
make: *** [profile-opt] Error 2

--enable-optimizations 选项在某些环境下会失败,去掉重编:

cd /opt
sudo rm -rf Python-3.11.9
sudo tar xzf Python-3.11.9.tgz
cd Python-3.11.9
sudo ./configure --with-ensurepip=install   # 不加 --enable-optimizations
sudo make -j2
sudo make altinstall

问题五(重点):No module named ‘_ssl’#

报错信息:

>>> import ssl
ModuleNotFoundError: No module named '_ssl'

编译日志里会有这条提示:

Could not build the ssl module!
Python requires a OpenSSL 1.1.1 or newer

这是 CentOS 7 最坑的地方。系统自带 OpenSSL 1.0.2k,必须手动编译 1.1.1,再重新编译 Python 并指定 OpenSSL 路径。


完整解决方案#

第一步:编译安装 OpenSSL 1.1.1#

cd /opt
sudo wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
sudo tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

sudo ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
sudo make -j2
sudo make install

# 配置动态库路径
echo "/usr/local/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl.conf
sudo ldconfig

# 验证
/usr/local/openssl/bin/openssl version
# OpenSSL 1.1.1w  11 Sep 2023

第二步:编译 Python 3.11,指定 OpenSSL 路径#

cd /opt/Python-3.11.9
sudo make clean
sudo ./configure \
    --with-ensurepip=install \
    --with-openssl=/usr/local/openssl \
    --with-openssl-rpath=auto
sudo make -j2
sudo make altinstall

# 验证 SSL 模块
python3.11 -c "import ssl; print(ssl.OPENSSL_VERSION)"
# OpenSSL 1.1.1w  11 Sep 2023

一键安装脚本#

#!/bin/bash
# CentOS 7 安装 Python 3.11 完整脚本

# 1. 安装编译依赖
sudo yum install -y gcc gcc-c++ make wget \
    zlib-devel bzip2-devel libffi-devel \
    readline-devel sqlite-devel

# 2. 编译安装 OpenSSL 1.1.1
cd /opt
sudo wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
sudo tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
sudo ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
sudo make -j2
sudo make install
echo "/usr/local/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl.conf
sudo ldconfig

# 3. 下载 Python 3.11
cd /opt
sudo wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz
sudo tar xzf Python-3.11.9.tgz
cd Python-3.11.9

# 4. 编译安装
sudo ./configure \
    --with-ensurepip=install \
    --with-openssl=/usr/local/openssl \
    --with-openssl-rpath=auto
sudo make -j2
sudo make altinstall

# 5. 验证
python3.11 --version
python3.11 -c "import ssl; print(ssl.OPENSSL_VERSION)"

常用验证命令#

# 验证 Python 版本
python3.11 --version

# 验证 SSL 模块
python3.11 -c "import ssl; print(ssl.OPENSSL_VERSION)"

# 验证 pip
python3.11 -m pip --version

# 创建虚拟环境测试
python3.11 -m venv /tmp/test-venv
source /tmp/test-venv/bin/activate
python -c "import ssl; print('SSL OK')"
deactivate
rm -rf /tmp/test-venv

问题汇总#

问题 根因 关键解决点
编译警告 信息提示 可忽略
命令找不到 安装路径不在 PATH 创建软链接
encodings 缺失 编译不完整 重新 make
profile-opt 错误 优化编译失败 去掉 --enable-optimizations
SSL 模块缺失 OpenSSL 版本太旧 先装 OpenSSL 1.1.1,再编 Python

上一篇:SSH 连接与服务器初始化
下一篇:Hugo 博客部署与 Nginx 配置