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
# 臨時生效(重啟失效)
setsebool httpd_can_network_connect 1
# 永久生效(跨重啟)
setsebool -P httpd_can_network_connect 1
# 臨時關閉
setenforce 0
# 永久關閉
vim /etc/selinux/config
SELINUX=disabled
# 重啟生效
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。