跳到主要内容

VPS:搭建 LAMP 环境 - Linux、Apache、MySQL、PHP

本指南是针对以下产品创建的:

(不同供应商的产品可能会有所不同,但主要概念保持不变)

介绍

LAMP 堆栈是一套流行的开源软件组合,通常一起安装,用于简化动态网站托管,特别是针对 PHP 网站和应用。这个缩写代表:Linux 作为操作系统,Apache 作为 Web 服务器,MySQL 作为数据库,最后是 PHP 负责处理。在本指南中,我们将介绍如何在 Linux VPS 上搭建 LAMP 环境,并通过一个待办事项网站的示例进行详细讲解。

准备工作

首先通过 SSH 连接到你的服务器。如果你还不会操作,请查看我们的初始访问(SSH)指南。

本指南使用 Ubuntu 作为 Linux 发行版。Debian 的操作相同,其他发行版可能略有差异,但命令语法大致相似。确保你已安装操作系统并通过 SSH 连接到服务器。

和往常一样,安装前请确保所有软件包都是最新的,执行以下命令:

// Ubuntu & Debian
sudo apt update

// CentOS
sudo yum update

// OpenSUSE
sudo zypper up

// Fedora
sudo dnf upgrade --refresh

安装过程

安装过程可以分为 LAMP 的核心组件,先安装 Apache Web 服务器,再安装 MySQL 数据库,最后安装 PHP。安装过程中,我们会搭建一个用 PHP 编写的测试网站,并访问 MySQL 数据库。所有网页请求最终通过 Apache 服务器处理和响应。

安装 Apache

Apache 是用来处理网页请求并返回响应的 Web 服务器。用下面命令安装:

sudo apt install apache2

安装完成后,确保防火墙规则允许外网访问 Web 服务器。这里我们使用 UFW 防火墙,因为 Apache 已注册了对应的应用配置。

如果你使用其他防火墙,确保开放了 80 端口(HTTP)。想了解更多 Linux 防火墙知识,请参考我们的管理防火墙指南。

确保 UFW 防火墙已启用,并且已创建允许 SSH 的规则:

# 允许 SSH 连接
sudo ufw allow OpenSSH

# 启用 UFW 防火墙
sudo ufw enable
警告

如果你使用 UFW 防火墙,务必先创建允许 SSH 的规则!否则断开当前连接后将无法再次通过 SSH 登录服务器!

接着创建允许 Apache 的规则,并检查规则是否生效:

# 允许 Apache 访问
sudo ufw allow in "Apache Full"

# 查看 UFW 防火墙规则
sudo ufw status
提示

运行 ufw app list 可以查看可用的应用配置。示例中使用的 Apache Full 会同时开放 HTTP(80端口)和 HTTPS(443端口)。

你应该能看到 ApacheApache (v6) 规则状态为 ALLOW,表示防火墙配置正确。还会显示之前设置的其他规则,包括 SSH。

防火墙开放后,确认 Apache 是否正常运行。打开浏览器访问你的 IP 地址,格式为 http://[your_ipaddress]

如果正常,会看到默认欢迎页面。若无法访问,使用命令检查服务状态:systemctl status apache2

安装 MySQL

接下来安装 MySQL 服务器,作为关系型数据库存储数据。执行:

sudo apt install mysql-server

安装完成后,建议运行安全配置脚本,提升 MySQL 实例安全性。虽然可选,但强烈推荐。运行:

sudo mysql_secure_installation

该脚本会引导你完成交互式配置。首先会询问是否启用密码验证插件,建议选择 Y,然后选择密码强度等级,推荐选择 MEDIUM(输入 1)或 STRONG(输入 2)。

接着会询问是否删除匿名用户和禁止 root 远程登录,出于安全考虑,建议都选择 Y

最后会询问是否删除测试数据库并重新加载权限表,建议选择 Y

完成后,尝试登录 MySQL 确认服务运行:

sudo mysql -u root

成功后会显示欢迎信息,输入 quit 退出。

安装 PHP

最后安装 PHP 及其 Apache 和 MySQL 插件,确保 Apache 能处理 PHP,PHP 能访问 MySQL:

sudo apt install php libapache2-mod-php php-mysql

安装完成后,检查 PHP 版本确认安装成功:

php -v
PHP 扩展

高级用例可能需要额外的 PHP 扩展。运行 apt search php- | less 查看可用扩展列表。

用方向键滚动,按 Q 退出。安装扩展用:

sudo apt install [php_extension] [...]

多个扩展用空格分隔,一次安装更快。

建议调整 Apache 的目录索引顺序,让 index.php 优先于默认的 .html。编辑配置文件:

sudo nano /etc/apache2/mods-enabled/dir.conf

在 nano 编辑器中,将 index.php 移到最前面,改成:

DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm

保存并退出(CTRL + X,然后 Y,最后回车),重启 Apache 使配置生效:

sudo systemctl restart apache2

创建测试网站

LAMP 环境搭建完成后,我们创建一个测试网站,演示 LAMP 如何协同工作打造动态网站。完全可选,但有助于理解如何用这些工具搭建自己的网站。

本例创建一个简单的 PHP 待办事项网站,读取并返回待办条目,数据存储在 MySQL 表中,通过 Apache 提供服务。

示例中使用测试域名 zapdocs.example.com,实际使用时请确保为域名设置了指向服务器 IP 的 A 记录。需要帮助请看我们的域名记录指南。

备注

你也可以不使用域名,直接用 IP 访问。此时请在后续创建虚拟主机文件时删除 ServerName 参数。

配置 Apache

通常网站文件存放在 /var/www 目录。默认 Apache 会有一个 html 文件夹,里面是默认页面。为了管理多个网站,建议为每个网站创建独立文件夹。

创建网站目录:

sudo mkdir /var/www/[your_domain]

接着为该域名创建 Apache 虚拟主机配置文件:

sudo nano /etc/apache2/sites-available/[your_domain].conf

复制以下模板,替换 [your_domain] 为你的域名:

<VirtualHost *:80>
ServerName [your_domain]
ServerAlias www.[your_domain]
ServerAdmin webmaster@localhost
DocumentRoot /var/www/[your_domain]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

该配置监听 80 端口请求,匹配 ServerName,并指定网站根目录。

保存退出后,建议用命令检查语法:

sudo apache2ctl configtest

启用新虚拟主机:

sudo a2ensite [your_domain]
无域名使用

如果不使用域名,删除或注释掉 ServerName 行(加 #),并禁用默认虚拟主机:

sudo a2dissite 000-default

重启 Apache 使配置生效:

sudo systemctl restart apache2

创建网站内容

现在配置好了 Apache 和网站目录,开始创建网站文件。当前目录为空,访问时不会显示内容。我们将创建一个简单的待办事项网站。

准备数据库

先登录 MySQL:

sudo mysql -u root

创建数据库和表:

# 创建数据库
CREATE DATABASE todowebsite;

# 选择数据库
USE todowebsite;

# 创建待办事项表
CREATE TABLE todoitems (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
is_completed BOOLEAN DEFAULT FALSE,
creation_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

插入几条示例数据:

INSERT INTO todoitems (name, is_completed) VALUES ('Create ZAP-Docs Guide', 0);
INSERT INTO todoitems (name, is_completed) VALUES ('Buy a ZAP-Hosting Server', 1);
INSERT INTO todoitems (name, is_completed) VALUES ('Join ZAP-Hosting Discord', 0);
INSERT INTO todoitems (name, is_completed) VALUES ('Have a great day!', 0);

创建专用用户:

# 创建用户
# 将 [your_password] 替换为你的密码
CREATE USER todo@localhost IDENTIFIED BY '[your_password]';

# 授权用户权限(复制为一行)
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER
ON todowebsite.*
TO todo@localhost;

# 刷新权限
FLUSH PRIVILEGES;

准备好后,输入 quit 退出 MySQL。

PHP 网站文件

最后创建 PHP 网站文件,放在 /var/www/[your_domain]/index.php

打开编辑器:

sudo nano /var/www/[your_domain]/index.php

复制以下代码,注意替换 [your_password] 为之前设置的密码。

important

务必修改 [your_password] 为你为 todo 用户设置的密码。

<?php
// 准备 MySQL 连接
$servername = "localhost";
$username = "todo";
$password = "[your_password]";
$dbname = "todowebsite";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接是否成功,失败则报错
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

// 执行 SQL 查询,获取待办事项,按创建时间倒序
$sql = "SELECT id, name, is_completed, creation_date FROM todoitems ORDER BY creation_date DESC";
$result = $conn->query($sql);
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF--8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>To-Do List</title>
</head>
<body>
<h1>Awesome To-Do List :D</h1>
<p>For our awesome ZAP-Hosting guide: <a href="https://zap-hosting.com/guides/docs/vserver-linux-lamp-stack">https://zap-hosting.com/guides/docs/vserver-linux-lamp-stack</a></p>
<ul>
<?php
// 判断是否有结果
if ($result->num_rows > 0) {
// 遍历结果数组
foreach ($result as $entry) {
echo "<li>";
// 显示名称,防止 XSS 攻击
echo htmlspecialchars($entry["name"]);

// 显示完成状态
if ($entry["is_completed"]) {
echo " <strong>(Completed)</strong>";
} else {
echo " <strong>(Incomplete)</strong>";
}

// 显示创建日期
echo " - Creation Date: " . htmlspecialchars($entry['creation_date']);
echo "</li>";
}
} else {
// 无数据时显示默认信息
echo "<li>No to-do items found.</li>";
}
?>
</ul>
</body>
</html>

<?php
// 关闭数据库连接
$conn->close();
?>

保存退出(CTRL + XY,回车)。

测试网站

恭喜!你已经成功搭建了一个利用 LAMP 堆栈的测试待办事项网站!

现在可以通过之前配置的域名(HTTP/80端口)访问网站,示例中是 zapdocs.example.com。页面效果如下:

总结

恭喜你成功安装并配置了 LAMP 环境!下一步,我们强烈建议配置域名和SSL 证书,确保网站数据传输安全。请查看我们的Certbot 指南,重点关注 Apache 插件,按照交互式步骤快速轻松地为你的域名配置证书。

如有任何疑问或需要帮助,欢迎随时联系支持团队,我们每天都在线为你服务!🙂