资讯详情

LAMP一键安装脚本实战:Ubuntu、CentOS、Kylin下PHP7与MariaDB部署

📅 2026/10/15 15:55:53 | 华诺云谱 👁 阅读
LAMP一键安装脚本实战:Ubuntu、CentOS、Kylin下PHP7与MariaDB部署
简介面向需要在 Ubuntu 24、Kylin V10、CentOS 7 等系统上快速部署 Web 运行环境的运维人员与开发者压缩包将 Apache、PHP 7.4 与 MariaDB 的安装过程封装为一键脚本解决手动整理脚本、源码编译和大量后续配置带来的耗时问题。包内共 7 个文件体积仅 108KB其中 1 个 sh 脚本承担自动化安装主流程4 个 rpm 包用于补齐并切换可用的 YUM 源依赖2 个 ini 文件分别对应 PHP 7.4 与 PHP 默认配置便于安装后按需调整参数。资源已针对 CentOS 停止维护后无法正常安装的问题在脚本内重新配置了可用源降低了环境搭建门槛已有 559 人学习下载。适合希望省去重复踩坑、快速获得可运行 Web 环境的入门与进阶用户按脚本执行即可完成核心组件部署。1. 三套系统一个脚本为什么要做 LAMP 一键安装我最近半年把同一套 Apache PHP 7 MariaDB 环境在 Ubuntu 24、Kylin V10、CentOS 7 三类服务器上反复装过很多遍。表面看都是“装 LAMP”实际上完全是三套玩法Ubuntu 24 默认只有 PHP 8.3老业务代码直接报函数不存在CentOS 7 停了维护官方 yum 源都变成了 404Kylin V10 自带 PHP 7.x但网上教程大多按 CentOS 的写法抄装完一堆对不上的包。这个「apache php7 mariadb 一键安装资源」要解决的就是写一套能自动识别系统的脚本把切源、装包、改 Apache 配置、拉起服务一次做完让新手不用再对着三篇教程来回试也让批量交付环境的运维省下手动点四十多分钟的重复劳动。适合被 PHP 7 旧业务绑住、又得面对新系统底座的开发者以及需要在多平台快速复现环境的测试同学。2. 一键安装的底层逻辑先懂 LAMP 版本搭配再谈自动化一键安装脚本看着是“一把梭”真正写起来七成时间花在版本搭配上。脚本里每一次 apt-get 或 yum install 的背后都是一组经过取舍的包名和源地址。先搞清三个系统默认给了什么、缺什么再动手写脚本后面才不会到处打补丁。2.1 三个系统的默认包差异一张表看清坑在哪系统包管理默认 Apache默认 PHP默认 MariaDB主要问题Ubuntu 24aptapache2 2.4.xPHP 8.310.11PHP 版本过新旧应用不兼容CentOS 7yumhttpd 2.4.6PHP 5.45.5全线落后且仓库已归档必须换源Kylin V10yum/dnfhttpd 2.4.xPHP 7.x10.3/10.5小版本随 SP 变化需装后核验先说 Ubuntu 24。它的 24.04 仓库里默认 PHP 是 8.3MariaDB 是 10.11Apache 也是新版本对一个要跑 PHP 7.4 老项目的场景来说唯一要解决的变量就是 PHP。CentOS 7 则完全相反默认 PHP 5.4、MariaDB 5.5老到没法直接跑现代应用而且官方仓库整体下线yum 不换源连 makecache 都会失败。Kylin V10 介于两者之间仓库里有 PHP 7.x 和 MariaDB 10.x多数场景不用碰第三方源但不同 SP 版本提供的具体小版本不一样所以脚本里要做一次“装完看版本”的兜底检查。之所以选 MariaDB 而不是 MySQL 8是因为 MariaDB 10.x 默认保持 mysql_native_password 认证插件PHP 7.4 自带的 mysqli 驱动可以直接连MySQL 8 默认的认证方式换过一轮老版本 PHP 驱动经常报认证握手失败。这个兼容性差异就是“为什么标题写的是 MariaDB 而不是 MySQL”的直接原因。2.2 为什么 PHP 7 必须走第三方源而不是用默认源PHP 7.4 是整个 PHP 7 系列最后一个版本官方在 2022 年底停止安全维护。Ubuntu 24 发布时仓库里只有 PHP 8.3apt 直接装根本拿不到 7.4常规做法是添加社区维护的 PHP PPA源路径形如 ppa:ondrej/php它会提供 php7.4、libapache2-mod-php7.4 等一整套包并且可以和系统默认的 PHP 8.3 共存。要注意 PPA 里 7.4 和 8.x 的包属于同一套依赖体系装的时候不要把系统自带的 php8.3 也混装进来否则 Apache 加载哪个模块完全看排序很容易翻车。CentOS 7 这边官方源里连 PHP 7 的影子都没有过去常用的 SCL 集合也只维护到 PHP 7.2/7.3想要 7.4 只能走社区维护的 PHP 仓库。这类仓库提供的是 php74-php 前缀的包例如 php74-php、php74-php-mysqlndPHP 进程以 php-fpm 形态运行和 CentOS 6 时代直接装 mod_php 的思路完全不同。Kylin V10 是少数不用折腾第三方源的情况原生仓库就有 PHP 7.x但小版本跟着 SP 走安装后必须用 php -v 核验一次防止某个 SP 只提供 7.2 而业务要求 7.4。另外PHP 装完必须带上 mysqlnd 相关扩展。很多自装环境页面报 “Call to undefined function mysqli_connect()”就是只装了 PHP 核心包、没装 php7.4-mysql 或 php-mysqlnd。所以脚本里把这类扩展包直接写死在 PHP_PKGS 变量中这一步省不掉。2.3 mod_php 与 php-fpm 的选择一键脚本里怎么取舍同一套 PHP挂到 Apache 上有两种形态编译成 Apache 模块mod_php随 httpd 进程运行或者独立成 php-fpm 服务、由 Apache 把 PHP 请求转发过去。Ubuntu 24 和 Kylin V10 我倾向 mod_php因为包管理器直接提供模块包装完 a2enmod 就生效配置量最小符合一键脚本“少出岔子”的目标。CentOS 7 的 PHP 7.4 社区包默认给 php-fpm 形态所以 CentOS 分支要走转发通信的方式配置文件多一处换来的是 PHP 进程独立、出问题不会拖垮 Apache。mod_php 有个经典限制它要求 Apache 处于 prefork MPM 模式而 Ubuntu 的 apache2 默认启用 event MPM两者冲突时 Apache 会拒绝启动或干脆不解析 PHP。一键脚本里必须显式做一次 MPM 切换a2dismod mpm_event、a2enmod mpm_prefork这个动作不做装完访问 .php 文件大概率是空白页。php-fpm 形态没有这个限制event MPM 下也能正常工作所以 CentOS 分支的流程反而更省事。如果你的业务明确要求 Apache 保持 event MPM或者要求 PHP 进程与 Web 进程隔离那就别用 mod_php三个系统统一走 php-fpm 路线。只是这样一来 Ubuntu 分支要多写一段 httpd 转发配置一键脚本的复杂度也会上一个台阶我会优先照顾“能一次跑通”而不是“架构最优雅”。3. 脚本主框架从系统检测到拉起服务的完整流程一键脚本的骨架就四步识别系统、映射包名、执行安装、启动服务剩下的全是细节。这章给出一套可以直接抄的主框架把最容易出错的判断逻辑单独拆开讲。3.1 系统检测与变量映射让一套脚本认识三个系统#!/bin/bash # LAMP 一键安装脚本检测 - 切源 - 装包 - 配置 - 起服务 # 用法: bash lamp_onekey.sh建议 root 执行 set -euo pipefail LOG/var/log/lamp_install.log detect_os() { # Ubuntu 24 / Kylin V10 / CentOS 7 都有 /etc/os-release优先读它 if [ -f /etc/os-release ]; then . /etc/os-release SYS_ID${ID} SYS_VER${VERSION_ID} else # 兜底少数精简 CentOS 7 镜像缺 os-release SYS_IDcentos SYS_VER7 fi echo 检测到系统: ${SYS_ID} ${SYS_VER} $LOG } map_packages() { case ${SYS_ID} in ubuntu) PKGapt APACHE_SVCapache2 PHP_PKGSlibapache2-mod-php7.4 php7.4 php7.4-mysql DB_PKGmariadb-server DB_SVCmariadb ;; centos) PKGyum APACHE_SVChttpd PHP_PKGSphp74-php php74-php-mysqlnd php74-php-fpm DB_PKGmariadb-server DB_SVCmariadb ;; kylin) PKGyum APACHE_SVChttpd PHP_PKGSphp php-mysqlnd DB_PKGmariadb-server DB_SVCmariadb ;; *) echo 暂不支持的系统: ${SYS_ID} $LOG exit 1 ;; esac }这段的要点在 map_packages 的变量设计上。APACHE_SVC 和 DB_SVC 两个服务名变量是很容易被忽视的Ubuntu 上 Apache 服务叫 apache2CentOS 上叫 httpdSystemd 单元名完全不同后面所有 systemctl 调用都依赖这两个变量。PHP_PKGS 是三个系统差异最大的地方Ubuntu 走 mod_php 模块包CentOS 走 FPM 系列包Kylin 直接用原生 php 包。开头的set -euo pipefail是防止脚本“带病继续”任何一个命令失败直接退出日志能定位卡在哪一步代价是脚本不具备幂等性失败了要清理残留包再重跑这个处理放在第五章讲。3.2 安装主流程切源、装包、改配置lamp_install() { case ${PKG} in apt) export DEBIAN_FRONTENDnoninteractive apt-get install -y software-properties-common add-apt-repository -y ppa:ondrej/php # 社区 PHP 源提供 7.4 apt-get update apt-get install -y apache2 $PHP_PKGS $DB_PKG ;; yum) modify_yum_source # 见 4.2/4.3负责把源切成可用状态 yum install -y epel-release httpd $PHP_PKGS $DB_PKG ;; esac } lamp_config() { case ${SYS_ID} in ubuntu) a2dismod mpm_event # mod_php 必须配 prefork a2enmod mpm_prefork php7.4 ;; centos) write_fpm_bridge_conf # 生成 httpd 到 php-fpm 的转发配置 ;; kylin) : # 原生 mod_php默认配置即可 ;; esac } detect_os map_packages lamp_install lamp_config systemctl enable --now $APACHE_SVC $DB_SVC 2$LOG || trueDEBIAN_FRONTENDnoninteractive是把 apt 的交互式提问压掉的关键参数比如 MariaDB 装包时偶尔弹出的配置对话框没有这个环境变量脚本会卡死在等待输入。CentOS 分支里的modify_yum_source和write_fpm_bridge_conf是函数占位具体实现放在第四章按系统展开。最后的systemctl enable --now同时完成开机自启和立即启动注意|| true的容错新装环境里 httpd 因为缺少配置启动失败并不少见脚本在这里直接退出的话用户反而看不到后面的完整诊断信息。3.3 服务自启与状态确认让脚本收尾干净check_all() { echo 服务状态 $LOG systemctl is-active $APACHE_SVC $LOG || true systemctl is-active $DB_SVC $LOG || true echo 端口监听 $LOG ss -lntup | grep -E :80|:3306 $LOG || true } lamp_install check_all端口检查用 ss 而不是 netstat因为新版系统里 netstat 往往没装。:80表示 Apache 对外服务:3306表示 MariaDB 监听如果 3306 只出现在 127.0.0.1 上说明 MariaDB 默认只允许本机连接需要远程访问的场景要额外改 bind-address 和账号授权。这一步的意义在于把“装完是否成功”的判断交给日志而不是肉眼脚本跑完直接看尾部就知道环境是不是真的可用了。4. 三个系统的差异化配置源、PHP 形态与 Apache 参数主框架搭好后最容易让人反复折腾的是每个系统的差异化细节。这章把三个分支的完整命令给出并解释每个参数为什么这么写。4.1 Ubuntu 24PHP 7.4 的 PPA 与 Apache MPM 切换# 1) 可选把 apt 源换成访问更快的镜像站 # sed -i s|http://archive.ubuntu.com|https://你的镜像站|g /etc/apt/sources.list # 2) 添加 PHP 7.4 社区 PPA 并安装 export DEBIAN_FRONTENDnoninteractive apt-get install -y software-properties-common add-apt-repository -y ppa:ondrej/php apt-get update apt-get install -y apache2 libapache2-mod-php7.4 php7.4 php7.4-mysql # 3) 切换 MPM 并挂载 PHP 模块 a2dismod mpm_event a2enmod mpm_prefork a2enmod php7.4 # 4) 重启并核验 systemctl restart apache2 apache2ctl -M | grep php第三组命令是整个 Ubuntu 分支的核心。libapache2-mod-php7.4 安装后模块本身会注册但 MPM 如果不从 event 切到 preforkApache 启动就会报错或行为异常所以 a2dismod 和 a2enmod 的顺序不能反。切完模块后apache2ctl -M输出里出现 php7.4 字样才算真正生效。另外提醒一句如果是新装系统先单独跑一次apt-get update确认基础源通得过再执行 add-apt-repository否则 PPA 添加成功后 update 阶段报的错会被误判成源的问题排查起来很绕。4.2 CentOS 7归档源与 PHP 7.4 仓库的组合操作# 1) CentOS 7 官方源已下线把 baseurl 切到归档地址并固定版本号 sed -e s|^mirrorlist|#mirrorlist| \ -e s|^#baseurlhttp://mirror.centos.org/centos/$releasever|baseurlhttp://vault.centos.org/7.9.2009| \ /etc/yum.repos.d/CentOS-Base.repo yum clean all yum makecache # 2) 装 EPEL 与 PHP 7.4 系列包 yum install -y epel-release yum install -y httpd php74-php php74-php-mysqlnd php74-php-fpm mariadb-server # 3) 生成 httpd 到 php-fpm 的转发配置 cat /etc/httpd/conf.d/php74-fpm.conf EOF FilesMatch \.php$ SetHandler proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost /FilesMatch EOF # 4) 启动服务 systemctl enable --now httpd php74-php-fpm mariadb第一步 sed 是 CentOS 7 必做的“续命操作”。官方仓库下线后原来的 mirrorlist 指向的域名全部失效必须改用归档地址第二个替换把$releasever换成 7.9.2009 是有意为之因为归档目录只按具体版本号存放让 yum 自己去展开$releasever会得到“7”而不是“7.9.2009”结果就是 404。装完 php74-php-fpm 后要确认 FPM 的 socket 文件路径与配置里写的一致Remi 系包默认就是这个路径如果自定义过 FPM 监听方式FilesMatch 里的路径必须同步改。这里用 heredoc 写入配置文件包住内容避免 shell 展开变量是写脚本时容易漏的细节。4.3 Kylin V10优先原生仓库注意 yum/dnf 并存# 1) 用原生源安装不引入第三方仓库 yum install -y httpd php php-mysqlnd mariadb-server # 2) 确认 PHP 实际版本避免 SP 差异带来的版本不符 php -v | head -1 # 3) 启动并检查 Apache 是否加载了 PHP 模块 systemctl enable --now httpd mariadb httpd -M 2/dev/null | grep phpKylin V10 存在 yum 和 dnf 两套命令并存的情况脚本里统一用 yum 兼容性更好。装完立刻php -v核验小版本是因为 V10 不同 SP 的仓库里 PHP 版本可能停在 7.2 或 7.4如果业务代码用了 7.4 才有的语法这一步能提前暴露问题而不是等到页面报错再回头查。Kylin 分支建议别引入第三方源麒麟自带的源维护节奏和 CentOS 不同混用容易碰到依赖冲突。如果原生源里的 PHP 版本确实不满足我一般直接建议换容器方案而不是在这个系统上硬编第三方 PHP 源。5. 五个典型翻车点从空白页到 SELinux 的排查清单脚本本身不难难的是装完之后各种“看着都对就是跑不起来”的玄学现场。这章列五个我实际踩过、且非常典型的坑每个按现象、原因、解决的顺序来。5.1 装完访问 .php 文件页面空白或直接下载现象curl 首页返回 HTML 正常访问 info.php 要么白屏要么浏览器提示下载文件。原因Apache 根本没有解析 PHP模块没加载或者 MPM 与 mod_php 冲突被 Apache 静默降级。解决先apache2ctl -M | grep phpCentOS 用 httpd -M确认模块在不在再查 MPMUbuntu 上执行apache2ctl -M | grep mpm如果是 event 而你又用的 mod_php执行 a2dismod mpm_event 和 a2enmod mpm_prefork 后重启。CentOS 走 php-fpm 的话检查 httpd 的 error_log 里有没有 “Connection refused” 指向 socket 路径路径对不上就改 FilesMatch。5.2 mysql -uroot 登录总报 Access denied现象mysql -uroot -p输入安装时设的密码或空密码全部被拒。原因MariaDB 10.4 之后的 Debian/Ubuntu 系默认给 root 配了 unix_socket 认证只能在系统 root 用户下执行sudo mysql进入CentOS 系则常见为安装后 root 密码为空但只允许本地 socket。解决用sudo mysql进库显式建业务账号别折腾 rootCREATE USER webuserlocalhost IDENTIFIED BY 强密码; GRANT ALL PRIVILEGES ON *.* TO webuserlocalhost; FLUSH PRIVILEGES;一键脚本的教训是永远不要在脚本里给 root 设空密码否则安全审计那关过不去。5.3 CentOS 7 的 yum makecache 报 404 或 Could not resolve host现象脚本跑在 yum makecache 时报错提示无法解析主机或 404。原因停维后官方域名部分路径失效且当前网络环境里 DNS 解析不到原 mirrorlist 的地址。解决按 4.2 的 sed 把源改成归档地址并固定版本号然后yum clean all yum makecache验证如果还报 fastestmirror 插件相关错误用yum --disablerepofastestmirror makecache绕开。这一步做完再跑安装后续错误会明显变少。5.4 CentOS 7 上页面 502SELinux 悄悄拦截现象php-fpm 和 httpd 都显示 active但访问 .php 返回 502error_log 里有 Permission denied。原因SELinux 默认策略不允许 httpd 进程连接 php-fpm 的 unix socket属于策略层面拦截不是权限位问题。解决先临时放行验证再永久生效setsebool -P httpd_can_network_connect 1 restorecon -Rv /var/opt/remi/php74/run 2/dev/null || true这类问题最耗时的就是“看起来一切正常就是不通”所以排查顺序一定是先看 error_log 再看 SELinux而不是反复重启服务。5.5 本机 curl 正常外网就是访问不到 80 端口现象服务器上 curl localhost 返回正常外网访问超时或拒绝。原因firewalldCentOS/Kylin或 ufwUbuntu默认不放行 80少部分云环境还要额外看安全组策略。解决本机先确认监听再放行防火墙ss -lntup | grep :80 firewall-cmd --permanent --add-servicehttp firewall-cmd --reload ufw allow 80/tcp注意 Kylin 上 firewalld 和 iptables 服务可能同时存在放行要用实际生效的那一套避免这边加完那边没生效的乌龙。6. 装完先别交工用一组命令做最终验收脚本跑通不等于环境合格我习惯在交付前用固定一套命令把三件事验收掉版本对不对、模块挂没挂、数据库能不能连。验证点命令Ubuntu 下期望结果PHP 版本php -v输出包含 7.4 的小版本Apache 加载 PHPapache2ctl -M能看到 php7.4 模块MariaDB 版本mysql -e SELECT VERSION();输出版本号且无报错服务存活systemctl is-active apache2 mariadb两个都输出 active验收完临时放一个探针文件再删掉是最快的端到端检查在网站根目录写一个只含?php phpinfo();的文件curl 请求返回 200 且输出 PHP 信息确认后马上删除。这个文件属于高危残留忘了删等于把服务器信息页暴露在公网我不止一次见过有人栽在这上面。验收通过后做三个低成本加固Apache 配置里把 ServerTokens 设为 Prod隐藏版本细节默认站点去掉 Indexes 权限防止目录列表泄露然后跑一遍mysql_secure_installation处理匿名用户和测试库。再养成一个习惯——把改过的配置目录/etc/httpd 或 /etc/apache2、/etc/my.cnf打包备份。一键脚本的价值是让环境可重建配置备份则保证重建后行为可复现这两件事配合起来才是长期不翻车的底气。这套方案本身不复杂核心就是把“系统差异”老老实实写进脚本分支不在安装阶段偷懒。跟着本文把三个分支各跑一遍你会对生产环境里的版本搭配心里有数下次再被拉去救火时也能少走弯路希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑