跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    Fedora 上装多个版本的 PHP / Java / Node / Python

    「我要 Node 24,还要 PHP 8.3,还要 Java 21」——在 Fedora 上这四个语言的支持程度完全不同,照同一套思路做会撞墙。

    先给结论表,再逐条讲做法。

    软件F45 仓库提供能否并装多版本推荐做法
    Node.jsnodejs(22)、nodejs22、nodejs24、nodejs26能,原生并装dnf install nodejs24 nodejs26
    Pythonpython3(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
    PostgreSQLpostgresql16/17/18/19beta-server不能,互斥多实例 / PGDG 源 / 容器
    MySQLmysql-server(9.7)、mysql8.4-server不能,互斥mysqld@ 多实例 / 官方源 / 容器
    Valkey只有 valkey 9.1.2不能容器

    规律很清楚:语言运行时倾向「版本化并行包」,数据库倾向「互斥选择」。前者给你 node-24、python3.13 这样的独立入口,后者只是把同一个服务换成另一个版本。

    Terminal window
    sudo dnf install nodejs24 nodejs26
    Terminal window
    node -v # v22.23.1
    node-24 -v # v24.18.0
    node-26 -v # v26.3.1

    二进制带版本后缀,互不干扰:

    /usr/bin/node /usr/bin/node-22 /usr/bin/node-24 /usr/bin/node-26

    npm 同样:npm、npm-22、npm-24、npm-26。

    这是 Fedora 最省事的多版本方案:不依赖 shell 初始化,systemd 单元和 CI 里都能直接写 node-24。

    细节见 安装 Node.js。

    Terminal window
    dnf list --available 'java-*-openjdk.x86_64'
    java-25-openjdk.x86_64 1:25.0.4.1.1-1.1.fc45
    java-latest-openjdk.x86_64 1:27.0.0.0.35-0.0.1.0.ea.fc45

    没有 21,没有 17。要它们只有三条路:

    Terminal window
    # 一、容器
    podman run --rm eclipse-temurin:21-jdk java -version
    # 二、上游 tarball
    mkdir -p ~/jdk && cd ~/jdk
    curl -LO https://github.com/adoptium/temurin21-binaries/releases/latest/download/OpenJDK21U-jdk_x64_linux_hotspot.tar.gz
    tar xzf OpenJDK21U-jdk_x64_linux_hotspot.tar.gz
    # 三、SDKMAN(开发机多版本切换)
    curl -s "https://get.sdkman.io" | bash
    source ~/.sdkman/bin/sdkman-init.sh
    sdk install java 21.0.5-tem

    细节见 安装 Java。

    PHP:Remi 不提供 Fedora 的版本化仓库

    Section titled “PHP:Remi 不提供 Fedora 的版本化仓库”

    这是最容易误解的一条。Remi 在 EL 系有 remi-php81…remi-php85 这类版本化仓库,但 Fedora 45 上只有 remi 一个基础仓库:

    Terminal window
    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 上只能靠容器
    Terminal window
    podman run -d --name php83 -p 8083:80 php:8.3-apache
    podman run -d --name php84 -p 8084:80 php:8.4-apache
    curl -s http://127.0.0.1:8083/ | head -3

    两个版本各自的端口、配置、扩展互不相干。生产上还可以用一个 nginx 按站点分流到不同容器。

    Python:版本化包有,但入口不叫 python3

    Section titled “Python:版本化包有,但入口不叫 python3”

    F45 的仓库其实提供了多版本,只是包名是 python3.13 / python3.14:

    Terminal window
    dnf list --available 'python3.1*'
    python3.13.x86_64 3.13.15 fedora
    python3.14.x86_64 3.14.7 fedora
    python3.15.x86_64 ... (默认 python3 对应的版本)

    装完是可并存的独立解释器:

    Terminal window
    sudo dnf install python3.13 python3.14
    $ python3.13 --version
    Python 3.13.15
    $ python3.14 --version
    Python 3.14.7
    $ python3 --version
    Python 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 就够了:

    Terminal window
    python3 -m venv ~/proj/.venv
    source ~/proj/.venv/bin/activate
    pip install -r requirements.txt

    确实需要解释器版本不同时(比如某库只支持 3.12):

    Terminal window
    # uv:装并管理多个 Python 解释器
    curl -LsSf https://astral.sh/uv/install.sh | sh
    uv python install 3.12 3.13
    uv python list
    uv venv --python 3.12
    Terminal window
    # 或 pyenv
    curl https://pyenv.run | bash
    pyenv install 3.12.7
    pyenv global 3.12.7
    你的情况用什么
    Node 要 22/24/26dnf 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 的定位是「一个版本一个受支持的上游版本」:仓库只打包当前受支持的主版本,这样安全更新路径清晰、不需要维护多套 ABI。

    EL 系才有多版本机制(Application Streams、Remi 的版本化仓库),因为那边要支撑十年的长周期。所以在 Fedora 上遇到”要另一个版本”,默认答案通常是容器,而不是找第三方源。