CentOS PHP配置中常见的坑及解决方案
CentOS系统中,php.ini的位置并非固定,可能位于/etc/php.ini、/etc/php.d/目录下的某个文件,或根据PHP版本分布在/etc/php/7.x/cli/php.ini(命令行)、/etc/php/7.x/fpm/php.ini(PHP-FPM)等路径。若找不到,可通过php --ini命令快速定位加载的配置文件路径。
PHP脚本或网站根目录权限设置不当(如root:root所有、权限过严),会导致“403 Forbidden”或“Permission denied”错误。需将网站根目录(如/var/www/html)权限设为755,脚本文件权限设为644,所有者改为Web服务器运行用户(如Apache的apache、Nginx+PHP-FPM的www-data):
sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html ```。 ### **3. SELinux阻止Web服务器访问文件** CentOS默认开启SELinux,若网站文件不在`/var/www/html`目录,或未正确设置SELinux上下文,会出现“403 Forbidden”错误。解决方法: - 临时关闭SELinux(不推荐生产环境):`sudo setenforce 0`; - 永久关闭:编辑`/etc/selinux/config`,将`SELINUX=enforcing`改为`disabled`; - 正确设置上下文:`sudo semanage fcontext -a -t httpd_sys_rw_content_t "/path/to/your/webroot(/.*)?"`,然后执行`restorecon -Rv /path/to/your/webroot`。 ### **4. 防火墙未开放HTTP/HTTPS端口** 即使服务正常运行,若防火墙(firewalld)未开放80(HTTP)、443(HTTPS)端口,外部无法访问网站。需开放端口并重载防火墙: ```bash sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload ```。 ### **5. PHP模块缺失导致功能异常** 许多PHP应用(如WordPress、Laravel)需要特定扩展(如`php-mysqlnd`、`php-gd`、`php-mbstring`),未安装或未启用会导致“Call to undefined function”错误。解决方法: - 安装所需扩展:`sudo yum install php-<module-name>`(如`php-mysqlnd`); - 启用扩展:在`php.ini`中取消对应行的注释(如`extension=mysqli.so`),或通过`sudo yum install php-<module-name>`自动启用; - 重启Web服务器:`sudo systemctl restart httpd`(Apache)或`sudo systemctl restart php-fpm`(PHP-FPM)。 ### **6. PHP-FPM配置错误导致502 Bad Gateway** 若Nginx/Apache与PHP-FPM通信失败(如`fastcgi_pass`路径错误、`listen`端口不一致、用户/组权限不符),会出现502错误。需检查: - PHP-FPM的`www.conf`(通常位于`/etc/php-fpm.d/`)中的`listen`指令(如`127.0.0.1:9000`或`/run/php-fpm/www.sock`); - Web服务器配置中的`fastcgi_pass`是否与`listen`一致(如Nginx的`fastcgi_pass 127.0.0.1:9000;`); - PHP-FPM进程用户/组(`user`/`group`)是否与Web服务器运行用户一致(如`www-data`)。 ### **7. 数据库连接失败** PHP连接MySQL/MariaDB时,若`php.ini`中的数据库驱动未启用(如`extension=pdo_mysql.so`、`extension=mysqli.so`),或连接信息(主机、用户名、密码、socket路径)错误,会出现“mysqli_connect(): (HY000/2002): No such file or directory”错误。解决方法: - 启用数据库扩展:在`php.ini`中取消对应行的注释; - 检查连接信息:确保`host`(如`localhost`)、`username`、`password`、`database`正确; - 统一socket路径:若使用Unix socket,需将`php.ini`中的`pdo_mysql.default_socket`和`mysqli.default_socket`设置为与MySQL配置(`/etc/my.cnf`)一致的路径(如`/var/run/mysqld/mysqld.sock`)。 ### **8. 内存限制导致脚本终止** 若PHP脚本需要处理大量数据(如上传大文件、复杂计算),默认的`memory_limit`(通常为32M或64M)可能不足,导致“Fatal error: Allowed memory size of X bytes exhausted”错误。解决方法: - 修改`php.ini`中的`memory_limit`(如`256M`或更高); - 若使用PHP-FPM,还需修改`www.conf`中的`php_admin_value[memory_limit]`; - 重启Web服务器和PHP-FPM使更改生效。 ### **9. 文件上传大小限制** 默认的`upload_max_filesize`(通常为2M)和`post_max_size`(通常为8M)较小,无法上传大文件(如图片、视频)。需修改`php.ini`中的这两个参数(如`upload_max_filesize = 100M`、`post_max_size = 110M`),并重启Web服务器。 ### **10. PHP-FPM进程管理参数不合理** `pm.max_children`(最大子进程数)、`pm.start_servers`(启动时的进程数)等参数设置不当,会导致服务器资源耗尽(如CPU占用100%)或响应缓慢。需根据服务器配置(如内存大小)调整: - 示例(4GB内存):`pm.max_children = 20`、`pm.start_servers = 5`、`pm.min_spare_servers = 3`、`pm.max_spare_servers = 8`。