在 CentOS 上执行较新的应用程序

由 james 于 2016 年 5 月 25 日星期三 - 16:13 提交

(本页内容取自 https://www.hogarthuk.com/?q=node/15 ,看来原有维护者 JHogarth 已不再出没,但该内容依然有用。)

引言

虽然有关 CentOS/RHEL 额外软件的标准答案是 EPEL,但是 EPEL 的政策不容许取替 base 组件,而由于欠缺有关通过 FPC(Fedora 包装小组)的软件选集(SCL)的指引,它们不能被收纳于 EPEL 内。

坊间有三个值得拜访的网站,它们各有利弊。

我们会探讨以上的每个选项及它们的使用方式,尝试理解他们的强项及弱点,并如何满足特定的需求。

IUS 软件库

IUS 的立场是他们不应取替任何 base 组件,而他们所安装的组件应该沿用标准文件系统的位置。一般来说他们会采用不同的组件名称,但通过 provides 来满足依赖性需求。他们在旗下的安全软件库 https://ius.io/SafeRepo/ 网站更详细解释他们的立场,并将他们观点与 SCL 的作比较 https://ius.io/IUSvsSCL/

这意味了在多数情况下你可以安心地在系统上启用他们的组件而无需在 yum 配置文件内加入 include/exclude 的过滤规则。这亦意味更新软件时只需利用 yum swap/replace 取代现有的组件(要是安装了),或者用 yum shell 的方法,又或者采用新组件的名称,而无需在管理引擎内进行更改配置文件位置等步骤。IUS 除了提供 PHP 组件外,还包含 Apache HTTPD、MariaDB、Redis、HAProxy 等。

有关 IUS 的弊处,就是由于他们提供基础版本的方式,你必须先安装主要组件,然后才能安装任何依赖它的组件。举个例说,你应该先安装 php,然后才安装任何 php 模块。此外,由于 IUS 遵从上游的支持政策,你必须留意上游何时终止对 PHP 7.2 等组件的支持,继而迁转到 PHP 7.3,这个情况亦会出现于其它组件。当 IUS 组件的生命周期结束时,它会出现在 GitHubhttps://github.com/iusrepo/announce 库的一则发布内。IUS 的用户应该「监察」该软件库,以便能知悉所用组件的支持何时终上。

在 CentOS 上启用 IUS 非常简单:

# CentOS6
yum install https://repo.ius.io/ius-release-el6.rpm
# CentOS7
yum install https://repo.ius.io/ius-release-el7.rpm

这是唯一要做的事情,因为缺省被启用的 CentOS Extras 软件库已经能满足 EPEL 软件库的需求。在 RHEL,EPEL 软件库必须手动启用,不过如果真的在 RHEL,请留意各方的支持,因为 Red Hat 的官方立场只支持 SCL 软件库作为该环境的首选。

软件选集软件库

在 CentOS 上启用 SCL 软件库需要安装其发行组件:

yum install centos-release-scl

这包含重建自 Red Hat SCL(rhscl)的选集及专用 SCL SIG(sclo)的选集。

安装自这些软件库的软件会安装至 /opt 内的特别位置,而不会采用标准的路径。若要在指令元采用新版软件,你必须执行特别的 scl 指令:

yum install python27 
<...>
python --version
Python 2.7.5
scl enable python27 bash
python --version
Python 2.7.8

你也可在脚本内输入大多数选集所提供的启用脚本,藉此改用新版本的应用程序,而无需执行 scl 指令。

cat test.sh 
#!/bin/bash

. /opt/rh/python27/enable

python --version

[root@c7-template ~]# sh test.sh 
Python 2.7.8

你可同时启用多个 SCL:

scl enable python27 ruby200 bash
ruby --version
ruby 2.0.0p645 (2015-04-13) [x86_64-linux]
python --version
Python 2.7.8

当采用 SCL 时,请确定配置文件的位置,因为他们都会收录于文件系统内的特定位置,与一般预期的会有出入:

rpm -qlc rh-php56-php
/opt/rh/httpd24/root/etc/httpd/conf.d/rh-php56-php.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/10-rh-php56-php.conf
rpm -qlc httpd24-httpd
/etc/logrotate.d/httpd24-httpd
/opt/rh/httpd24/root/etc/httpd/conf.d/autoindex.conf
/opt/rh/httpd24/root/etc/httpd/conf.d/userdir.conf
/opt/rh/httpd24/root/etc/httpd/conf.d/welcome.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-base.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-dav.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-lua.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-mpm.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-optional.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-proxy.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-systemd.conf
/opt/rh/httpd24/root/etc/httpd/conf.modules.d/01-cgi.conf
/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
/opt/rh/httpd24/root/etc/httpd/conf/magic
/opt/rh/httpd24/root/etc/sysconfig/htcacheclean
/opt/rh/httpd24/root/etc/sysconfig/httpd

若果要把现有的应用程序由 CentOS 原有的 php 移植到 php56,请留意一件很重要的事情,就是 php55 及 php56 的 mod_php 是连结到并依赖 SCL httpd24 组件。当进行上述移植时,你必需同时移植到 SCL httpd24 的组件。

那些提供后台服务的组件如 httpd24 或 mariadb100 都拥有专用的后台服务档,并会进行设置及在相关的环境内运作:

# EL7
systemctl status httpd24-httpd.service
systemctl status rh-mariadb100-mariadb.service
# EL6
service httpd24-httpd status
service rh-mariadb100-mariadb status 

Red Hat SCL 的选只(来自 centos-sclo-rh 软件库)拥有 3 年的维护周期,为主重的回归测试提供较多时间,但当然还是短过 base 的支持周期。

sclo 项目都绝粹是由 SCL SIG 的社群所支持的,因此在进行企业级安装时必须作为考虑该选项的因素之一。

你可利用 scl 指令来查核及取得已安装的 SCL 组件清单:

scl -l
httpd24
python27
rh-mariadb100
rh-php56
ruby200

RHSCL PHP 组件不包含基础系统的 PHP 库(/usr/share/php)在 include_path 内,因此要是某个应用程序需要来自 EPEL 的库,你必须更改应用程序内的 include_path,或者在 mod_php/php-fpm 的设置内包含该路径。另一个可行方法就是运用库所提供的自动装入器,这是 Fedora PHP SIG 首选的解决方案,而不是依赖 include_path。

Remi 软件库

Remi 是 Fedora 及 EPEL 旗下的 PHP 及大量 PHP 库的维护者。他也是 CentOS SCL SIG 的成员。因此不少在等候加进 Fedora、EPEL 或 SCL 的东西都是首先出现于他的软件库内。

视乎特定的需要,安装那些软件库的方式或许有别。

基本的 remi-safe 软件库(唯一被缺省启用的)不会替换任何系统组件,并利用 SCL(大致上与 SIG SCL 的组件类同)来避免影响系统组件。来自 remi SCL 的 mod_php 组件连结到 base 的 httpd 组件,因此无须移植到 SCL httpd24 的组件。

还有一些如 remi-php73 等的额外软件库内收录了一般(非 SCL)的组件,它们会替换 base 软件库所提供的同名组件。若果只需单一版本的 PHP,这些组件能避免 SCL 所带来的复杂性。不过,请留意这些组件亦会替换来自 IUS 等的第三方软件库的组件,因此我们不推荐将 remirepo 与其它软件库混合使用。

如果你采用单一替换的 php,它的配置文件会在正常的位置;如果所采用的是 SCL 版本,上述的 scl enable 指令同样适用。

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install php56
scl enable php56 bash
[root@c7-template ~]# php --version
PHP 5.6.22 (cli) (built: May 26 2016 14:33:44) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

请留意这些组件也将 /usr/bin/php* 连结到适当的 SCL 版本,这样可免除执行 scl enable 指令的需要。

为了帮助你决定应该启用哪一个软件库,Remi 提供了一个向导,它会根据你的需要,详细列出你所需的指令及软件库。

虽然 IUS 紧贴上游的生命周期,Remi 在有理由的时候会尽量扩展支持,当然他只是尽力而为,因为这占用他的私人时间。

此软件库只专注在 PHP,除了该语言外更包括 PHP 的生态环境/堆栈,当中计有大量的库,扩展及工具。它们有一部份已收录于 Fedora/EPEL,但某些或许仍被在被评审中,也有可能由版本上的依赖性而不可能获 EPEL 接纳。

Remi SCL 组件已包含系统的 PHP 路径,因此 include_path 不必被修改,但推荐的做法是按需要选用特定的自动装入器,不要依赖 include_path。

结论

从此文章可见在 CentOS 上有多种方法可取得较新的语言及应用程序,而正确的选择视乎你的特定需要。

按惯例,当混合不同软件库时,请留意 yum update 的输出以确定什么会被取替,并尝试设置优先次序(或利用 include/exclude 过滤规则)确保系统以你预期的方式运作。

Translation of revision 12

zh/HowTos/NewerApps (last edited 2019-08-25 10:50:30 by TimothyLee)