如何配置uWsgi使其使用Python3.11版本运行Web服务
uWSGI切换至Python 3.11操作方案
问题原因
Ubuntu 20.04官方apt源提供的uWSGI在编译阶段就绑定了系统默认自带的Python 3.8,无论重装多少次apt版本的uWSGI,都不会自动关联后续手动安装的Python 3.11。插件编译时出现的distutils弃用报错,是因为Python 3.10及以上版本已将distutils模块拆分至独立安装包,不会随Python主程序默认安装,旧编译脚本找不到对应依赖就会抛出该提示。
前置依赖安装
先安装编译和运行所需的依赖包,解决distutils报错问题:
- 安装编译工具、Python3.11开发包、pip及distutils组件:
sudo apt update && sudo apt install -y python3.11-pip python3.11-dev python3.11-distutils build-essential libpcre3-dev libssl-dev - 安装setuptools替代distutils的编译支持逻辑:
sudo python3.11 -m pip install setuptools
注意:如果Flask项目使用虚拟环境,后续所有pip相关操作请先激活对应虚拟环境,避免依赖装到全局环境。
方案一:pip安装绑定Python3.11的uWSGI(推荐,操作最简单)
直接通过Python3.11对应的pip编译安装uWSGI,会自动绑定当前Python版本,不需要单独配置插件:
- 先卸载apt安装的旧版uWSGI,避免二进制路径冲突:
sudo apt remove -y uwsgi uwsgi-core uwsgi-plugin-python3 - 执行安装命令:
# 全局安装执行 sudo python3.11 -m pip install uwsgi # 虚拟环境安装直接执行(不需要sudo) pip install uwsgi
- 验证版本绑定:
uwsgi --python-version
命令输出3.11.x即为绑定成功。
注意:安装完成后可执行
which uwsgi确认二进制路径,pip全局安装的uWSGI默认路径为/usr/local/bin/uwsgi,要确保服务启动脚本调用的是该路径下的程序。
方案二:保留系统apt版uWSGI,单独编译Python3.11插件
如果必须使用apt安装的uWSGI本体,可单独编译对应版本的Python插件:
- 查询当前系统uWSGI的版本和插件目录:
uwsgi --version # 记下来输出版本号,后续下载源码要完全对应 uwsgi --plugins-dir # 一般默认输出为/usr/lib/uwsgi/plugins
- 下载和当前版本完全一致的uWSGI官方源码包,解压后进入源码根目录。
- 在源码目录下执行编译命令,生成Python3.11插件:
export PYTHON=python3.11 python3.11 uwsgiconfig.py --plugin plugins/python core python311
- 将编译生成的
python311_plugin.so文件复制到之前查询到的系统插件目录下。 - 验证插件加载:
uwsgi --plugin python311 --python-version
命令输出3.11.x即为插件编译安装成功。
服务配置调整
安装完成后修改uWSGI服务配置文件(通常为.ini格式):
- 若使用方案一(pip安装的uWSGI):不需要额外配置插件项,仅需确认配置中虚拟环境路径、Flask项目wsgi入口路径正确即可。
- 若使用方案二(单独编译插件):需要在配置文件中新增一行
plugins = python311,指定启动时加载Python3.11插件。
配置修改完成后重启uWSGI服务,可通过临时接口打印sys.version确认运行时Python版本,之前直接用python3.11启动应用已经验证过依赖正常,只要uWSGI版本绑定正确,服务即可正常运行。
内容的提问来源于stack exchange,提问作者Rapace-bleu
相关产品推荐
相关产品推荐

