如何在Ubuntu22.04上安装Linux、Apache、MySQL、PHP(LAMP)堆栈

来自菜鸟教程
跳转至:导航、​搜索

介绍

“LAMP”堆栈是一组开源软件,通常安装在一起以使服务器能够托管用 PHP 编写的动态网站和 Web 应用程序。 该术语是一个首字母缩写词,代表带有 Apache Web 服务器的 Linux 操作系统。 站点数据存储在 MySQL 数据库中,动态内容由 PHP 处理。

在本指南中,您将在 Ubuntu 22.04 服务器上设置 LAMP 堆栈。

先决条件

为了完成本教程,您将需要一个 Ubuntu 22.04 服务器,该服务器具有启用非 root sudo 的用户帐户和基本防火墙。 这可以使用我们的 Ubuntu 22.04 初始服务器设置指南进行配置。

第 1 步 — 安装 Apache 并更新防火墙

Apache Web 服务器是世界上最流行的 Web 服务器之一。 它有据可查,拥有活跃的用户社区,并且在网络的大部分历史中都被广泛使用,这使其成为托管网站的绝佳选择。

首先更新包管理器缓存。 如果这是您第一次在此会话中使用 sudo,系统将提示您提供用户密码,以确认您具有使用 apt 管理系统包的正确权限:

sudo apt update

然后,安装 Apache:

sudo apt install apache2

系统将提示您确认 Apache 的安装。 按 Y 确认,然后按 ENTER

安装完成后,您需要调整防火墙设置以允许 HTTP 流量。 Ubuntu 的默认防火墙配置工具称为简单防火墙 (UFW)。 它具有您可以利用的不同应用程序配置文件。 要列出所有当前可用的 UFW 应用程序配置文件,请执行以下命令:

sudo ufw app list
OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

以下是每个配置文件的含义:

  • Apache:此配置文件仅打开端口 80(正常、未加密的网络流量)。
  • Apache Full:此配置文件同时打开端口 80(正常、未加密的 Web 流量)和端口 443(TLS/SSL 加密流量)。
  • Apache Secure:此配置文件仅打开端口 443(TLS/SSL 加密流量)。

目前,最好只允许端口 80 上的连接,因为这是全新的 Apache 安装,并且您尚未配置 TLS/SSL 证书以允许服务器上的 HTTPS 流量。

要仅允许端口 80 上的流量,请使用 Apache 配置文件:

sudo ufw allow in "Apache"

验证更改:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                                
Apache                     ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)                    
Apache (v6)                ALLOW       Anywhere (v6)     

现在允许端口 80 上的流量通过防火墙。

您可以立即进行抽查,通过在 Web 浏览器中访问服务器的公共 IP 地址来验证一切是否按计划进行(如果您没有此信息,请查看下一个标题下的注释以了解您的公共 IP 地址是什么)已经):

http://your_server_ip

默认的 Ubuntu 22.04 Apache 网页用于提供信息和测试目的。 以下是 Apache 默认网页的示例:

如果您可以查看此页面,则您的 Web 服务器已正确安装并可通过防火墙访问。

如何查找服务器的公共 IP 地址

如果您不知道服务器的公共 IP 地址是什么,有多种方法可以找到它。 通常,这是您用于通过 SSH 连接到服务器的地址。

有几种不同的方法可以从命令行执行此操作。 首先,您可以使用 iproute2 工具通过键入以下内容来获取您的 IP 地址:

ip addr show ens3 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

这会给你两三行回来。 它们都是正确的地址,但您的计算机可能只能使用其中一个,因此请随意尝试每个。

另一种方法是使用 curl 实用程序联系外部方,告诉您它如何看待您的服务器。 这是通过询问特定服务器您的 IP 地址是什么来完成的:

curl http://icanhazip.com

无论您选择哪种方法,在您的网络浏览器中输入您的 IP 地址以验证您的服务器是否正在运行。

第 2 步 — 安装 MySQL

现在您已经启动并运行了一个 Web 服务器,您需要安装数据库系统才能为您的站点存储和管理数据。 MySQL 是 PHP 环境中使用的流行数据库管理系统。

同样,使用 apt 获取并安装此软件:

sudo apt install mysql-server

出现提示时,键入 Y 确认安装,然后键入 ENTER

安装完成后,建议您运行 MySQL 预装的安全脚本。 此脚本将删除一些不安全的默认设置并锁定对您的数据库系统的访问。 通过运行启动交互式脚本:

sudo mysql_secure_installation

这将询问您是否要配置 VALIDATE PASSWORD PLUGIN

注意: 启用此功能是一种判断。 如果启用,与指定条件不匹配的密码将被 MySQL 拒绝并出现错误。 禁用验证是安全的,但您应该始终为数据库凭据使用强而唯一的密码。


回答 Y 表示是,或者在不启用的情况下继续进行其他任何操作。

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

如果您回答“是”,系统会要求您选择密码验证级别。 请记住,如果您输入 2 以获得最强级别,则在尝试设置任何不包含数字、大小写字母和特殊字符的密码时,您将收到错误消息:

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

无论您是否选择设置 VALIDATE PASSWORD PLUGIN,您的服务器接下来都会要求您选择并确认 MySQL root 用户的密码。 不要与 系统根 混淆。 数据库根 用户是对数据库系统具有完全权限的管理用户。 即使 MySQL root 用户的默认身份验证方法不涉及使用密码,即使设置了,您也应该在此处定义一个强密码作为额外的安全措施。

如果您启用了密码验证,您将看到您刚刚输入的根密码的密码强度,并且您的服务器会询问您是否要继续使用该密码。 如果您对当前密码感到满意,请在提示符处输入 Y 表示“是”:

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

对于其余的问题,请按 Y 并在每个提示处按 ENTER 键。 这将删除一些匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便 MySQL 立即尊重您所做的更改。

完成后,通过键入以下内容测试您是否能够登录 MySQL 控制台:

sudo mysql

这将以管理数据库用户 root 的身份连接到 MySQL 服务器,这是通过在运行此命令时使用 sudo 推断出来的。 下面是一个示例输出:

OutputWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

要退出 MySQL 控制台,请键入:

exit

请注意,即使您在运行 mysql_secure_installation 脚本时定义了密码,您也无需提供以 root 用户身份连接的密码。 这是因为管理 MySQL 用户的默认身份验证方法是 unix_socket 而不是 password。 尽管这看起来像是一个安全问题,但它使数据库服务器更加安全,因为唯一允许以 root MySQL 用户身份登录的用户是具有 sudo 权限的系统用户,从控制台或通过以相同权限运行的应用程序。 实际上,这意味着您将无法使用管理数据库 root 用户从您的 PHP 应用程序进行连接。 为 root MySQL 帐户设置密码可以起到保护作用,以防默认身份验证方法从 unix_socket 更改为 password

为了提高安全性,最好为每个数据库设置具有较少扩展权限的专用用户帐户,特别是如果您计划在您的服务器上托管多个数据库。

注意:有一些旧版本的PHP 不支持 caching_sha2_authentication,MySQL 8的默认认证方法。 因此,在 MySQL 8 上为 PHP 应用程序创建数据库用户时,您可能需要将应用程序配置为使用 mysql_native_password 插件。 本教程将在 Step 6 中演示如何做到这一点。


您的 MySQL 服务器现已安装并受到保护。 接下来,您将安装 PHP,这是 LAMP 堆栈中的最后一个组件。

第 3 步 — 安装 PHP

您安装了 Apache 来提供您的内容,并安装了 MySQL 来存储和管理您的数据。 PHP 是我们设置的组件,它将处理代码以向最终用户显示动态内容。 除了 php 包之外,您还需要 php-mysql,这是一个 PHP 模块,它允许 PHP 与基于 MySQL 的数据库进行通信。 您还需要 libapache2-mod-php 以使 Apache 能够处理 PHP 文件。 核心 PHP 包将自动安装为依赖项。

要安装这些软件包,请运行以下命令:

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

安装完成后,运行以下命令以确认您的 PHP 版本:

php -v
OutputPHP 8.1.2 (cli) (built: Mar  4 2022 18:13:46) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies

此时,您的 LAMP 堆栈已完全运行,但在使用 PHP 脚本测试您的设置之前,最好设置一个适当的 Apache 虚拟主机 来保存您网站的文件和文件夹。

第 4 步 — 为您的网站创建虚拟主机

使用 Apache Web 服务器时,您可以创建 虚拟主机 (类似于 Nginx 中的服务器块)来封装配置细节并从单个服务器托管多个域。 在本指南中,我们将设置一个名为 your_domain 的域,但您应该将 替换为您自己的域名

注意:如果您使用 DigitalOcean 作为 DNS 托管服务提供商,请查看我们的 产品文档 以获取有关如何设置新域名并将其指向您的服务器的详细说明。


Ubuntu 22.04 上的 Apache 默认启用一个虚拟主机,配置为从 /var/www/html 目录提供文档。 虽然这适用于单个站点,但如果您托管多个站点,它可能会变得笨拙。 我们将在 /var/www 中为 your_domain 站点创建目录结构,而不是修改 /var/www/html,而将 /var/www/html 保留为默认目录如果客户端请求与任何其他站点不匹配,则提供。

your_domain 创建目录,如下所示:

sudo mkdir /var/www/your_domain

接下来,使用 $USER 环境变量分配目录的所有权,它将引用您当前的系统用户:

sudo chown -R $USER:$USER /var/www/your_domain

然后,使用您喜欢的命令行编辑器在 Apache 的 sites-available 目录中打开一个新的配置文件。 在这里,我们将使用 nano

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

这将创建一个新的空白文件。 使用您自己的域名添加以下基本配置:

/etc/apache2/sites-available/your_domain.conf

<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>

完成后保存并关闭文件。 如果您使用 nano,请按 CTRL+X,然后按 YENTER

通过这个 VirtualHost 配置,我们告诉 Apache 使用 /var/www/your_domain 作为 Web 根目录来服务 your_domain。 如果您想在没有域名的情况下测试 Apache,您可以通过添加井号 (#)每个选项的行。

现在,使用 a2ensite 启用新的虚拟主机:

sudo a2ensite your_domain

您可能想要禁用随 Apache 一起安装的默认网站。 如果您不使用自定义域名,这是必需的,因为在这种情况下,Apache 的默认配置会覆盖您的虚拟主机。 要禁用 Apache 的默认网站,请键入:

sudo a2dissite 000-default

要确保您的配置文件不包含语法错误,请运行以下命令:

sudo apache2ctl configtest

最后,重新加载 Apache,使这些更改生效:

sudo systemctl reload apache2

您的新网站现在处于活动状态,但网络根目录 /var/www/your_domain 仍然为空。 在该位置创建一个 index.html 文件以测试虚拟主机是否按预期工作:

nano /var/www/your_domain/index.html

在此文件中包含以下内容:

/var/www/your_domain/index.html

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

保存并关闭文件,然后转到浏览器并访问服务器的域名或 IP 地址:

http://server_domain_or_IP

您的网页应反映您刚刚编辑的文件中的内容:

在您设置 index.php 文件来替换它之前,您可以将此文件保留为应用程序的临时登录页面。 完成此操作后,请记住从文档根目录中删除或重命名 index.html 文件,因为默认情况下它优先于 index.php 文件。

关于 Apache 上的 DirectoryIndex 的注意事项

使用 Apache 上的默认 DirectoryIndex 设置,名为 index.html 的文件将始终优先于 index.php 文件。 这对于在 PHP 应用程序中设置维护页面很有用,方法是创建一个包含给访问者的信息性消息的临时 index.html 文件。 由于此页面将优先于 index.php 页面,因此它将成为应用程序的登录页面。 维护结束后,index.html 将被重命名或从文档根目录中删除,从而恢复正常的应用程序页面。

如果您想更改此行为,您需要编辑 /etc/apache2/mods-enabled/dir.conf 文件并修改 index.php 文件在 DirectoryIndex 指令中列出的顺序:

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

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

<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

保存并关闭文件后,您需要重新加载 Apache 以使更改生效:

sudo systemctl reload apache2

在下一步中,我们将创建一个 PHP 脚本来测试 PHP 是否在您的服务器上正确安装和配置。

第 5 步 — 在您的 Web 服务器上测试 PHP 处理

现在您已经有了一个自定义位置来托管您网站的文件和文件夹,创建一个 PHP 测试脚本来确认 Apache 能够处理和处理对 PHP 文件的请求。

在您的自定义 Web 根文件夹中创建一个名为 info.php 的新文件:

nano /var/www/your_domain/info.php

这将打开一个空白文件。 在文件中添加以下文本,这是有效的 PHP 代码:

/var/www/your_domain/info.php

<?php
phpinfo();

完成后,保存并关闭文件。

要测试此脚本,请转到您的 Web 浏览器并访问您的服务器的域名或 IP 地址,然后是脚本名称,在本例中为 info.php

http://server_domain_or_IP/info.php

以下是默认 PHP 网页的示例:

此页面从 PHP 的角度提供有关您的服务器的信息。 它对于调试和确保正确应用您的设置很有用。

如果您在浏览器中看到此页面,那么您的 PHP 安装正在按预期工作。

通过该页面检查有关您的 PHP 服务器的相关信息后,最好删除您创建的文件,因为它包含有关您的 PHP 环境和 Ubuntu 服务器的敏感信息。 使用 rm 这样做:

sudo rm /var/www/your_domain/info.php

如果您以后需要再次访问该信息,您可以随时重新创建此页面。

第 6 步 — 从 PHP 测试数据库连接(可选)

如果您想测试 PHP 是否能够连接到 MySQL 并执行数据库查询,您可以使用测试数据创建一个测试表并从 PHP 脚本查询其内容。 在你这样做之前,你需要创建一个测试数据库和一个正确配置的新 MySQL 用户来访问它。

创建一个名为 example_database 的数据库和一个名为 example_user 的用户。 您可以将这些名称替换为不同的值。

首先,使用 root 帐户连接到 MySQL 控制台:

sudo mysql

要创建新数据库,请从 MySQL 控制台运行以下命令:

CREATE DATABASE example_database;

现在创建一个新用户并授予他们对您刚刚创建的自定义数据库的完全权限。

以下命令创建一个名为 example_user 的新用户,该用户使用 caching_sha2_password 方法进行身份验证。 我们将此用户的密码定义为 password,但您应该将此值替换为您自己选择的安全密码。

CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';

注意:前面的 ALTER USER 语句设置 root MySQL 用户使用 caching_sha2_password 插件进行身份验证。 根据官方 MySQL 文档caching_sha2_password 是 MySQL 的首选身份验证插件,因为它提供了比旧的但仍被广泛使用的 mysql_native_password 更安全的密码加密。

但是,某些版本的 PHP 不能可靠地与 caching_sha2_password 一起工作。 PHP 已报告此问题自 PHP 7.4 起已修复,但如果您稍后尝试登录 phpMyAdmin 时遇到错误,您可能需要设置 root 进行身份验证mysql_native_password 代替:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
``\`
<

现在授予此用户对 example_database 数据库的权限:

GRANT ALL ON example_database.* TO 'example_user'@'%';

这将赋予 example_user 用户对 example_database 数据库的完全权限,同时阻止该用户在您的服务器上创建或修改其他数据库。

现在退出 MySQL shell:

exit

通过再次登录 MySQL 控制台来测试新用户是否具有适当的权限,这次使用自定义用户凭据:

mysql -u example_user -p

请注意此命令中的 -p 标志,它将提示您输入创建 example_user 用户时使用的密码。 登录 MySQL 控制台后,确认您有权访问 example_database 数据库:

SHOW DATABASES;

这将为您提供以下输出:

Output+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

接下来,创建一个名为 todo_list 的测试表。 在 MySQL 控制台中,运行以下语句:

CREATE TABLE example_database.todo_list (
   item_id INT AUTO_INCREMENT,
   content VARCHAR(255),
   PRIMARY KEY(item_id)
);

在测试表中插入几行内容。 使用不同的值重复下一个命令几次,以填充您的测试表:

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

要确认数据已成功保存到您的表中,请运行:

SELECT * FROM example_database.todo_list;

以下是输出:

Output+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

确认您的测试表中有有效数据后,退出 MySQL 控制台:

exit

现在您可以创建将连接到 MySQL 并查询您的内容的 PHP 脚本。 使用您喜欢的编辑器在您的自定义 Web 根目录中创建一个新的 PHP 文件:

nano /var/www/your_domain/todo_list.php

以下 PHP 脚本连接到 MySQL 数据库并查询 todo_list 表的内容,并在列表中显示结果。 如果数据库连接有问题,它会抛出异常。

将此内容添加到您的 todo_list.php 脚本中,记住将 example_userpassword 替换为您自己的:

/var/www/your_domain/todo_list.php

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>"; 
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

完成编辑后保存并关闭文件。

您现在可以通过访问为您的网站配置的域名或公共 IP 地址在 Web 浏览器中访问此页面,然后按 /todo_list.php

http://your_domain_or_IP/todo_list.php

此网页应向访问者显示您在测试表中插入的内容:

这意味着您的 PHP 环境已准备好与您的 MySQL 服务器连接和交互。

结论

在本指南中,您已经为向访问者提供 PHP 网站和应用程序建立了一个灵活的基础,使用 Apache 作为 Web 服务器,使用 MySQL 作为数据库系统。

作为紧接着的下一步,您应该确保通过 HTTPS 提供与您的 Web 服务器的连接是安全的。 为了做到这一点,您可以使用 Let's Encrypt 使用免费的 TLS/SSL 证书来保护您的网站。