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

CentOS 7 PHP 連接 MySQL 127.0.0.1 失敗:SELinux httpd_can_network_connect 導致與解決方案

     編輯:MySQL 資料庫相關知識

CentOS 7 下 PHP CLI 可連 MySQL,但 PHP-FPM/HTTPD 訪問 127.0.0.1:3306 報錯 Can't connect to MySQL server on '127.0.0.1' (13) 2003。根因:SELinux 策略禁止 httpd 進程發起網絡連接。本文提供臨時/永久開啟 httpd_can_network_connect、關閉 SELinux/防火牆的完整方案,並說明生產環境權衡。

一、錯誤現象

Could not connect: Can't connect to MySQL server on '127.0.0.1' (13) 2003

CLI 正常,Web 失敗,典型 SELinux 限制。

二、診斷確認

getsebool -a | grep httpd
# 輸出:httpd_can_network_connect --> off

三、解決方案

方案 1:開啟 httpd_can_network_connect(推薦,最小權限原則)

# 臨時生效(重啟失效)
setsebool httpd_can_network_connect 1

# 永久生效(跨重啟)
setsebool -P httpd_can_network_connect 1

方案 2:關閉 SELinux(簡單粗暴,降低安全性)

# 臨時關閉
setenforce 0

# 永久關閉
vim /etc/selinux/config
SELINUX=disabled
# 重啟生效

方案 3:關閉防火牆(若 MySQL 在遠程主機)

systemctl stop firewalld
systemctl disable firewalld
# 或開放 3306
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

四、驗證

php -r '$link=mysql_connect("127.0.0.1","user","pass"); var_dump($link);'

Web 頁面刷新,連接成功。

五、生產環境權衡建議

方案安全性維護成本推薦場景
setsebool -P httpd_can_network_connect 1高(最小權限)低標準生產環境,合規要求嚴格
SELINUX=permissive中(僅告警不攔截)低調試階段、兼容舊應用
SELINUX=disabled低(無 MAC)低非關鍵內網、容器環境、極致性能

六、總結

CentOS 7 預設 SELinux Enforcing,httpd_can_network_connect=off 導致 PHP-FPM 無法連接 TCP MySQL。首選 setsebool -P httpd_can_network_connect 1,兼顧安全與功能;容器化部署時建議網絡命名空間隔離,而非關閉 SELinux。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved