ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7 从零搭建 LAMP 环境:Apache、PHP、MySQL 配置与避坑指南

CentOS 7 从零搭建 LAMP 环境:Apache、PHP、MySQL 配置与避坑指南 简介这份PDF文档面向需要在CentOS 7上搭建Web运行环境的运维人员与后端初学者系统讲解Apache、PHP、MySQL三大组件的安装与整合流程帮助读者从零构建稳定的LAMP堆栈。内容覆盖防火墙与SELinux处理、iptables端口放行、httpd服务管理与httpd.conf配置、PHP解析器安装及php.conf与10-php.conf的FilesMatch处理规则、MySQL服务启动与初始化以及通过info.php验证Apache与PHP通信是否正常。资源包共1个文件为955KB的PDF文档便于离线查阅与打印对照。目前已有109人学习。读者可借此掌握各组件关键配置项、服务启停与开机自启命令、配置语法检查与排错思路适合作为搭建动态网站环境时的实操参考手册。1. CentOS 7 上把 Apache、PHP、MySQL 装成一套能跑的环境到底难在哪很多人拿到「centos7配置APachePHPmysql.pdf」这个标题第一反应是照着搜到的命令一条条敲结果卡在某个环节就再也起不来。这套组合在 CentOS 7 上其实非常成熟难点不在单个软件装不上而在于三者之间的衔接Apache 怎么把 PHP 请求交给 PHP 处理、PHP 怎么连上 MySQL、MySQL 的认证方式在 5.7 和 8.0 之间又不一样。任何一个环节对不上页面就是白屏或者 500。这篇笔记面向的是需要在 CentOS 7 上从零搭一套 LAMP 环境的人不管是本地测试还是给一个小型站点做部署。我会按「先装什么、再配什么、最后怎么验证」的顺序走一遍把每一步的命令、参数含义和容易翻车的地方都写清楚。CentOS 7 虽然已经进入维护末期但大量存量服务器还在跑这套配置依然是很多 PHP 项目的默认底座值得花时间搞明白。2. 装之前先把 CentOS 7 的底子打好源、防火墙、SELinux2.1 换国内 yum 源并确认系统版本CentOS 7 默认的 yum 源指向国外装包时经常卡住或者超时。第一步先确认系统版本再决定换哪个源。执行cat /etc/redhat-release正常会看到CentOS Linux release 7.x.x (Core)。如果版本号是 7.9用 vault 源或者阿里云的 centos-7 源都可以。换源的操作不复杂但要注意备份原文件。下面这段命令把默认源备份后替换成阿里云源# 备份原有源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 下载阿里云 CentOS 7 源 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 清理并重建缓存 yum clean all yum makecacheyum makecache这一步会拉取所有仓库的元数据如果卡在这里多半是网络问题或者源地址写错了。换完源之后用yum repolist确认仓库列表能正常显示再往下走。注意CentOS 7 官方源已经停止更新部分镜像站可能只保留 vault 归档。如果阿里云源报 404把 repo 文件里的mirrorlist注释掉直接用baseurl指向https://mirrors.aliyun.com/centos-vault/7.9.2009/。2.2 防火墙和 SELinux 的处理策略CentOS 7 默认开着 firewalld 和 SELinux这两个东西在配置阶段会制造大量「明明配置对了却访问不了」的问题。我的习惯是配置阶段先放行端口、把 SELinux 设为 permissive等整套环境跑通后再按需收紧。放行 HTTP 和 HTTPS 端口# 放行 80 和 443 firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps firewall-cmd --reload # 查看当前放行规则 firewall-cmd --list-allSELinux 的临时调整用setenforce 0永久生效要改/etc/selinux/config里的SELINUXpermissive。这里要区分清楚setenforce 0重启后失效改配置文件才持久。很多教程只写setenforce 0结果重启后 Apache 又起不来就是漏了改配置文件这一步。2.3 安装基础依赖和常用工具在装 Apache、PHP、MySQL 之前先把编译和网络工具补齐。yum install -y wget vim net-tools lsof这几个是后面排查问题会用到的。net-tools提供netstatlsof用来查端口占用wget下载安装包。这一步不装也能继续但出问题时没有工具会很难受。3. Apache 和 PHP 的安装与联动配置3.1 用 yum 装 Apache 并确认服务状态CentOS 7 的 yum 源里 Apache 的包名是httpd不是apache2那是 Debian 系的叫法。安装命令yum install -y httpd systemctl start httpd systemctl enable httpd systemctl status httpdsystemctl enable httpd是设置开机自启status用来确认服务是否正常运行。如果状态显示active (running)说明 Apache 已经起来了。这时候在浏览器访问服务器 IP应该能看到 Apache 的测试页面。如果访问不了先检查防火墙和 SELinux再确认 80 端口有没有被占用netstat -tlnp | grep 80。Apache 的主配置文件在/etc/httpd/conf/httpd.conf网站根目录默认是/var/www/html。这两个路径后面配 PHP 和放测试文件都要用到。3.2 安装 PHP 及 Apache 的 PHP 模块CentOS 7 默认源里的 PHP 版本是 5.4这个版本太老很多现代 PHP 项目跑不起来。要装 PHP 7.x 或 8.x需要先加 Remi 源和 EPEL 源# 安装 EPEL 和 Remi 源 yum install -y epel-release yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm # 启用 PHP 8.0 模块流以 8.0 为例 yum install -y yum-utils yum-config-manager --enable remi-php80 # 安装 PHP 及 Apache 对接模块 yum install -y php php-mysqlnd php-gd php-mbstring php-xml php-json这里的关键是php-mysqlnd它是 PHP 连 MySQL 的驱动不装这个后面 PHP 连数据库会报「could not find driver」。php-gd、php-mbstring、php-xml是大多数 PHP 应用的基础依赖一起装上省得后面补。装完后重启 Apache 让 PHP 模块生效systemctl restart httpd。然后在/var/www/html下建一个info.php?php // 输出 PHP 配置信息用于验证 PHP 是否正常解析 phpinfo(); ?浏览器访问http://服务器IP/info.php如果能看到 PHP 信息页说明 Apache 和 PHP 已经联动成功。看完记得把这个文件删掉暴露 phpinfo 有安全风险。3.3 Apache 处理 PHP 请求的配置要点Apache 通过mod_php或者php-fpm来处理 PHP。用 yum 装的php包默认走mod_php配置文件在/etc/httpd/conf.d/php.conf。这个文件里定义了.php后缀交给 PHP 模块处理一般不需要手动改。如果用的是php-fpm模式性能更好适合高并发配置方式不同需要装php-fpm启动服务然后在 Apache 里用ProxyPassMatch把.php请求转发给 php-fpm 的 9000 端口。两种模式选一种就行不要同时开否则会冲突。判断当前用的是哪种模式看/etc/httpd/conf.d/下有没有php.confmod_php或者php-fpm.conf。phpinfo()页面里的Server API字段会显示Apache 2.0 Handlermod_php或者FPM/FastCGIphp-fpm。4. MySQL 的安装、初始化和 PHP 连接测试4.1 选 MySQL 5.7 还是 8.0以及对应的安装方式CentOS 7 默认源里没有 MySQL只有 MariaDB。要装 MySQL 得先加官方源。5.7 和 8.0 的安装方式略有不同选哪个取决于项目要求。老项目一般用 5.7新项目建议 8.0。装 MySQL 5.7 的源# 下载 MySQL 5.7 的 yum 源 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm rpm -ivh mysql57-community-release-el7-11.noarch.rpm # 安装 MySQL 服务端 yum install -y mysql-community-server # 启动并设置开机自启 systemctl start mysqld systemctl enable mysqld装 MySQL 8.0 只需要把源换成mysql80-community-release-el7-3.noarch.rpm其余步骤一样。注意如果之前装过 MariaDB要先yum remove mariadb-libs卸掉否则会冲突。4.2 获取临时密码并完成安全初始化MySQL 5.7 和 8.0 首次启动会生成一个临时 root 密码存在日志里。用这条命令取出来grep temporary password /var/log/mysqld.log拿到密码后用mysql -uroot -p登录然后立刻改密码。MySQL 5.7 默认有密码强度校验密码必须包含大小写字母、数字和特殊字符长度至少 8 位。如果不想这么严可以先降低策略-- 降低密码强度要求仅测试环境建议 SET GLOBAL validate_password_policyLOW; SET GLOBAL validate_password_length6; -- 修改 root 密码 ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;MySQL 8.0 的密码策略参数名不一样是validate_password.policy和validate_password.length注意区分。改完密码后建议再执行mysql_secure_installation走一遍安全初始化删掉匿名用户、禁止 root 远程登录。4.3 PHP 连 MySQL 的测试脚本与认证方式坑PHP 连 MySQL 最常见的翻车点是认证方式。MySQL 8.0 默认用caching_sha2_password而老版本的 PHP 驱动可能只支持mysql_native_password连的时候会报Authentication plugin caching_sha2_password cannot be loaded。解决办法有两个一是升级 PHP 的 mysqlnd 驱动到支持新认证的版本二是把用户的认证方式改回mysql_native_password-- 创建测试用户并指定认证方式 CREATE USER testuserlocalhost IDENTIFIED WITH mysql_native_password BY Test123456; GRANT ALL PRIVILEGES ON testdb.* TO testuserlocalhost; FLUSH PRIVILEGES;然后写一个 PHP 测试脚本验证连接?php // 数据库连接测试脚本 $host 127.0.0.1; $user testuser; $pass Test123456; $db testdb; // 建立连接 $conn new mysqli($host, $user, $pass, $db); // 检查连接是否成功 if ($conn-connect_error) { die(连接失败: . $conn-connect_error); } echo 连接成功MySQL 版本: . $conn-server_info; // 关闭连接 $conn-close(); ?把这个文件放到/var/www/html/db_test.php浏览器访问。如果输出「连接成功」和版本号说明 PHP、Apache、MySQL 三者已经打通。如果报错根据错误信息定位Connection refused是 MySQL 没启动或者端口不对Access denied是用户名密码或权限问题cannot be loaded就是上面说的认证方式问题。5. 配置过程中最容易翻车的几个地方5.1 现象浏览器访问显示 403 Forbidden原因SELinux 拦截了 Apache 对网站目录的访问或者目录权限不对。CentOS 7 的 SELinux 默认策略下Apache 只能访问标记为httpd_sys_content_t的目录。解决先确认 SELinux 状态getenforce如果是Enforcing临时设为setenforce 0测试。如果确认是 SELinux 问题用chcon -R -t httpd_sys_content_t /var/www/html给目录打上正确标签或者直接改配置文件永久设为 permissive。目录权限方面确保/var/www/html的属主是apache:apache权限至少 755。5.2 现象PHP 页面白屏什么都不输出原因PHP 报错但错误信息没显示出来。CentOS 7 的 PHP 默认配置display_errors Off出错时页面就是空白。解决改/etc/php.ini把display_errors设为Onerror_reporting设为E_ALL然后重启 Apache。这样错误会直接输出到页面。生产环境不要这么干应该把错误写到日志里用tail -f /var/log/httpd/error_log查看。5.3 现象MySQL 服务启动失败日志报权限错误原因之前装过 MariaDB 或者手动改过/var/lib/mysql的权限导致 MySQL 用户没有读写权限。解决先看日志tail -50 /var/log/mysqld.log确认具体错误。如果是权限问题执行chown -R mysql:mysql /var/lib/mysql修复属主。如果是 MariaDB 残留冲突yum remove mariadb-libs卸掉再重装 MySQL。注意卸载 MariaDB 可能会连带卸载依赖它的包操作前确认一下。5.4 现象PHP 连 MySQL 报「No such file or directory」原因PHP 的mysqli或pdo_mysql扩展没装或者连接时用了localhost而 MySQL 走的是 socket 连接socket 路径不对。解决先php -m | grep mysql确认扩展有没有加载。如果没有yum install php-mysqlnd装上再重启 Apache。如果扩展有但还报错把连接地址从localhost改成127.0.0.1强制走 TCP 而不是 socket。socket 路径可以在/etc/my.cnf里看到默认是/var/lib/mysql/mysql.sock。5.5 现象改了 php.ini 但配置不生效原因PHP 的配置文件路径不止一个phpinfo()页面里的Loaded Configuration File才是实际加载的那个。有时候改了/etc/php.ini但实际加载的是/etc/php.d/下的某个文件。解决先看phpinfo()确认Loaded Configuration File的路径改那个文件。改完必须重启 Apachesystemctl restart httpd不是 reload。reload 有时候不会重新读取 php.ini。6. 把这套环境用起来从测试页到实际项目的几个关键调整环境跑通只是第一步真正拿它跑项目还有几处要调。第一处是 Apache 的虚拟主机配置。默认只有一个站点根目录多个项目要配 VirtualHost。在/etc/httpd/conf.d/下建一个vhost.conf每个站点一段VirtualHost *:80指定DocumentRoot和ServerName。配完systemctl reload httpd生效。第二处是 PHP 的上传限制和超时。默认upload_max_filesize是 2Mpost_max_size是 8Mmax_execution_time是 30 秒。跑后台管理系统或者导入功能时这几个值经常不够。改/etc/php.ini里对应的参数upload_max_filesize和post_max_size要一起改且post_max_size不能小于upload_max_filesize。第三处是 MySQL 的字符集。CentOS 7 上 MySQL 5.7 默认字符集是latin1存中文会乱码。在/etc/my.cnf的[mysqld]段加character-set-serverutf8mb4和collation-serverutf8mb4_general_ci重启 MySQL 生效。已经建好的库要手动改ALTER DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。验证整套环境是否真的可用我一般会写一个最小的 CRUD 脚本建表、插入一条中文数据、查出来显示在页面上。这个脚本能跑通说明 Apache 解析 PHP 正常、PHP 连 MySQL 正常、字符集没问题。比单看phpinfo()靠谱得多。最后说一个我自己的习惯每次配完环境把关键配置文件的路径和改动点记在一个setup-notes.md里跟项目代码放一起。过几个月再回来改东西不用重新翻一遍配置文件。这套 LAMP 组合本身不复杂翻车基本都翻在细节上记下来能省很多重复排查的时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表