本文是一篇可操作的 LAMP 架构演练,目标是在 Linux 云主机上完成 Apache、PHP 和 MySQL 的安装、配置、验证、安全加固、备份和故障定位。命令以 Debian/Ubuntu 风格为例,不同发行版的包名可能不同。

一、LAMP 适合什么场景
LAMP 由 Linux、Apache、MySQL、PHP 组成,适合传统 PHP 网站、WordPress、企业门户、内容管理系统和学习型云主机环境。
它的优点是资料丰富、组件成熟、社区经验多。局限是默认配置往往不适合生产,高并发、复杂缓存、弹性扩缩容和多地域容灾需要额外架构设计。
二、演练前准备
准备一台云主机,至少明确:
- Linux 发行版和版本。
- 公网 IP 或内网访问地址。
- SSH 登录方式。
- 安全组是否放行 22、80 和 443 端口。
- 域名 DNS 是否指向主机。
- 是否已经规划数据盘、备份位置和监控。
生产环境不建议直接使用 root 进行所有操作,应创建普通运维用户,并通过 sudo 执行管理命令。
三、系统初始化
bash
sudo apt update
sudo apt upgrade -y
sudo timedatectl set-timezone Asia/Shanghai
sudo adduser deploy
sudo usermod -aG sudo deploy
配置 SSH 公钥登录后,再考虑关闭密码登录和限制 root 远程登录。修改 SSH 配置后务必保留当前会话,并用新窗口验证新连接,避免把自己锁在服务器外。
四、安装 Apache
bash
sudo apt install -y apache2
sudo systemctl enable --now apache2
sudo systemctl status apache2
验证本机服务:
bash
curl -I http://127.0.0.1
如果本机访问成功而公网访问失败,优先检查云安全组、防火墙和路由,而不是反复重装 Apache。
五、安装 PHP 与模块
bash
sudo apt install -y php libapache2-mod-php php-mysql php-curl \
php-mbstring php-xml php-zip php-gd
sudo systemctl restart apache2
php -v
PHP 模块要按应用需要安装,不能无依据安装大量扩展。生产环境应固定 PHP 主版本,并确认应用框架与扩展兼容。
创建测试页:
bash
echo '<?php echo "LAMP OK"; ?>' | \
sudo tee /var/www/html/index.php
访问 http://服务器IP/index.php,确认页面返回 LAMP OK。验证完成后应删除测试文件,避免暴露运行信息。
六、安装和初始化 MySQL
bash
sudo apt install -y mysql-server
sudo systemctl enable --now mysql
sudo mysql_secure_installation
生产数据库不应直接使用 root 给应用连接。创建独立数据库和账号:
sql
CREATE DATABASE appdb DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'change-this-password';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX
ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
权限应根据应用实际需求收敛。只有确实需要时才授予 DROP、CREATE USER 或全库权限。
七、编写 PHP 数据库连接测试
php
<?php
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=appdb;charset=utf8mb4',
'appuser',
getenv('DB_PASSWORD'),
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
echo 'Database connection OK';
不要把真实密码直接写进公开目录中的 PHP 文件。生产应用应通过环境配置、密钥管理或受控配置文件注入密码,并避免在异常页面显示连接字符串。
八、配置 Apache 虚拟主机
apache
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/app/public
<Directory /var/www/app/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/app-error.log
CustomLog ${APACHE_LOG_DIR}/app-access.log combined
</VirtualHost>
启用站点:
bash
sudo a2ensite app.conf
sudo a2enmod rewrite
sudo apachectl configtest
sudo systemctl reload apache2
apachectl configtest 是上线前必做步骤。配置文件有语法错误时不要直接 reload 生产服务。
九、HTTPS 与域名
域名解析生效后,使用证书工具申请并配置 HTTPS。配置完成后检查:
- 证书域名是否匹配。
- 证书链是否完整。
- HTTP 是否跳转 HTTPS。
- 自动续期是否可用。
- 续期后 Apache 是否正确 reload。
不要把证书私钥放在公开 Web 目录,也不要在日志和工单中传播私钥内容。
十、目录权限与安全加固
应用目录应遵循最小权限原则。Web 进程需要读取代码,只有上传、缓存和日志目录才可能需要写权限。
建议:
- 删除默认欢迎页和测试脚本。
- 禁止访问
.env、.git、备份压缩包和配置文件。 - 上传目录禁止执行脚本。
- 关闭 PHP 错误详情在生产页面显示。
- 限制上传文件类型、大小和存储路径。
- 关闭不必要的 Apache 模块。
- 使用防火墙和安全组限制数据库访问。
- 定期更新系统、Apache、PHP 和 MySQL。
十一、日志、监控和排障
Apache 日志:
bash
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/error.log
服务状态:
bash
systemctl status apache2
systemctl status mysql
ss -lntp
排查顺序建议是:DNS -> 云安全组 -> 主机防火墙 -> Apache 监听 -> 虚拟主机 -> PHP 模块 -> 文件权限 -> MySQL 连接 -> 应用日志。
典型故障
- 403:目录权限、Directory 配置或访问规则问题。
- 404:DocumentRoot、Rewrite 或路由配置问题。
- 500:PHP 语法、扩展、权限或应用异常。
- 数据库连接失败:账号、权限、Socket、端口或数据库未启动。
- 页面空白:PHP 错误被隐藏,应查看 Apache 和 PHP 日志。
十二、备份与恢复演练
备份至少包括数据库、上传目录、应用配置、虚拟主机配置和证书配置。数据库备份示例:
bash
mysqldump --single-transaction --routines appdb \
| gzip > /backup/appdb-$(date +%F).sql.gz
恢复演练:
bash
gunzip -c /backup/appdb-2026-10-19.sql.gz \
| mysql appdb
备份文件不应长期只存放在同一台云主机上。应保存到独立存储,并定期验证备份是否可读取、数据库是否能恢复、应用是否能正常启动。
十三、LAMP 性能优化方向
初步优化可以从以下方向开始:
- 启用 Apache 缓存和压缩,但先评估内容类型。
- 使用 PHP OPcache。
- 优化 PHP-FPM 或 Apache worker 配置。
- 为 MySQL 慢查询建立索引和优化 SQL。
- 使用 Redis 或页面缓存降低数据库压力。
- 静态资源使用 CDN。
- 图片和大文件放入对象存储。
- 使用监控数据而不是感觉调整参数。
不要在没有指标的情况下盲目调大进程数、数据库连接数或缓存容量。
十四、架构演练的验收清单
- 云主机可以安全 SSH 登录。
- 80/443 端口按需开放。
- Apache 能返回站点内容。
- PHP 页面可以正常执行。
- PHP 可以使用独立账号连接 MySQL。
- 域名和 HTTPS 正常。
- 日志可以查看并轮转。
- 默认页面和测试文件已删除。
- 数据库和应用目录已经备份。
- 已在隔离环境验证恢复流程。
- 服务器资源和服务状态有监控。
十五、总结
LAMP 架构演练不应止步于"Apache 能打开欢迎页"。一次完整演练需要覆盖系统准备、软件安装、端口、安全、PHP 执行、数据库连接、虚拟主机、HTTPS、日志、备份和恢复。
对于初学者,这套演练可以帮助理解 Web 请求从公网到应用和数据库的完整路径;对于运维人员,它更重要的价值是建立故障排查和恢复思维:每一层都能验证,每一层都有日志,每一层都有明确的安全边界。