CentOS 7 中 Apache 2.4.35 + PHP 7.2.11 + HTTP/2 升級安裝筆記 (零風險升級/平滑升級)

PHP 5 在今年(2018)年底將完全終止安全更新,PHP 7.0 甚至早了一個月,在今年12月初就終止安全更新。將 PHP 升級到較新 7.1 或 7.2 甚至 7.3 會是比較好的選擇

在 CentOS 7 中將 PHP 升級到 5.6 或 7.0 及以上版本,大多數是選擇以  yum 搭配 Remi RepositoryWebtatic Repository 這兩個 repo 來做升級,這樣的作法簡單迅速、不太影響以往的操作模式又好維護。在升級過程中不論選擇哪一個 yum repo 都是必須要原本的 php 先移除後 yum install 新的套件,這過程其實再自然不過了

但前提是,必須非常肯定目前在線上的 php 原始碼在升級後都可以正確執行

鸚鵡目前有上線在運作的程式,蠻大量都是自己寫的,真心沒這個把握!
基於網站不能停或不想中斷服務的前提,上述的方案只能直接放棄

過去鸚鵡都盡可能使用 yum 來管理維護相關套件,盡可能不要自己編譯。但之前有次遇到一個狀況,選用的 repo 終止維護計畫,甚至連網站和 mirror 站點都移除。而該 repo 會有覆蓋基本套件的情況,造成更新完全被卡住,花了一點時間才搞定

所以本次的過程會需要自行編譯一些東西,當然在許可的情況盡量使用 CentOS 的基本套件,編譯及安裝時都選擇獨立的路徑來進行,盡量和既有的系統服務做出區隔

再透過設定 httpd.conf 將服務 listen 在 8080 和 8443 兩個 port,並直接對應到已在線上的網站根目錄,如此即可直接測試原有的網站在新的環境下能否正確運作。遇到不能正常的,將整個網站根目錄 cp -R 複製一份後就可以開始修正問題直到可以在新環境正常運作

這樣就可以在完全不影響原有網站的情況下,逐步更新程式碼
最後可以選擇直接使用,也可以選擇回頭使用第三方 repo 直接升級套用


所有編譯安裝的套件都會安裝到 /usr/local/http2 中的個別目錄,原始碼放在 /usr/local/http2/src 裡面
除了方便版本區隔,要完全移除的方式也很簡單:rm -rf 即可

會編譯的清單:

以上是編譯順序
因為在編譯 PHP 時使用新版本的 openssl ,卻發生 cURL 內的 libssh2 依賴系統上的 openssl 1.0.2k-fips 而造成版本衝突,才另外重新編譯 libssh2 和 cURL 來解決衝突的問題,所以編譯 apache 時搭配的 cURL 還是 CentOS 7 本身的 7.29.0-46

如果希望 Apache 一併使用最新版本的 cURL,可以將 apache 的順序往後移到 PHP 之前,並在 ./configure 命令中 加上 --with-curl=PATH 參數,PATH 指向 cURL 路徑即可

編譯環境:CentOS 7.5.1804

更新系統、安裝依賴套件

安裝過程中如果 ./configure 的時候有錯誤或提示缺少函式庫,可以直接用 yum search 函式庫名稱,再安裝該函式庫的 devel 套件,應該就可以解決

編譯 openssl 1.1.1

編譯 nghttp2 1.34

編譯 brotli 1.0.6

編譯Apache 2.4.35

httpd.conf 路徑: /usr/local/http2/apache2/conf/httpd.conf
預設使用的 mpm 模式是 event

啟動、停止、重啟:/usr/local/http2/apache2/bin/apachectl -k start|stop|restart

編譯 libzip 1.3.0

編譯 libssh2 1.8.0

編譯 cURL 7.61.1

根憑證使用 CentOS 7 基礎套件:ca-certificates

編譯 PHP 7.2.11

執行 ./configure 之前,請先確認上面編譯的 apache 設定使用的 mpm 模式
設定 event 則 PHP 會編譯出 Thread Safe (API20170718,TS)
設定 prefork 則 PHP 會編譯出 None-Thread Safe (API20170718,NTS)

大多數的 extension 我設定為 shared 需要用到時再修改 php.ini 設定載入
php.ini 也可以選用 php.ini-development,並依照需求設定預設時區 date.timezone
opcache 有啟用 huge_page 功能,可使用 sysctl vm.nr_hugepages 將系統功能啟動,相關資訊可以自尋查詢

到這邊基本需求就算是建制完成

Apache 針對 php 檔案的設定

設定方式參考:https://cnzhx.net/blog/apache-httpd-mod_proxy_fcgi-php-fpm/

php.ini 依照需求載入相關模組及相關配置設定
httpd.conf 中將 Listen 修改為 8080 和 8443 或任何想使用的 port,再將目前服務中的網站的根目錄的路徑設定好,就可以測試網站能不能在新的環境正常運作

而 HTTPS 的 8443 port 也可以直接將 SSL/TLS 證書設定上去

啟用 HTTP/2 協定,在 <VirtualHost> 中加入:Protocols h2 http/1.1

 

以上,有須由的預祝升級順利