Red Hat Training

A Red Hat training course is available for RHEL 8

第 15 章 动态编程语言、网页服务器、数据库服务器

15.1. 动态编程语言

15.1.1. Python 中的显著变化

15.1.1.1. Python 3 是 RHEL 8 中默认的 Python 实现

Red Hat Enterprise Linux 8 与多个 Python 3 版本一起分发。Python 3.6 将在 RHEL 8 的整个生命周期内被支持。默认情况下,对应的软件包可能没有安装。

Python 2.7python2 软件包中提供。但是,Python 2 有一个短的生命周期,其目的在于帮助客户更顺利地过渡到 Python 3

详情请查看 Python 版本

默认的 python 软件包或未版本化的 /usr/bin/python 可执行文件都不与 RHEL 8 一起分发。建议客户直接使用 python3python2。另外,管理员也可以使用 alternatives 命令来配置 python 命令。请参阅 配置未版本化的 Python

15.1.1.2. 从 Python 2 迁移到 Python 3

作为开发者,您可能想要将之前使用 Python 2 编写的代码迁移到 Python 3。

有关如何将大型代码库迁移到 Python 3 的更多信息,请参阅 保守 Python 3 移植指南

请注意,在迁移后,原始 Python 2 代码就可以被 Python 3 解释器解释,也可以被 Python 2 解释器解析。

15.1.1.3. 配置未指定版本的 Python

系统管理员可以使用 alternatives 命令配置位于 /usr/bin/python 的被指定版本的 python 命令。请注意,在将未版本化的命令配置为对应的版本之前,所需的软件包 python3python38python39python3.11python2 必须安装。

重要

/usr/bin/python 执行文件由 alternatives 系统控制。更新时可能会覆盖任何手动更改。

其他 Python 相关的命令,如 pip3,没有可配置的未版本化变体。

15.1.1.3.1. 直接配置未指定版本的 python 命令

您可以将未版本化的 python 命令直接配置为所选的 Python 版本。

先决条件

  • 确保所需的 Python 版本已安装。

流程

  • 要将未版本化的 python 命令配置为 Python 3.6,请使用:

    # alternatives --set python /usr/bin/python3
  • 要将未版本化的 python 命令配置为 Python 3.8,请使用:

    # alternatives --set python /usr/bin/python3.8
  • 要将未版本化的 python 命令配置为 Python 3.9,请使用:

    # alternatives --set python /usr/bin/python3.9
  • 要将未版本化的 python 命令配置为 Python 3.11,请使用:

    # alternatives --set python /usr/bin/python3.11
  • 要将未指定版本的 python 命令配置为 Python 2,请使用:

    # alternatives --set python /usr/bin/python2
15.1.1.3.2. 以互动方式将未指定版本的 python 命令配置为所需的 Python 版本

您可以以交互方式将未版本化的 python 命令配置为所需的 Python 版本。

先决条件

  • 确保所需的 Python 版本已安装。

流程

  1. 要以互动方式配置未版本化的 python 命令,请使用:

    # alternatives --config python
  2. 从提供的列表中选择所需版本。
  3. 要重置此配置并删除未版本化的 python 命令,请使用:

    # alternatives --auto python
15.1.1.3.3. 其它资源
  • alternatives(8)unversioned-python(1) 手册页

15.1.1.4. 处理 Python 脚本中的解释器指令

在 Red Hat Enterprise Linux 8 中,可执行 Python 脚本期望使用在最小的主 Python 版本中明确指定的解释器指令(也称为 hashbangs 或 shebangs)。例如:

#!/usr/bin/python3
#!/usr/bin/python3.6
#!/usr/bin/python3.8
#!/usr/bin/python3.9
#!/usr/bin/python3.11
#!/usr/bin/python2

构建任何 RPM 软件包时,/usr/lib/rpm/redhat/brp-mangle-shebangs buildroot 策略(BRP)脚本会自动运行,并尝试更正所有可执行文件中的解释器指令。

当遇到带有模糊解释器指令的 Python 脚本时,BRP 脚本会产生错误,例如:

#!/usr/bin/python

或者

#!/usr/bin/env python
15.1.1.4.1. 修改 Python 脚本中的解释器指令

修改会在 RPM 构建时导致构建错误的解释器指令。

先决条件

  • Python 脚本中的一些解释器指令会导致构建错误。

流程

要修改解释程序指令,请完成以下任务之一:

  • 应用 platform-python-devel 软件包中的 pathfix.py 脚本:

    # pathfix.py -pn -i %{__python3} PATH …​

    请注意,可以指定多个 PATH。如果 PATH 是一个目录,pathfix.py 会递归扫描与模式 ^[a-zA-Z0-9_]+\.py$ 匹配的任何 Python 脚本,而不仅仅是具有模糊解释器指令的 Python 脚本。将此命令添加到 %prep 部分或 %install 部分的末尾。

  • 修改打包的 Python 脚本,使其符合期望的格式。为此,pathfix.py也可用于 RPM 构建过程外。当在 RPM 构建外运行 pathfix.py 时,将上面示例中的 %{__python3} 替换为解释器指令的路径,如 /usr/bin/python3

如果打包的 Python 脚本需要 Python 3.6 以外的版本,请调整前面的命令以包括所需的版本。

15.1.1.4.2. 更改自定义软件包中的 /usr/bin/python3 解释器指令

默认情况下,/usr/bin/python3 形式的解释器指令被替换为指向 platform-python 软件包中的 Python 的解释器指令,该软件包用于 Red Hat Enterprise Linux 的系统工具。您可以更改自定义软件包中的 /usr/bin/python3 解释器指令,使其指向从 AppStream 存储库安装的特定版本的 Python。

流程

  • 要为特定版本的 Python 构建软件包,请将相应python 软件包的 python*-rpm-macros 子软件包添加到 SPEC 文件的 BuildRequires 部分。例如,对于 Python 3.6,包括以下行:

    BuildRequires:  python36-rpm-macros

    因此,自定义软件包中的 /usr/bin/python3 解释器指令会自动转换为 /usr/bin/python3.6

注意

要防止 BRP 脚本检查和修改解释器指令,请使用以下 RPM 指令:

%undefine __brp_mangle_shebangs

15.1.1.5. 绑定了 net-snmp 软件包的 Python 不可用

Net-SNMP 工具套件不为 Python 3 提供绑定,它是 RHEL 8 中默认的 Python 实现。因此,RHEL 8 不提供 python-net-snmppython2-net-snmppython3-net-snmp 软件包。

15.1.2. PHP中的显著变化

Red Hat Enterprise Linux 8 与 PHP 7.2 一起分发。这个版本引入了相对于 PHP 5.4 的以下主要变化,后者在 RHEL 7 中提供:

  • PHP 默认使用 FastCGI 进程管理器(FPM)(可以安全地与线程 httpd一起使用)
  • php_valuephp-flag 变量不再用在 httpd 配置文件中;它们应在池配置中设置:/etc/php-fpm.d/*.conf
  • PHP 脚本错误和警告记录到 /var/log/php-fpm/www-error.log 文件中,而不是 /var/log/httpd/error.log
  • 更改 PHP max_execution_time 配置变量时,应增加 httpd ProxyTimeout 设置以匹配
  • 运行 PHP 脚本的用户现在在 FPM 池配置(/etc/php-fpm.d/www.conf 文件,apache 用户是默认的)中配置。
  • 需要在配置更改或者安装新扩展后重启 php-fpm 服务
  • zip 扩展已经从 php-common 软件包移动到独立的软件包 php-pecl-zip

删除了以下扩展:

  • aspell
  • mysql(请注意,mysql ipdo_mysql 扩展仍然可用,由 php-mysqlnd 软件包提供)
  • memcache

15.1.3. Perl 中的显著变化

RHEL 8 提供了 Perl 5.26,与 RHEL 7 中的版本相比有以下变化:

  • Unicode 9.0 现在被支持。
  • 提供了新的 op-entryload-fileload-file SystemTap 探测。
  • 在分配标量以提高性能时,使用 Copy-on-write 机制。
  • 透明处理 IPv4 和 IPv6 套接字的 IO::Socket::IP 模块已添加。
  • 以结构化方式访问 perl -V 数据的 Config::Perl::V 模块 已添加。
  • 添加了一个新的 perl-App-cpanminus 软件包,其中包含用于从全面的 Perl 存档网络(CPAN)存储库获取、提取、构建和安装模块的 cpanm 工具。
  • 出于安全考虑,当前目录. 已从 @INC 模块搜索路径中删除。
  • 因为上面描述的行为的变化,当无法加载文件时, do 语句现在会返回一个弃用警告。
  • do subroutine(LIST) 调用不再被支持,并会产生语法错误。
  • 现在,默认随机化哈希。每次 perl 运行时,从哈希返回的键和值的顺序都会变化。若要禁用随机化,请将 PERL_PERTURB_KEYS 环境变量设为 0
  • 不再允许正则表达式模式中未转义的字面 { 字符。
  • $_ 变量的字典范围支持已删除。
  • 在数组或散列上使用 定义的 运算符会导致致命错误。
  • UNIVERSAL 模块中导入功能会导致严重错误。
  • find2perls2pa2pc2phpstruct 工具已被删除。
  • ${^ENCODING} 工具已被删除。不再支持 编码 片段的默认模式。要以 UTF-8 之外的其他编码编写源代码,请使用编码的 Filter 选项。
  • perl 打包现在与上游对齐。perl 软件包也会安装核心模块,而 /usr/bin/perl 解释器则由 perl-interpreter 软件包提供。在以前的版本中,perl 软件包只包含一个最小解释器,而 perl-core 软件包既包含解释器又包含核心模块。
  • IO::Socket::SSL Perl 模块不再从 ./certs/my-ca.pem 文件或 ./ca 目录加载证书颁发机构证书, 来自 ./certs/server-key.pem 文件中的服务器私钥、来自 ./certs/server-cert.pem 文件的服务器证书、来自 ./certs/client-key.pem 文件的客户端私钥,以及来自 ./certs/client-cert.pem 文件的客户端证书。明确指定文件的路径。

15.1.4. Ruby中的显著变化

RHEL 8 提供了 Ruby 2.5,与 RHEL 7 中提供的 Ruby 2.0.0 相比,它引入了很多新功能和增强。主要变更包括:

  • 添加了增量垃圾收集器。
  • 添加了 Refinements 语法。
  • 现在会对符号进行垃圾收集。
  • $SAFE=2$SAFE=3 安全等级现已过时。
  • FixnumBignum 类已统一为 Integer 类。
  • 通过优化 Hash 类,改进对实例变量的访问,Mutex 类更小更快,性能得到了提高。
  • 某些旧的 API 已被弃用。
  • 捆绑的库,如 RubyGemsRakeRDocPsychMinitesttest-unit 都已更新。
  • 以前与 Ruby 仪器分发的其他库,如 mathnDLext/tkXMLRPC 都已被弃用或不再包含。
  • SemVer 版本方案现在用于 Ruby 版本。

15.1.5. SWIG 中的显著变化

RHEL 8 包含简化的 wrapper 和 Interface Generator(SWIG)版本 3.0,它比 RHEL 7 中发布的版本 2.0 提供了大量新功能、增强和 bug 修复。最值得注意的是,实现了对 C++11 标准的支持。SWIG 现在也支持 Go 1.6PHP 7Octave 4.2Python 3.5

15.1.6. Node.js 包括在 RHEL 中

Node.js 是一个软件开发平台,用于使用 JavaScript 编程语言开发快速、可扩展的网络应用程序。它首次在 RHEL 中提供。之前,它只通过 Software Collection 提供。RHEL 8 提供 Node.js 10