首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SELinux 導致 PHP 無法連接 MySQL (Can't connect) 完整排查與解決

     編輯:MySQL 資料庫相關知識

故障現象

  • 測試環境 PHP 連接 MySQL 正常
  • 正式環境無論 TCP/IP、Unix Socket 均失敗
  • 錯誤:Can't connect to MySQL server on 'host' (13)(權限被拒絕)
  • 命令行 mysql -h host -u user -p 完全正常
  • 防火牆、MySQL 授權、php.ini、bind-address 均排查無誤

核心定位:SELinux 限制 httpd 進程網絡連接

# 查看 httpd 相關布爾值
getsebool -a | grep -i httpd

# 關鍵發現
httpd_can_network_connect --> off

解決方案

方案一:開啟 httpd 網絡連接權限(推薦,最小權限原則)

setsebool -P httpd_can_network_connect=1

-P 參數持久化寫入策略,重啟後生效。

方案二:全局禁用 SELinux(不推薦生產環境)

# 修改配置文件
vim /etc/sysconfig/selinux
# SELINUX=enforcing → SELINUX=disabled

# 或臨時生效(重啟失效)
setenforce 0

方案三:設置 SELinux 為寬容模式(僅記錄不阻擋)

# 配置文件
SELINUX=permissive

# 臨時
setenforce 0

驗證修復

# 重新測試 PHP 腳本
php test_db.php
# Connected successfully

原理解析

模式行為適用場景
Enforcing強制執行策略,阻擋違規操作生產環境標準
Permissive僅記錄違規日誌,不阻擋調試排查階段
Disabled完全關閉 SELinux不兼容應用/極簡環境

httpd 進程在 Enforcing 模式下默認禁止主動發起網絡連接(連接數據庫、API、Redis 等),需顯式開啟 httpd_can_network_connect 布爾值。

擴展:常見 httpd 布爾值

httpd_can_network_connect_db      # 連接數據庫端口
httpd_can_network_memcache        # 連接 Memcached
httpd_can_network_relay           # 郵件中繼
httpd_can_sendmail                # 發送郵件
httpd_enable_cgi                  # 執行 CGI
httpd_unified                     # 統一策略

最佳實踐建議

  1. ✅ 生產環境保持 Enforcing,按需開啟最小權限布爾值
  2. ✅ 變更後執行 ausearch -m avc -ts recent 審計驗證
  3. ✅ 文檔化所有 SELinux 策略調整,納入部署腳本
  4. ⚠️ 避免直接 Disabled,失去強制訪問控制安全屏障

快速診斷腳本

#!/bin/bash
echo "=== SELinux 狀態 ==="
getenforce
echo "=== httpd 網絡連接權限 ==="
getsebool httpd_can_network_connect
echo "=== 最近 AVC 拒絕日誌 ==="
ausearch -m avc -ts recent | head -20
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved