Ubuntu 22.04 Server / 如何安装 Apache、PHP 和 MariaDB
在 Ubuntu 22.04 Server 中,安装 Apache、PHP 的 Apache 模块、MariaDB 和 PHP 数据库扩展即可搭建基本的 Web 运行环境。安装后应将 MariaDB 管理员账户与 Web 应用账户分开,并检查 PHP 是否能够读取数据库中的值。
适用范围与软件包准备
本文在一台新服务器上使用 Ubuntu 22.04 默认软件源,同时运行 Apache 和 MariaDB。需要 sudo 权限以及用于下载软件包的互联网连接。对于已有服务器,请先备份 Web 配置和数据库,并检查示例中的文件、账户和数据库名称是否已被使用。如果已经采用 PHP-FPM,请勿将本文的 Apache 模块配置混入现有环境。
- 更新软件包索引并安装所需组件。
libapache2-mod-php负责在 Apache 内处理 PHP,php-mysql提供连接 MariaDB 所需的扩展。同时安装php-cli,用于命令行检查。可参阅 Ubuntu 的 PHP 安装文档了解此配置方式。
sudo apt update
sudo apt install apache2 mariadb-server php php-cli libapache2-mod-php php-mysql
- 启动服务并设置开机自启。确认 Apache 配置检查显示
Syntax OK后,重启 Apache 以加载 PHP 模块。
sudo systemctl enable --now apache2 mariadb
sudo apache2ctl configtest
sudo systemctl restart apache2
systemctl is-active apache2 mariadb
最后一条命令会为每个正在运行的服务显示 active。使用 apache2 -v、php -v 和 mariadb --version 查看已安装版本。添加过其他软件源的服务器可能安装与默认源不同的 PHP 版本。
检查 MariaDB 管理员身份验证
Ubuntu 默认 MariaDB 软件包通常为本地管理操作使用 Unix 套接字身份验证。该方式检查操作系统用户身份,并不意味着任何人都能用空 root 密码连接。首先通过以下命令打开管理员会话,检查当前账户和配置。
sudo mariadb --protocol=socket
SELECT VERSION(), CURRENT_USER();
SHOW CREATE USER 'root'@'localhost';
EXIT;
已有系统的 root 验证方式可能不同。本文按照 MariaDB 10.4 起的身份验证说明,保留套接字验证,并创建独立的应用账户。不要直接 UPDATE mysql.user 的 plugin 值,也不要让 Web 应用使用 root 账户。
可使用以下工具检查首次安装的安全设置。提示内容和顺序会因版本及当前配置而异,请勿机械地对所有问题回答 Y。
sudo mariadb-secure-installation
- 如果已经通过套接字验证进行管理,可以保留这种方式。MariaDB 官方工具文档说明,在此配置下通常不必另设 root 密码。
- 对于新服务器,适合删除匿名用户和不需要的 test 数据库,并限制远程 root 登录。已有服务时,请先确认是否正在使用相关内容再决定;出现重新加载权限表的提示时,应使更改生效。
创建应用专用数据库和账户
再次使用 sudo mariadb --protocol=socket 连接并执行以下 SQL。lampdemo 和 lamp_app 是本次练习新建的名称。如果已经存在,请另选名称并同步修改后续示例,不要覆盖或删除原有对象。将密码占位符替换为较长且唯一的密码,并在 PHP 配置中使用相同值。如果密码包含单引号,必须分别遵循 SQL 和 PHP 的字符串转义规则。
CREATE DATABASE lampdemo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lamp_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON lampdemo.* TO 'lamp_app'@'localhost';
CREATE TABLE lampdemo.health_check (
id INT PRIMARY KEY,
message VARCHAR(100) NOT NULL
);
INSERT INTO lampdemo.health_check (id, message) VALUES (1, 'database-ok');
EXIT;
由管理员创建表,仅向应用授予此数据库的查询、插入、更新和删除权限。若应用安装程序要求建表权限,应另行评估所需权限。通过 GRANT 授权后,无需另行执行 FLUSH PRIVILEGES。
在终端使用应用账户查询,检查是否出现 database-ok。不要把密码写在 -p 后面,而应在提示时输入。
mariadb --protocol=socket -u lamp_app -p lampdemo -e "SELECT message FROM health_check WHERE id=1;"
创建 PHP 联动示例文件
Ubuntu Apache 默认站点的 Web 文档目录通常为 /var/www/html。如果使用已有虚拟主机,请通过 sudo apache2ctl -S 和对应站点的 DocumentRoot 设置确定示例 Web 文件路径。若下列文件已存在,请使用其他名称。含密码的配置文件应保存在 Web 文档目录之外。
- 创建配置目录并打开编辑器。以下权限以 Apache 使用 Ubuntu 默认用户和组
www-data运行为前提。
sudo install -d -o root -g www-data -m 0750 /etc/lamp-demo
sudoedit /etc/lamp-demo/database.php
将以下完整内容保存到 /etc/lamp-demo/database.php,把 password 值改为前面设置的应用密码。正如 PHP 的 PDO_MYSQL 连接文档所述,Unix 环境中的 host=localhost 使用套接字连接。改成 127.0.0.1 会使用 TCP,账户匹配和连接条件可能随之改变。
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=lampdemo;charset=utf8mb4',
'user' => 'lamp_app',
'password' => 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD',
];
- 配置文件归 root 所有,仅允许所有者与 Apache 组读取。然后打开 Web 检查文件。
sudo chown root:www-data /etc/lamp-demo/database.php
sudo chmod 0640 /etc/lamp-demo/database.php
sudoedit /var/www/html/lamp-check.php
将以下完整内容保存到 /var/www/html/lamp-check.php。PDO(PHP Data Objects)是 PHP 访问数据库的接口。此代码检查表中的实际值后才输出成功消息;失败时返回 HTTP 500 和通用错误提示,并将详细原因写入服务器日志。
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=UTF-8');
try {
$config = require '/etc/lamp-demo/database.php';
$pdo = new PDO($config['dsn'], $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$message = $pdo->query('SELECT message FROM health_check WHERE id = 1')->fetchColumn();
if ($message !== 'database-ok') {
throw new RuntimeException('Unexpected database result');
}
echo "PHP OK\nDatabase OK\n";
} catch (Throwable $e) {
http_response_code(500);
error_log('lamp-check failed: ' . $e->getMessage());
echo "Check failed; review server logs.\n";
}
- 为 Web 检查文件设置可读权限,并检查两个文件的 PHP 语法。
No syntax errors detected仅表示语法检查通过,并不证明数据库连接成功。
sudo chown root:root /var/www/html/lamp-check.php
sudo chmod 0644 /var/www/html/lamp-check.php
sudo php -l /etc/lamp-demo/database.php
php -l /var/www/html/lamp-check.php
普通用户可能无权读取配置文件,因此使用 sudo 检查其语法。无需给整个 Web 目录授予写权限,也不需要使用 chmod 777。
验证 HTTP 响应和数据库连接
在服务器本机请求以下地址。如果没有 curl,可执行 sudo apt install curl 安装。HTTP 状态为 200 且响应正文出现以下两行,表示 Apache 已执行 PHP,而 PHP 已读取 MariaDB 中的示例记录。
curl -i http://127.0.0.1/lamp-check.php
PHP OK
Database OK
在其他计算机的浏览器中输入 http://SERVER-IP/lamp-check.php。虚拟主机应使用已配置的主机名。仅看到默认欢迎页或执行 php -v,不能证明此联动正常。
若本机可访问而其他计算机无法连接,请检查 sudo ufw status verbose、云安全组和路由。对于 UFW 已启用的私有练习网络,可用以下规则仅向目标子网开放 HTTP 80 端口。将示例 192.168.10.0/24 换为自己的可信子网。不要为此测试关闭防火墙,也不要在尚未放行远程 SSH 时贸然启用防火墙。
sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
此配置中,PHP 和 MariaDB 通过同一服务器上的套接字通信,因此无需向外开放 3306 端口。请在可信环境中进行 HTTP 练习;在生产环境传输登录信息等数据之前,还应另外配置域名、虚拟主机和 HTTPS 证书。
排查错误并清理测试内容
连接失败时,依次检查服务状态、PHP 模块、账户和文件权限,逐步缩小范围。以下命令用于查看 Apache 配置、模块及两个服务的近期日志。日志可能含有运维信息,请勿未经检查便原样公开。
sudo apache2ctl configtest
sudo apache2ctl -M
sudo tail -n 50 /var/log/apache2/error.log
sudo journalctl -u apache2 -u mariadb -n 50 --no-pager
- 显示或下载 PHP 源码:停止公开访问,首先检查 Apache 的 PHP 模块是否启用、Apache 是否已经重启。若安装
libapache2-mod-php后仍有问题,也要检查已有 PHP-FPM 和虚拟主机配置。 - could not find driver:确认已安装并启用与 Apache 所用 PHP 版本对应的
php-mysql扩展,然后重启 Apache。命令行 PHP 与 Apache PHP 的配置可能不同。 - Access denied:检查应用密码、
'lamp_app'@'localhost'账户及其权限。不要通过修改 root 验证或授予全局权限来绕过问题。找不到套接字时,对比 MariaDB 的SHOW VARIABLES LIKE 'socket';结果与 PHP 套接字设置。 - Permission denied 或 404:确认 Apache 用户能够读取配置文件,且 Web 文件位于请求站点的 DocumentRoot 中。也应检查
/etc/lamp-demo的目录访问权限。
检查完成后,使用以下命令仅删除本文新建的 Web 测试文件,并确认相同地址不再返回成功消息。也不要保留已有的 phpinfo.php 等公开环境信息的文件。若真实应用仍使用配置文件,应继续将其置于 Web 目录外,并保留受限权限。
sudo rm -- /var/www/html/lamp-check.php
如果还要清理练习数据,请先确认没有其他服务使用,再在管理员会话执行以下 SQL。删除数据库无法撤销,所需数据应先备份。仅对本次练习新建的名称执行。
DROP DATABASE lampdemo;
DROP USER 'lamp_app'@'localhost';
同一服务器部署应保留 MariaDB 的本地绑定设置。即使另外需要远程数据库访问,也不要直接删除 bind-address;应综合规划监听地址、允许的来源、专用账户和加密连接。



