Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

Linux 安裝 Zend Optimizer/Guard Loader 報錯「Failed loading ... Optimizer」SELinux 導致的完美解決方案

編輯:關於伺服器

在 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?

  • Zend Optimizer/Guard Loader 內含需文字重定位的程式碼 (舊版編譯器產生),載入時需在記憶體中修改代碼段。
  • SELinux 預設禁止共享庫進行文字重定位 (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)。

驗證 SELinux 狀態與上下文

# 檢查目前模式
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

替代方案:暫時設為 Permissive (不推薦生產環境)

setenforce 0  # 立即生效,重開機失效
# 永久修改 /etc/selinux/config: SELINUX=permissive
# 重開機生效

警告: 關閉/放寬 SELinux 會降低系統整體安全性,僅建議在測試環境或極短時間排查時使用。生產環境**必須**使用 chcon/semanage 精準放行。

常見誤區

  • 以為是路徑錯誤: 錯誤訊息 cannot restore segment prot after reloc 明確指向 SELinux 記憶體保護機制,非檔案不存在。
  • 只做 chcon 不做 semanage: 系統執行 restorecon 或 autorelabel 後,手動 chcon 會被重置,導致重開機後再次失效。
  • 混淆 Zend Optimizer (PHP 5.2/5.3) 與 Zend Guard Loader (5.3+/7.x): 路徑不同,請根據實際安裝版本操作對應檔案。

SELinux 是 Linux 安全基石,遇到「Permission denied」但檔案權限正確時,**第一反應應檢查 SELinux 上下文與 audit.log**。Zend 模組屬於典型的 textrel_shlib_t 場景,精準打標籤、持久化規則,即可完美共存安全與功能。

Copyright © Windows教程網 All Rights Reserved