在 CentOS/RHEL/Fedora 等啟用 SELinux 的系統上安裝 Zend Optimizer (PHP 5.2/5.3) 或 Zend Guard Loader (PHP 5.3+/7.x) 後,重啟 PHP-FPM/Apache 時出現:
Failed loading /usr/local/Zend/lib/Optimizer/php-5.x.x/ZendOptimizer.so: /usr/local/Zend/lib/Optimizer/php-5.x.x/ZendOptimizer.so: cannot restore segment prot after reloc: Permission denied
或 PHP CLI 執行 php -v 顯示相同錯誤。**根因:SELinux 阻止了共享庫檔案的記憶體映射與執行權限 (textrel_shlib_t 問題)。** 本文提供標準解決流程。
# 1. 確認 Zend 模組實際路徑
ls -la /usr/local/Zend/lib/Optimizer/php-*/ZendOptimizer.so
# 或 Guard Loader
ls -la /usr/local/zend/guard-loader/php-*/ZendGuardLoader.so
# 2. 設定正確的 SELinux 檔案上下文 (關鍵步驟)
# Zend Optimizer
chcon -t textrel_shlib_t /usr/local/Zend/lib/Optimizer/php-*/ZendOptimizer.so
# Zend Guard Loader
chcon -t textrel_shlib_t /usr/local/zend/guard-loader/php-*/ZendGuardLoader.so
# 3. 重啟 PHP 服務驗證
systemctl restart php-fpm # 或 httpd, nginx+php-fpm
php -v # 應顯示 Zend 模組版本,無錯誤
textrel_shlib_t?allow_execmod、textrel_shlib_t 控制)。textrel_shlib_t 告訴 SELinux:「此共享庫需要文字重定位,允許執行」。# 將規則寫入本地政策,永久生效
semanage fcontext -a -t textrel_shlib_t "/usr/local/Zend/lib/Optimizer/php-.*/ZendOptimizer.so"
semanage fcontext -a -t textrel_shlib_t "/usr/local/zend/guard-loader/php-.*/ZendGuardLoader.so"
restorecon -Rv /usr/local/Zend /usr/local/zend
semanage 需安裝 policycoreutils-python (CentOS 7) 或 policycoreutils-python-utils (CentOS 8/9)。
# 檢查目前模式
getenforce
# Enforcing / Permissive / Disabled
# 檢查檔案上下文
ls -Z /usr/local/Zend/lib/Optimizer/php-*/ZendOptimizer.so
# 應顯示 ... textrel_shlib_t ...
# 查看 SELinux 拒絕日誌 (若仍有問題)
ausearch -m avc -ts recent
# 或
grep -i zend /var/log/audit/audit.log
setenforce 0 # 立即生效,重開機失效
# 永久修改 /etc/selinux/config: SELINUX=permissive
# 重開機生效
警告: 關閉/放寬 SELinux 會降低系統整體安全性,僅建議在測試環境或極短時間排查時使用。生產環境**必須**使用 chcon/semanage 精準放行。
cannot restore segment prot after reloc 明確指向 SELinux 記憶體保護機制,非檔案不存在。chcon 不做 semanage: 系統執行 restorecon 或 autorelabel 後,手動 chcon 會被重置,導致重開機後再次失效。SELinux 是 Linux 安全基石,遇到「Permission denied」但檔案權限正確時,**第一反應應檢查 SELinux 上下文與 audit.log**。Zend 模組屬於典型的 textrel_shlib_t 場景,精準打標籤、持久化規則,即可完美共存安全與功能。