第 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.7
在 python2
软件包中提供。但是,Python 2
有一个短的生命周期,其目的在于帮助客户更顺利地过渡到 Python 3
。
详情请查看 Python 版本。
默认的 python
软件包或未版本化的 /usr/bin/python
可执行文件都不与 RHEL 8 一起分发。建议客户直接使用 python3
或 python2
。另外,管理员也可以使用 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
命令。请注意,在将未指定版本的命令配置为对应的版本之前,必须安装所需的软件包 python3、python38
、python39
、python3.11
、python3.12
或 python2
。
/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 3.12,请使用:# alternatives --set python /usr/bin/python3.12
要将未指定版本的
python
命令配置为 Python 2,请使用:# alternatives --set python /usr/bin/python2
15.1.1.3.2. 以互动方式将未指定版本的 python 命令配置为所需的 Python 版本
您可以以交互方式将未版本化的 python
命令配置为所需的 Python 版本。
先决条件
- 确保所需的 Python 版本已安装。
流程
要以互动方式配置未版本化的
python
命令,请使用:# alternatives --config python
- 从提供的列表中选择所需版本。
要重置此配置并删除未版本化的
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/python3.12 #!/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-macrosspec
文件的 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-snmp
、python2-net-snmp
或 python3-net-snmp
软件包。
15.1.2. PHP
中的显著变化
Red Hat Enterprise Linux 8 与 PHP 7.2
一起分发。这个版本引入了相对于 PHP 5.4
的以下主要变化,后者在 RHEL 7 中提供:
-
PHP
默认使用 FastCGI 进程管理器(FPM)(可以安全地与线程httpd
一起使用) -
php_value
和php-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
(请注意,mysqli
和pdo_mysql
扩展仍然可用,由php-mysqlnd
软件包提供) -
memcache
15.1.3. Perl
中的显著变化
RHEL 8 提供了 Perl 5.26
,与 RHEL 7 中的版本相比有以下变化:
-
Unicode 9.0
现在被支持。 -
提供了新的
op-entry
、load-file
和load-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
模块中导入功能会导致严重错误。 -
find2perl
、s2p
、a2p
、c2ph
和pstruct
工具已被删除。 -
${^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
安全等级现已过时。 -
Fixnum
和Bignum
类已统一为Integer
类。 -
通过优化
Hash
类,改进对实例变量的访问,Mutex
类更小更快,性能得到了提高。 - 某些旧的 API 已被弃用。
-
捆绑的库,如
RubyGems
、Rake
、RDoc
、Psych
、Minitest
和test-unit
都已更新。 -
以前与
Ruby
仪器分发的其他库,如mathn
、DL
、ext/tk
和XMLRPC
都已被弃用或不再包含。 -
SemVer
版本方案现在用于Ruby
版本。
15.1.5. SWIG
中的显著变化
RHEL 8 包含简化的 wrapper 和 Interface Generator(SWIG)版本 3.0,它比 RHEL 7 中发布的版本 2.0 提供了大量新功能、增强和 bug 修复。最值得注意的是,实现了对 C++11 标准的支持。SWIG
现在也支持 Go 1.6
、PHP 7
、Octave 4.2
和 Python 3.5
。
15.1.6. Node.js
包括在 RHEL 中
Node.js
是一个软件开发平台,用于使用 JavaScript 编程语言开发快速、可扩展的网络应用程序。它首次在 RHEL 中提供。之前,它只通过 Software Collection 提供。RHEL 8 提供 Node.js 10
。