在 CentOS 7 上與 Apache 奮戰的一週

前言:一場不只是版本號的升級
原本,我手上的老系統穩穩地跑在 PHP 7.4 + CentOS 7,一切看似正常。但客戶強烈要求升級 PHP,因為舊版本不再安全,也無法滿足新的套件需求。
年初時,我就開始研究升級方案,發現 從 PHP 7.4 升級到 8.1 或 8.3 都有相容性挑戰,但 PHP 每年都有小版本更新,長遠看直接升到最新版本其實更划算。
我知道年底就會有 PHP 8.4,而我在發文時已經是 12 月,PHP 8.5 也即將釋出。
於是,我決定 直接升級到當時最新的 PHP 8.3,希望一次解決安全、性能與相容性問題,也能為後續版本更新做好鋪墊。
換句話說,這次升級不是「想換就換」,而是一場 客戶需求 + 技術債清算 + 長遠規劃 的綜合戰。
我以為只是換個版本號,結果牽動了 Apache、模組、Thread 模式,甚至整個系統的配置。
⚙️ Step 1:備份永遠是第一步
在任何升級前,我都會先備份所有設定與資料:
- /etc/php.ini 與 /etc/php.d/ 下的設定檔
- Apache 的虛擬主機設定
- 網站原始碼與資料庫
這一步看似老掉牙,但每次升級都證明:
「沒備份的勇氣,最後都變成重裝的淚水。」
🔧 Step 2:從 Remi 安裝 PHP 8.3
CentOS 7 的官方套件庫最多只到 PHP 5.x,要升級到 8.3,必須透過 Remi Repository。
sudo yum install epel-release -y
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
sudo yum-config-manager --enable remi-php83
sudo yum install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json -y
安裝後確認 libphp.so 是否存在:
ls /usr/lib64/httpd/modules/ | grep libphp
🧱 Step 3:Apache 與 PHP 的「兼容性鬥爭」
理論上,啟用模組、修改 /etc/httpd/conf.d/php.conf 加上:
LoadModule php_module modules/libphp.so
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
然後重啟 Apache 就搞定。
但結果,我得到這句令人心碎的錯誤:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.
AH00013: Pre-configuration failed
意思是:
Apache 跑的是「多執行緒模式 (threaded MPM)」,但 PHP 模組是「非線程安全版」。 他們根本無法共存。
🧯 Step 4:切換 MPM 模式(救火現場)
解法是改用非執行緒的 MPM 模式,也就是 prefork。
編輯:
/etc/httpd/conf.modules.d/00-mpm.conf
將:
# LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
改成如上後,執行:
sudo apachectl configtest
sudo systemctl restart httpd
這時候 Apache 終於乖乖啟動了,info.php 也能正常顯示 PHP 8.3 的版本資訊。
🧪 Step 5:測試與驗證
在 /var/www/html/ 裡放上最經典的一段:
<?php phpinfo(); ?>
開啟瀏覽器輸入 http://your_server_IP/info.php,看到那張紫藍色的資訊頁面時,
真的有種「打贏 Boss」的爽感。
🧭 小結:升級後的世界
這次升級讓我重新體會到幾件事:
- PHP 8.3 的效能與語法進步非常明顯。
- 老專案一定會遇到相容性問題,特別是棄用函數(像 each()、create_function())。
- PHP 7.4 雖然還是很多人用,但已經完全停止官方安全更新。 留在那個版本,意味著所有漏洞都要自己扛。
- 考慮到 PHP 每年都會更新,小版本的維護其實更容易; 直接升到最新版本,長遠看反而省事。
- CentOS 7 與新版 PHP 的兼容性越來越尷尬,未來真的該考慮整體遷移。
- 文章發文時已經 12 月,PHP 8.5 也即將釋出,這次升級算是為下一波版本更新提前鋪路。
💬 後記:那些升級後才知道的事
升級 PHP 這件事,看似是技術問題,但其實更多是「心態轉換」。
以前我總覺得:「反正能跑就好」, 但當一個系統太久沒動,就像長滿灰塵的機器,哪天要重啟時,你才發現一堆零件都不再支援。
這篇紀錄,希望能讓還在猶豫升級的工程師們少踩一些坑。
如果你現在的系統還停在 7.4 或更舊版本,請記得: 👉 現在升級,也許麻煩;但不升級,未來會更麻煩。














