Fedora 上装多个版本的 PHP / Java / Node / Python
「我要 Node 24,还要 PHP 8.3,还要 Java 21」——在 Fedora 上这四个语言的支持程度完全不同,照同一套思路做会撞墙。
先给结论表,再逐条讲做法。
| 软件 | F45 仓库提供 | 能否并装多版本 | 推荐做法 |
|---|---|---|---|
| Node.js | nodejs(22)、nodejs22、nodejs24、nodejs26 | 能,原生并装 | dnf install nodejs24 nodejs26 |
| Python | python3(3.15)、python3.13、python3.14 | 能,原生并装 | dnf install python3.13 python3.14 |
| Java | 只有 java-25-openjdk | 不能 | 容器 / SDKMAN / 上游 tarball |
| PHP | 只有 php 8.5 | 不能 | 容器 |
| Go | 只有 golang 1.27.1 | 不能 | 上游 tarball |
| Rust | 只有 rustc/cargo 1.98.1 | 不能 | rustup |
| PostgreSQL | postgresql16/17/18/19beta-server | 不能,互斥 | 多实例 / PGDG 源 / 容器 |
| MySQL | mysql-server(9.7)、mysql8.4-server | 不能,互斥 | mysqld@ 多实例 / 官方源 / 容器 |
| Valkey | 只有 valkey 9.1.2 | 不能 | 容器 |
规律很清楚:语言运行时倾向「版本化并行包」,数据库倾向「互斥选择」。前者给你 node-24、python3.13 这样的独立入口,后者只是把同一个服务换成另一个版本。
Node.js:唯一原生支持并装的
Section titled “Node.js:唯一原生支持并装的”sudo dnf install nodejs24 nodejs26node -v # v22.23.1node-24 -v # v24.18.0node-26 -v # v26.3.1二进制带版本后缀,互不干扰:
/usr/bin/node /usr/bin/node-22 /usr/bin/node-24 /usr/bin/node-26npm 同样:npm、npm-22、npm-24、npm-26。
这是 Fedora 最省事的多版本方案:不依赖 shell 初始化,systemd 单元和 CI 里都能直接写 node-24。
细节见 安装 Node.js。
Java:只能拿 25,旧版走外部
Section titled “Java:只能拿 25,旧版走外部”dnf list --available 'java-*-openjdk.x86_64'java-25-openjdk.x86_64 1:25.0.4.1.1-1.1.fc45java-latest-openjdk.x86_64 1:27.0.0.0.35-0.0.1.0.ea.fc45没有 21,没有 17。要它们只有三条路:
# 一、容器podman run --rm eclipse-temurin:21-jdk java -version
# 二、上游 tarballmkdir -p ~/jdk && cd ~/jdkcurl -LO https://github.com/adoptium/temurin21-binaries/releases/latest/download/OpenJDK21U-jdk_x64_linux_hotspot.tar.gztar xzf OpenJDK21U-jdk_x64_linux_hotspot.tar.gz
# 三、SDKMAN(开发机多版本切换)curl -s "https://get.sdkman.io" | bashsource ~/.sdkman/bin/sdkman-init.shsdk install java 21.0.5-tem细节见 安装 Java。
PHP:Remi 不提供 Fedora 的版本化仓库
Section titled “PHP:Remi 不提供 Fedora 的版本化仓库”这是最容易误解的一条。Remi 在 EL 系有 remi-php81…remi-php85 这类版本化仓库,但 Fedora 45 上只有 remi 一个基础仓库:
curl -sL https://rpms.remirepo.net/fedora/45/ | grep -oE 'href="remi[^"]*"'href="remi/x86_64/"remi-php83/x86_64/ 这类路径返回 404。所以:
- Remi 的 Fedora 仓库提供的是扩展与更新(比发行版更新的补丁),不是多版本 PHP
- 想同时跑 PHP 8.3 和 8.5,在 Fedora 上只能靠容器
podman run -d --name php83 -p 8083:80 php:8.3-apachepodman run -d --name php84 -p 8084:80 php:8.4-apachecurl -s http://127.0.0.1:8083/ | head -3两个版本各自的端口、配置、扩展互不相干。生产上还可以用一个 nginx 按站点分流到不同容器。
Python:版本化包有,但入口不叫 python3
Section titled “Python:版本化包有,但入口不叫 python3”F45 的仓库其实提供了多版本,只是包名是 python3.13 / python3.14:
dnf list --available 'python3.1*'python3.13.x86_64 3.13.15 fedorapython3.14.x86_64 3.14.7 fedorapython3.15.x86_64 ... (默认 python3 对应的版本)装完是可并存的独立解释器:
sudo dnf install python3.13 python3.14$ python3.13 --versionPython 3.13.15$ python3.14 --versionPython 3.14.7$ python3 --versionPython 3.15.0rc1三个解释器同时在 /usr/bin/python3.13、/usr/bin/python3.14、/usr/bin/python3,互不干扰。
但注意:每个版本的解释器只有对应的包才有(比如 python3.14 只有 28.7 KiB,装的是入口与配套),第三方库仍要通过该版本自己的 venv 或 python3.14-pip 装,不能指望系统 site-packages 共享。
而且绝大多数「需要另一个 Python 版本」的真实需求,其实是要隔离依赖,用 venv 就够了:
python3 -m venv ~/proj/.venvsource ~/proj/.venv/bin/activatepip install -r requirements.txt确实需要解释器版本不同时(比如某库只支持 3.12):
# uv:装并管理多个 Python 解释器curl -LsSf https://astral.sh/uv/install.sh | shuv python install 3.12 3.13uv python listuv venv --python 3.12# 或 pyenvcurl https://pyenv.run | bashpyenv install 3.12.7pyenv global 3.12.7| 你的情况 | 用什么 |
|---|---|
| Node 要 22/24/26 | dnf install nodejs24 nodejs26,直接调 node-24 |
| Node 要 16/18 或指定小版本 | nvm 或容器 |
| Java 要 21/17 | 容器优先;宿主机需要就 tarball 或 SDKMAN |
| PHP 要 8.3 与 8.5 并存 | 容器,两个容器两个端口 |
| 只要依赖隔离、不换解释器 | venv |
| 要 3.13/3.14 解释器 | dnf install python3.13 python3.14,直接调 python3.13 |
| 要 3.12 或更早 | uv / pyenv / 容器 |
| PG 要 16 和 18 同时跑 | postgresql@ 多实例,或 PGDG 源、容器 |
| MySQL 要 8.4 和 9.7 同时跑 | mysqld@ 多实例,或官方源、容器 |
| 要给 CI 固定版本 | 容器镜像,别依赖宿主 |
为什么 Fedora 不全给
Section titled “为什么 Fedora 不全给”Fedora 的定位是「一个版本一个受支持的上游版本」:仓库只打包当前受支持的主版本,这样安全更新路径清晰、不需要维护多套 ABI。
EL 系才有多版本机制(Application Streams、Remi 的版本化仓库),因为那边要支撑十年的长周期。所以在 Fedora 上遇到”要另一个版本”,默认答案通常是容器,而不是找第三方源。
- 安装 Node.js — 版本化包与 npm 全局目录
- 安装 Java — 只有 25,旧版三条路
- 安装 PHP — php-fpm 与 Web 服务器
- 容器与 rootless — 用容器跑另一版本
- 工具链与多版本共存 — 总体策略
- 国内加速源 — 容器镜像与语言源换国内