在 CentOS 上執行較新的應用程式
由 james 於 2016 年 5 月 25 日星期三 - 16:13 提交
(本頁內容取自 https://www.hogarthuk.com/?q=node/15 ,看來原有維護者 JHogarth 已不再出沒,但該內容依然有用。)
1. 引言
雖然有關 CentOS/RHEL 額外軟件的標準答案是 EPEL,但是 EPEL 的政策不容許取替 base 套件,而由於欠缺有關通過 FPC(Fedora 包裝小組)的軟件選集(SCL)的指引,它們無法被收納於 EPEL 內。
坊間有三個值得拜訪的網站,它們各有利弊。
IUS Repo https://ius.io/ 由 Rackspace 贊助,並獲他們的客戶所採用。
CentOS 軟件選集 SIG https://wiki.centos.org/SpecialInterestGroup/SCLo ,他們重建 Red Hat 的選軟選集 https://access.redhat.com/solutions/472793 並提供額外的選集。該特別興趣小組在軟件選集 http://www.softwarecollections.org/ 網站提供了更詳盡的資料。當瀏覽軟件選集的網站時,請特別留意誰「擁有」某個選集,因為該網站收錄了 SIG 提供的選集(包括重建自 RHSCL 的選集),及用戶貢獻的。
Remi Collet 軟件庫 http://rpms.remirepo.net/ 只專注於 PHP,並按需要提供不同的使用方法。
我們會探討以上的每個選項及它們的使用方式,嘗試理解他們的強項及弱點,並如何滿足特定的需求。
1.1. IUS 軟件庫
IUS 的立場是他們不應取替任何 base 套件,而他們所安裝的套件應該沿用標準檔案系統的位置。一般來說他們會採用不同的套件名稱,但透過 provides 來滿足依賴性需求。他們在旗下的「安全軟件庫」 https://ius.io/about#safe-replacement 網頁更詳細解釋他們的立場,並且與 SCL 作比較:https://ius.io/faq#how-is-ius-different-from-scl 。
這意味了在多數情況下你可以安心地在系統上啟用他們的套件而無需在 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 套件的生命週期結束時,它會出現在 GitHub 的 https://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 軟件庫作為該環境的首選。
- 完成軟件庫的設定後,請用 yum 查閱相關應用程式/語言提供的套件,然後選取所需版本,接下來進行安裝。多數套件的安裝位置都與標準套件相同。假若某個套件無法完全替代標準套件,它將會採用略為不同的路徑以便能共存安裝。
1.2. 軟件選集軟件庫
在 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。
1.3. 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。
2. 結論
從此文章可見在 CentOS 上有多種方法可取得較新的語言及應用程式,而正確的選擇視乎你的特定需要。
按慣例,當混合不同軟件庫時,請留意 yum update 的輸出以確定甚麼會被取替,並嘗試設定優先次序(或利用 include/exclude 過濾規則)確保系統以你預期的方式運作。
Translation of revision 14