CentOS 从零搭建 LAMP 环境完整实战指南

本文基于真实操作流程整理,完整记录 CentOS Stream 9 系统下 LAMP(Linux + Apache + MariaDB + PHP)环境的搭建全过程,包含换源踩坑、数据库配置、权限处理、远程连接验证等关键环节,既适合网页开发环境搭建,也可作为 Web 漏洞靶场的基础环境。

一、环境与准备

1.1 适用场景

  • 本地虚拟机搭建 Web 学习与开发环境

  • 部署 SQL 注入、XSS 等经典 Web 漏洞靶场

  • 练习 Linux 服务器运维与 PHP 全栈开发

1.2 系统与工具

类别 说明
服务器系统 CentOS Stream 9
包管理器 dnf(yum 为软链接兼容)
本地工具 VS Code(远程开发)、Navicat(数据库管理)、Chrome/Edge 浏览器
网络模式 桥接模式,虚拟机与物理机同局域网可直接互访

1.3 核心说明

CentOS 9 默认自带 PHP 8.x 版本,对 DVWA、SQLi-Labs 等经典老旧靶场兼容性较差,因此我们手动安装 PHP 7.4 版本;数据库采用 MariaDB,与 MySQL 完全协议兼容,命令、端口、驱动通用。

二、系统基础配置

2.1 切换 root 权限

所有系统级配置均需 root 权限,普通用户执行以下命令切换:

复制代码
su - root

输入 root 密码后,提示符变为 # 即为成功。

2.2 关闭 SELinux

SELinux 是 CentOS 的强制访问控制机制,默认开启会拦截 Apache 对网页文件的读取,极易造成 403 错误,靶场学习环境建议永久关闭。

  1. 临时关闭(立即生效,重启失效)
复制代码
setenforce 0
  1. 永久关闭(重启后生效) 编辑配置文件:
复制代码
vi /etc/selinux/config

SELINUX=enforcing 修改为:

复制代码
SELINUX=disabled

保存退出后执行 reboot 重启系统。

!新手提示:vi 编辑器按 i 进入编辑模式,修改完按 Esc,输入 :wq 回车保存退出;输错了按 Esc 输入 :q! 强制退出不保存。

2.3 软件源换源踩坑与处理

国内网络下,官方源下载速度较慢,通常会替换为阿里云等国内镜像源,但实际操作中容易出现版本路径不匹配的问题。

踩坑过程

执行 curl 下载阿里云 CentOS Stream 9 源配置文件:

复制代码
curl -o /etc/yum.repos.d/CentOS-Stream-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-Stream-9-BaseOS.repo
curl -o /etc/yum.repos.d/CentOS-Stream-AppStream.repo https://mirrors.aliyun.com/repo/Centos-Stream-9-AppStream.repo

执行 dnf makecache 刷新缓存时出现警告:

复制代码
警告:加载 '/etc/yum.repos.d/CentOS-Stream-AppStream.repo' 失败,跳过。
警告:加载 '/etc/yum.repos.d/CentOS-Stream-BaseOS.repo' 失败,跳过。
原因与解决方案

原因是阿里云镜像路径更新,旧模板中的变量解析失效,导致源地址无效。对于一次性搭建环境的场景,最简方案是删除失效源,继续使用系统默认官方源:

复制代码
rm -f /etc/yum.repos.d/CentOS-Stream-BaseOS.repo
rm -f /etc/yum.repos.d/CentOS-Stream-AppStream.repo
dnf makecache

执行后无报错,元数据缓存建立成功,后续安装可正常进行。

!如果需要长期使用、频繁安装软件,可以手动写入固定路径的阿里云源配置;仅搭建一次靶场环境,默认源完全够用。

三、安装 PHP 7.4 软件源

3.1 为什么选择 PHP 7.4

绝大多数经典 Web 漏洞靶场开发于 PHP 5.x/7.x 时代,高版本 PHP 会废弃大量旧语法,导致靶场功能异常、漏洞无法复现。Remi 源是业内最成熟的 PHP 多版本管理源。

3.2 安装 EPEL 与 Remi 源

复制代码
dnf install -y epel-release
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm

3.3 切换 PHP 版本为 7.4

重置系统默认 PHP 模块,启用 Remi 源的 PHP 7.4:

复制代码
dnf module reset php -y
dnf module enable php:remi-7.4 -y

四、一键安装 LAMP 全栈

4.1 组件说明

组件 作用
openssh-server SSH 服务,支持远程命令行与 VS Code 远程开发
httpd Apache 网页服务器,处理 HTTP 请求
mariadb-server MariaDB 数据库服务,存储网站与靶场数据
mariadb 数据库客户端命令行工具
php PHP 脚本解析器
php-mysqlnd PHP 连接数据库的驱动扩展
php-gd / php-mbstring / php-curl 靶场常用功能依赖扩展
unzip、wget 下载解压靶场源码工具

4.2 执行安装

复制代码
dnf install -y openssh-server httpd mariadb-server mariadb php php-mysqlnd php-gd php-mbstring php-curl php-xml php-zip unzip wget

等待命令执行完成,无报错即为安装成功。

五、服务管理与开机自启

执行以下命令同时完成「立即启动」和「开机自启」:

复制代码
systemctl enable --now sshd
systemctl enable --now httpd
systemctl enable --now mariadb

输出 Created symlink 即为设置成功,可通过以下命令查看运行状态:

复制代码
systemctl status httpd
systemctl status mariadb

显示 active (running) 代表服务正常运行。

六、防火墙端口配置

CentOS 9 默认启用 firewalld 防火墙,需手动放行对应端口,否则外部无法访问网页和数据库。

复制代码
# 放行 SSH 22端口
firewall-cmd --permanent --add-service=ssh
# 放行 HTTP 80端口
firewall-cmd --permanent --add-service=http
# 放行数据库 3306端口
firewall-cmd --permanent --add-port=3306/tcp
# 重载规则使配置生效
firewall-cmd --reload

--permanent 表示永久生效,重启防火墙不丢失;不加该参数仅临时生效,重启后失效。

七、网站目录权限配置

Apache 默认以 apache 用户身份运行,若网页文件所有者为 root,会出现 403 禁止访问错误。

复制代码
# 设置目录所有者为 apache 用户组
chown -R apache:apache /var/www/html
# 设置目录权限为 755
chmod -R 755 /var/www/html

Apache 默认网站根目录为 /var/www/html,所有网页、PHP 文件、靶场源码都必须放在该目录下,才能通过浏览器访问。

八、MariaDB 数据库初始化与远程授权

8.1 执行安全初始化脚本

MariaDB 安装完成后 root 默认无密码,执行安全初始化脚本进行基础配置:

复制代码
mysql_secure_installation
交互步骤与推荐选项
  1. Enter current password for root (enter for none): 直接回车,初始无密码

  2. Switch to unix_socket authentication [Y/n] 输入 n,使用传统密码登录

  3. 复制代码
    Change the root password? [Y/n]

    输入 Y,设置数据库 root 密码

    踩坑提示:Linux 终端输入密码时不会显示任何字符 ,属于盲打,两次输入必须完全一致,否则会提示 passwords do not match。靶场学习建议设置简单密码如 123456

  4. Remove anonymous users? [Y/n] 输入 Y,删除匿名用户

  5. Disallow root login remotely? [Y/n] 输入 n,允许 root 远程登录(Navicat 远程连接需要)

  6. Remove test database and access to it? [Y/n] 输入 Y,删除测试库

  7. Reload privilege tables now? [Y/n] 输入 Y,刷新权限立即生效

出现 Thanks for using MariaDB! 即为初始化完成。

8.2 开启 root 账号远程访问权限

初始化默认仅允许本地登录数据库,需手动授权任意 IP 访问:

  1. 登录数据库命令行
复制代码
mysql -uroot -p

输入数据库 root 密码,出现 MariaDB [(none)]> 提示符即为登录成功。

  1. 执行授权 SQL
复制代码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
exit;
  • *.* 代表所有库所有表

  • 'root'@'%' 代表 root 账号可从任意 IP 登录

  • 密码替换为你自己设置的数据库 root 密码

九、远程工具连接验证

9.1 获取虚拟机 IP

执行命令查看服务器 IP:

复制代码
ip a

找到网卡(通常为 ens33)下的 inet 地址,例如 192.168.6.132,后续所有访问都使用该 IP。

9.2 Naicat 远程连接数据库

打开 Navicat,新建连接,选择 MySQL 类型(MariaDB 完全兼容,选 MySQL 即可):

  • 主机名:192.168.6.132

  • 端口:3306

  • 用户名:root

  • 密码:数据库 root 密码

点击测试连接,提示连接成功后保存,即可图形化管理数据库、查看表数据、执行 SQL。

9.3 浏览器测试网页服务

访问 http://192.168.6.132,出现 CentOS 默认的 Apache 测试页面,说明网页服务正常运行。

十、全链路功能验证

10.1 验证 PHP 解析

创建 PHP 探针文件:

复制代码
echo '<?php phpinfo(); ?>' > /var/www/html/phpinfo.php

浏览器访问 http://192.168.6.132/phpinfo.php,出现 PHP 信息详情页,说明 PHP 解析正常,可查看 PHP 版本、已安装扩展等信息。

10.2 验证 PHP 数据库查询

创建测试数据库与测试表,验证 PHP 到数据库的完整链路:

  1. 数据库内创建测试库与测试数据
复制代码
CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8mb4;
USE test;
​
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);
​
INSERT INTO users (username, password, email) VALUES
('admin', 'admin123', 'admin@test.com'),
('user1', 'pass123', 'user1@test.com'),
('user2', '123456', 'user2@test.com');
  1. 创建 PHP 查询页面
复制代码
tee /var/www/html/test_db.php << 'EOF'
<?php
$host = 'localhost';
$user = 'root';
$pass = '123456';
$dbname = 'test';
​
$conn = mysqli_connect($host, $user, $pass, $dbname);
if (!$conn) {
    die('连接失败:' . mysqli_connect_error());
}
echo '<h2>√ 数据库连接成功</h2>';
​
$sql = "SELECT * FROM users";
$result = mysqli_query($conn, $sql);
​
echo '<table border="1" cellpadding="8">';
echo '<tr><th>ID</th><th>用户名</th><th>密码</th><th>邮箱</th></tr>';
while ($row = mysqli_fetch_assoc($result)) {
    echo "<tr>
        <td>{$row['id']}</td>
        <td>{$row['username']}</td>
        <td>{$row['password']}</td>
        <td>{$row['email']}</td>
    </tr>";
}
echo '</table>';
​
mysqli_close($conn);
?>
EOF

浏览器验证 访问 http://192.168.6.132/test_db.php,页面显示数据库连接成功,且表格中完整展示 3 条用户数据,代表 Web → PHP → 数据库 整条链路完全通畅。

十一、环境总结

至此,CentOS Stream 9 下的 LAMP 环境已全部搭建并验证完成,核心状态如下:

√ Apache 网页服务正常,80 端口对外可访问

√ PHP 7.4 运行正常,兼容各类经典 PHP 靶场

√ MariaDB 数据库稳定运行,支持本地与远程连接

√ 防火墙端口配置正确,SSH、HTTP、数据库服务均放行

√ 核心服务全部设置开机自启

√ 支持 Navicat 图形化管理数据库

安全提示:该环境为本地学习用途,包含弱口令与漏洞环境,禁止直接暴露到公网,避免被恶意攻击。

相关推荐
赋创小助手39 分钟前
多GPU服务器交付验收:GPU健康、P2P、NCCL与稳定性测试思路
运维·服务器·人工智能·ai·部署·gpu·p2p
xiaoye-duck43 分钟前
《Linux 网络编程》深入理解 TCP 协议(三):TCP 报头六大标志位详解
linux·网络·tcp
蓝速科技1 小时前
口岸政务窗口双屏翻译机落地应用指南
运维·数据结构·数据库·人工智能·科技·政务
运维全栈笔记1 小时前
运维技术网址大全 DevOps 官方资源导航
运维·devops
阿标在干嘛1 小时前
Nginx一个配置错误,流量损失30%!这是我们的完整排查记录
运维·nginx
Android系统攻城狮1 小时前
Linux Gstreamer深度解析之gst_audio_channel_positions_to_mask调用流程与实战(十七)
linux·运维·服务器·gstreamer音视频·音视频进阶
hanbo17C21 小时前
企业官网能不能看出公司实力?选建站公司前,先看这6条硬标准
运维·服务器·前端
小程序设计1 小时前
基于某数据管理系统的目标遍历漏洞成因与防御设计技术与实现
运维·网络
33三 三like1 小时前
Jiangxi
linux·运维·服务器