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解析配置及MySQL初始化等关键环节并给出配置语法检查与PHP测试页验证的排错思路。资源包共1个PDF文件约955KB篇幅紧凑、命令与配置文件示例集中便于按步骤对照实操。目前已有109人学习下载适合刚接触Linux服务器环境搭建、需要一份可跟随操作的中文配置参考的读者也可作为日常部署时的速查手册。1. CentOS 7 上把 ApachePHPMySQL 跑起来到底难在哪很多人拿到一份「centos7配置APachePHPmysql.pdf」这样的文档第一反应是照着敲命令就行。真上手才发现坑不在命令本身而在版本组合、源、权限和 SELinux 这几件事上。CentOS 7 默认的 yum 源里PHP 停在 5.4MySQL 早被 MariaDB 顶替Apache 还是 2.4 的老版本。你按老教程装完PHP 连不上 MySQL或者 Apache 读不到网站目录报 403、500一脸懵。这套组合业内叫 LAMPLinuxApacheMySQLPHP到今天依然是很多中小项目、内部系统、老代码的默认底座。它解决的是「一台机器上跑一个动态网站」这个最朴素的需求Apache 收请求PHP 处理逻辑MySQL 存数据。适合谁适合手里有台 CentOS 7 的机器、要部署一套 PHP 应用、又不想上容器和云服务的从业者。这篇就把从装到通、从通到稳的路径讲清楚参数怎么设、坑在哪都落到具体命令上。2. 装之前先定版本CentOS 7 的源决定了你能装到什么CentOS 7 已经在 2024 年 6 月停止维护官方源基本不可用这是所有操作的前提。你如果直接yum install大概率卡在下载元数据那一步。所以第一步不是装软件是把源换掉再决定 PHP 和 MySQL 用哪个版本。2.1 换源让 yum 能正常干活CentOS 7 停维后官方 mirror 地址失效需要指向 vault 归档源或者国内镜像。我一般用阿里云的 vault 源稳定且快。# 备份原有源文件 mkdir -p /etc/yum.repos.d/bak mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/bak/ # 写入阿里云 vault 源 cat /etc/yum.repos.d/CentOS-Vault.repo EOF [base] nameCentOS-7 - Base - aliyun baseurlhttps://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/ gpgcheck0 enabled1 [updates] nameCentOS-7 - Updates - aliyun baseurlhttps://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/ gpgcheck0 enabled1 [extras] nameCentOS-7 - Extras - aliyun baseurlhttps://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/ gpgcheck0 enabled1 EOF # 清理缓存并重建 yum clean all yum makecache逻辑说明baseurl指向的是 7.9.2009 这个最终版本的归档路径$basearch会自动替换成 x86_64 或 aarch64。gpgcheck0是为了省去导入 key 的步骤内网环境够用如果对安全有要求把 key 下下来改成 1。执行完yum makecache不报错说明源通了。参数上唯一要改的是baseurl里的版本号如果你用的是 7.6 或 7.8把7.9.2009换成对应版本即可。换完源先跑一次yum update -y把基础包对齐避免后面装 PHP 时依赖冲突。2.2 选 PHP 版本5.4 能用但别用CentOS 7 自带的 PHP 是 5.4这个版本 2015 年就停止支持了很多现代框架Laravel、ThinkPHP 6根本跑不起来。热搜里常出现「php 8 phpstorm」「php 8.3下载」说明大家已经在用新版本。但在 CentOS 7 上装 PHP 8 需要额外源我一般用 Remi 源。# 安装 Remi 源和 EPEL yum install -y epel-release yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm # 启用 PHP 7.4 模块流生产上 7.4 兼容性最好 yum install -y yum-utils yum-config-manager --enable remi-php74 # 安装 PHP 及常用扩展 yum install -y php php-cli php-fpm php-mysqlnd php-gd php-mbstring php-xml php-json php-opcache逻辑说明Remi 源把不同 PHP 版本做成模块--enable remi-php74就是告诉 yum 用 7.4 这一套。php-mysqlnd是 MySQL 原生驱动比老的php-mysql性能好且支持更多特性。php-fpm是 FastCGI 进程管理器Apache 通过它来跑 PHP比 mod_php 模式更省资源。参数上如果你要 PHP 8.0把remi-php74换成remi-php80扩展名基本一致。装完用php -v确认版本php -m看扩展有没有加载全。这里有个常见翻车点装了php-mysqlnd但没重启 ApachePHP 里mysqli类找不到后面会细说。2.3 MySQL 还是 MariaDB先想清楚CentOS 7 的源里mysql-server实际指向 MariaDB。如果你要的是正牌 MySQL得自己加官方源。热搜里「mysql 5.7.44 安装过程详细」「mysql安装教程8.0」说明两个版本都有人用。我的建议老项目用 5.7新项目用 8.0但 8.0 的默认认证插件是caching_sha2_password老 PHP 驱动可能连不上需要改。# 添加 MySQL 官方 yum 源以 5.7 为例 yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm # 安装 MySQL 服务端 yum install -y mysql-community-server # 启动并设置开机自启 systemctl start mysqld systemctl enable mysqld # 获取临时密码 grep temporary password /var/log/mysqld.log逻辑说明官方源 rpm 装完后会在/etc/yum.repos.d/下生成mysql-community.repo里面默认启用的是 5.7。mysqld.log里的临时密码是首次启动随机生成的用它登录后必须改密码才能操作。参数上MySQL 5.7 默认密码策略要求大小写数字符号长度至少 8 位。如果你想要简单密码登录后执行set global validate_password_policy0;再改。8.0 的话策略参数名是validate_password.policy。这一步别偷懒很多人卡在「密码太简单不让改」上。3. 把三个组件串起来Apache 怎么把请求交给 PHP装完三个组件只是第一步真正让它们协同工作的是配置。Apache 处理静态文件遇到.php后缀就转给 PHP-FPMPHP 再通过驱动连 MySQL。这条链路任何一环断了页面就是白屏或 500。3.1 Apache 对接 PHP-FPM 的两种方式Apache 跑 PHP 有两种模式mod_php和php-fpm。mod_php把 PHP 嵌进 Apache 进程配置简单但吃内存php-fpm是独立进程Apache 通过 FastCGI 协议转发更灵活。CentOS 7 Remi 源装出来的 PHP 默认走 fpm所以 Apache 这边要配代理。# 安装 Apache yum install -y httpd # 启用必要模块 cat /etc/httpd/conf.modules.d/00-proxy.conf EOF LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so EOF # 在虚拟主机里配置 PHP 转发 cat /etc/httpd/conf.d/php.conf EOF FilesMatch \.php$ SetHandler proxy:fcgi://127.0.0.1:9000 /FilesMatch DirectoryIndex index.php index.html EOF # 启动服务 systemctl start php-fpm systemctl start httpd systemctl enable php-fpm httpd逻辑说明SetHandler这行是关键它告诉 Apache 所有.php结尾的请求都通过 FastCGI 协议发给本机 9000 端口的 PHP-FPM。DirectoryIndex让首页优先找index.php。两个服务都要开机自启否则重启机器后网站就挂了。参数上PHP-FPM 默认监听127.0.0.1:9000可以在/etc/php-fpm.d/www.conf里改listen。如果 Apache 和 PHP-FPM 不在同一台机器把127.0.0.1换成实际 IP同时确认防火墙放行。这里有个细节proxy:fcgi后面不能有多余空格否则 Apache 启动报语法错误。3.2 建库建用户别用 root 连应用应用连数据库永远不要用 root。建一个专用库和专用用户权限只给到需要的库。# 登录 MySQL用临时密码 mysql -uroot -p # 建库 CREATE DATABASE appdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 建用户并授权 CREATE USER appuserlocalhost IDENTIFIED BY App2024Pass; GRANT ALL PRIVILEGES ON appdb.* TO appuserlocalhost; FLUSH PRIVILEGES;逻辑说明utf8mb4是必须的utf8在 MySQL 里是残缺的存 emoji 会报错。localhost限定只能本机连如果应用和数据库分离改成具体 IP 或%但不建议。FLUSH PRIVILEGES让权限立即生效。参数上密码要符合策略。如果报ERROR 1819说明密码强度不够要么改密码要么先降策略。字符集在建库时定好后面改表很麻烦。3.3 写一个 PHP 探针验证全链路配置完别急着部署应用先写个最小页面确认 PHP 能跑、能连库。?php // /var/www/html/index.php header(Content-Type: text/html; charsetutf-8); // 1. 确认 PHP 版本 echo PHP 版本: . phpversion() . br; // 2. 确认 MySQL 扩展加载 if (extension_loaded(mysqli)) { echo mysqli 扩展: 已加载br; } else { echo mysqli 扩展: 未加载检查 php-mysqlndbr; exit; } // 3. 尝试连接数据库 $conn new mysqli(localhost, appuser, App2024Pass, appdb); if ($conn-connect_error) { die(连接失败: . $conn-connect_error); } echo 数据库连接: 成功br; // 4. 查一下字符集 $res $conn-query(SELECT character_set_database); $row $res-fetch_row(); echo 库字符集: . $row[0]; $conn-close();逻辑说明这段代码分四步验证——PHP 本身、mysqli 扩展、数据库连接、字符集。任何一步失败都会明确告诉你问题在哪。new mysqli的参数依次是主机、用户、密码、库名。参数上如果连接失败报Connection refused检查 MySQL 是否启动、端口是否监听。报Access denied检查用户名密码和授权主机。报Unknown database说明库没建对。这个探针页面验证通过后删掉别留在生产环境。4. 避坑与排查这几个问题我踩过不止一次配置 LAMP 的坑集中在权限、SELinux 和版本兼容上。下面五条是我实际遇到过的每条都按现象、原因、解决来说。4.1 访问页面报 403 Forbidden现象浏览器打开显示 403Apache 错误日志里写client denied by server configuration。原因Apache 2.4 的默认目录权限是Require all denied网站根目录没有显式放行。另外 SELinux 也可能拦截。解决在/etc/httpd/conf.d/下加一个配置放行/var/www/htmlcat /etc/httpd/conf.d/webroot.conf EOF Directory /var/www/html Require all granted AllowOverride All /Directory EOF systemctl reload httpd如果还不行临时把 SELinux 设为宽容模式测试setenforce 0。确认是 SELinux 问题后用chcon -R -t httpd_sys_content_t /var/www/html恢复上下文再setenforce 1。4.2 PHP 页面白屏或下载源码现象访问.php文件浏览器直接下载或者显示空白没有报错。原因Apache 没把.php交给 PHP-FPM 处理或者 PHP-FPM 没启动。白屏则通常是 PHP 报错但display_errors关了。解决先确认php-fpm在跑systemctl status php-fpm。再检查/etc/httpd/conf.d/php.conf里的SetHandler有没有写对。白屏的话在/etc/php.ini里把display_errors Off改成Onerror_reporting E_ALL重启 php-fpm 后就能看到具体错误。4.3 连 MySQL 报 No such file or directory现象PHP 连localhost时报mysqli::real_connect(): (HY000/2002): No such file or directory。原因MySQL 客户端把localhost解析成 Unix socket 连接而 socket 文件路径和 PHP 默认找的不一致。解决把连接主机从localhost改成127.0.0.1强制走 TCP。或者在/etc/php.ini里设置mysqli.default_socket /var/lib/mysql/mysql.sock和 MySQL 的socket配置对齐。用mysqladmin variables | grep socket可以查到实际路径。4.4 MySQL 8.0 认证插件导致连接失败现象PHP 连 MySQL 8.0 报The server requested authentication method unknown to the client。原因MySQL 8.0 默认用caching_sha2_password老版本 PHP 的 mysqlnd 驱动不支持。解决把用户认证方式改成mysql_native_passwordALTER USER appuserlocalhost IDENTIFIED WITH mysql_native_password BY App2024Pass; FLUSH PRIVILEGES;或者升级 PHP 到 7.4 并确保 mysqlnd 是最新的。生产上如果没法改用户就在 MySQL 配置里加default_authentication_pluginmysql_native_password。4.5 上传文件报 Permission denied现象PHP 上传文件到指定目录失败日志里写move_uploaded_file(): failed to open stream: Permission denied。原因Apache 或 PHP-FPM 的运行用户通常是apache或nginx对目标目录没有写权限。解决确认目录属主和权限chown -R apache:apache /var/www/html/uploads chmod -R 755 /var/www/html/uploads如果 SELinux 开着还要加规则setsebool -P httpd_unified 1或者给目录打上httpd_sys_rw_content_t标签。别图省事直接chmod 777那是给自己埋雷。5. 让这套环境稳下来几个我一直在用的加固习惯装通只是开始真正让 LAMP 在生产上少出事的是几个不起眼的习惯。这些不是官方文档里的必选项但都是我踩过坑之后固定下来的动作。第一个习惯是给 PHP-FPM 设进程上限。默认配置在/etc/php-fpm.d/www.conf里pm.max_children是 50小内存机器上跑满会 OOM。我一般按内存算每个 PHP 进程约 30MB2G 内存的机器设 30 左右。同时把pm.max_requests设成 500让进程处理一定请求后自动重启避免内存泄漏累积。; /etc/php-fpm.d/www.conf 关键参数 pm dynamic pm.max_children 30 pm.start_servers 5 pm.min_spare_servers 5 pm.max_spare_servers 10 pm.max_requests 500第二个习惯是开 OPcache。PHP 每次执行都要编译脚本OPcache 把编译结果缓存到内存性能提升明显。在/etc/php.d/10-opcache.ini里确认opcache.enable1生产环境把opcache.validate_timestamps设成 0改代码后手动 reload php-fpm。开发环境保持 1方便调试。第三个习惯是给 MySQL 设慢查询日志。很多性能问题不是突然出现的是慢查询攒出来的。在/etc/my.cnf里加slow_query_log 1 slow_query_log_file /var/log/mysql-slow.log long_query_time 2long_query_time 2表示超过 2 秒的查询记下来。跑一段时间后用mysqldumpslow分析往往能发现缺索引的 SQL。这个习惯帮我提前发现过好几次全表扫描。第四个习惯是定期验证备份可恢复。mysqldump谁都会跑但备份文件能不能恢复是另一回事。我一般每月做一次恢复演练把备份导入一个临时库跑几条业务查询确认数据完整。命令很简单# 备份 mysqldump -uappuser -p appdb /backup/appdb_$(date %F).sql # 恢复到临时库验证 mysql -uroot -p -e CREATE DATABASE appdb_verify mysql -uroot -p appdb_verify /backup/appdb_2024-06-01.sql最后说个验证方法用ab或curl做一轮基础压测确认并发下不崩。ab -n 1000 -c 50 http://your-server/index.php看失败率和响应时间。如果失败率高回头查 PHP-FPM 进程数和 MySQL 连接数。这套环境不追求极致性能但求稳。我自己的习惯是每次改完配置先systemctl reload而不是restart减少服务中断改 MySQL 参数前先SHOW VARIABLES看当前值改完对比确认生效。这些动作花不了几分钟但能省下大量排查时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表