如何在 Ubuntu 22.04 上安装 Linux、Apache、MySQL 和 PHP (LAMP) 协议栈

介绍

LAMP堆栈是一组开源软件,通常被安装在一起,以便允许服务器托管用PHP编写的动态网站和Web应用程序. 这个术语是代表带有ApacheWeb服务器的L inux操作系统的缩写。

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

前提条件

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

步骤 1 – 安装 Apache 和更新防火墙

Apache 网页服务器是世界上最受欢迎的网页服务器之一,它有很好的文档,具有活跃的用户社区,并且在网页历史的大部分时间里一直被广泛使用,这使得它成为一个伟大的网站托管选择。

如果这是你第一次在这个会话中使用sudo,你将被要求提供你的用户密码,以确认你有正确的权限来管理apt的系统包:

1sudo apt update

然后安装 Apache:

1sudo apt install apache2

您将被要求确认 Apache 的安装,然后按Y,然后按ENTER

一旦安装完成,您将需要调整防火墙设置以允许HTTP流量。Ubuntu的默认防火墙配置工具叫做Uncomplicated Firewall(UFW)。

1sudo ufw app list
1[secondary_label Output]
2Available applications:
3  Apache
4  Apache Full
5  Apache Secure
6  OpenSSH

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

  • Apache :此配置文件只打开端口 `80′(正常,未加密的网络流量)。
  • Apache Full :此配置文件只打开端口 80′(正常,未加密的网络流量)和端口 443′(TLS/SSL加密的流量)。
  • Apache Secure :此配置文件只打开端口 `443′(TLS/SSL加密的流量)。

目前,最好只允许在端口80上的连接,因为这是一个新的Apache安装,而且您还没有配置TLS/SSL证书来允许HTTPS流量在您的服务器上。

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

1sudo ufw allow in "Apache"

检查变化与:

1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6OpenSSH ALLOW Anywhere                                
7Apache ALLOW Anywhere                  
8OpenSSH (v6)               ALLOW Anywhere (v6)                    
9Apache (v6)                ALLOW Anywhere (v6)

80端口的流量现在可以通过防火墙。

您可以立即进行点击检查,以验证一切按计划进行,通过访问您的网络浏览器中的服务器的公共IP地址(请参阅下面的标题下面的注释,以了解您的公共IP地址是什么,如果您还没有这些信息):

1http://your_server_ip

默认的Ubuntu 22.04 Apache网页为信息和测试目的而存在,以下是默认的Apache网页的例子:

Ubuntu 22.04 Apache default web page with an overview of your default configuration settings

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

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

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

首先,您可以使用iproute2工具通过键入以下方式获取您的IP地址:

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

这些都是正确的地址,但您的计算机可能只能使用其中一个,所以可以尝试每一个。

另一种方法是使用弯曲实用程序与外部方联系,告诉您它如何看待您的服务器。

1curl http://icanhazip.com

无论您选择哪种方法,请在 Web 浏览器中输入您的 IP 地址,以确认您的服务器正在运行。

第2步:安装MySQL

现在你有一个Web服务器运行,你需要安装数据库系统,以便能够存储和管理您的网站的数据MySQL是一个流行的数据库管理系统,用于PHP环境。

再次,使用apt来获取和安装此软件:

1sudo apt install mysql-server

当被提示时,通过键入Y,然后ENTER来确认安装。

当安装完成后,建议您运行一个安全脚本,该脚本与MySQL预先安装,将删除一些不安全的默认设置,并锁定访问您的数据库系统。

<$>[warning] Warning :从2022年7月开始,在没有进一步配置的情况下运行mysql_secure_installation脚本时,会出现错误。

在2022年7月之前,在尝试设置 root 帐户密码后,此脚本会默默失败,并继续使用其他提示,但是,在您输入并确认密码后,脚本将返回以下错误:

1[secondary_label Output]
2 ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.
3
4New password:

这将导致脚本进入回归循环,您只能通过关闭终端窗口来退出。

由于mysql_secure_installation脚本执行了一些其他操作,有助于保持您的MySQL安装安全,但建议您在开始使用MySQL来管理数据之前运行它。

首先,打开 MySQL 提示:

1sudo mysql

然后运行以下ALTER USER命令,将 root 用户的身份验证方法更改为使用密码的身份验证方法。

1ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

完成此更改后,请退出 MySQL 提示:

1exit

随后,您可以运行mysql_secure_installation脚本,无需问题。

通过运行开始交互式脚本:

1sudo mysql_secure_installation

这将询问您是否想要配置验证密码插件

<$>[注] 注: 启用此功能是一种判断呼叫。如果启用,不符合指定的标准的密码将被MySQL错误拒绝。

回答Y是的,或其他任何事情,不允许继续。

1VALIDATE PASSWORD PLUGIN can be used to test passwords
2and improve security. It checks the strength of password
3and allows the users to set only those passwords which are
4secure enough. Would you like to setup VALIDATE PASSWORD plugin?
5
6Press y|Y for Yes, any other key for No:

如果你回答,你将被要求选择一个密码验证级别. 请记住,如果你输入2为最强的级别,你会收到错误,当你尝试设置任何密码不包含数字,顶部和底部字母,以及特殊字符:

1There are three levels of password validation policy:
2
3LOW Length >= 8
4MEDIUM Length >= 8, numeric, mixed case, and special characters
5STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
6
7Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

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

如果您启用了密码验证,您将看到您刚刚输入的根密码的密码强度,您的服务器将询问您是否想要继续使用该密码。

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

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

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

1sudo mysql

这将作为管理数据库用户 root 连接到MySQL服务器,这是在运行此命令时使用sudo来推断的。

 1[secondary_label Output]
 2Welcome to the MySQL monitor. Commands end with ; or \g.
 3Your MySQL connection id is 10
 4Server version: 8.0.28-0ubuntu4 (Ubuntu)
 5
 6Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 7
 8Oracle is a registered trademark of Oracle Corporation and/or its
 9affiliates. Other names may be trademarks of their respective
10owners.
11
12Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
13
14mysql>

要退出 MySQL 控制台,键入:

1exit

请注意,您不需要提供密码以连接为 root 用户,即使您在运行mysql_secure_installation脚本时已经定义了一个密码,这是因为管理 MySQL 用户的默认身份验证方法是unix_socket而不是password。尽管这可能看起来像是一个安全问题,但它使数据库服务器更安全,因为唯一允许登录为 ** root** MySQL 用户的用户是从控制台或通过运行相同权限的应用程序连接的具有 sudo 权限的系统用户。

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

<$>[note] 注: 有一些较早版本的PHP,它不支持(https://www.php.net/manual/en/ref.pdo-mysql.php) caching_sha2_password,默认身份验证方法为MySQL 8. 因此,创建PHP应用程序的数据库用户时,在MySQL 8上,你可能需要配置你的应用程序以使用‘mysql_native_password’插件。本教程将展示如何在 [步骤 6](# step-6%E2%80%94-testing-database-connection-from-php-(可选))。 <$>

您的MySQL服务器现在已安装和安全,接下来,您将安装PHP,LAMP堆栈的最终组件。

步骤三:安装PHP

您已经安装了 Apache 来服务您的内容,并且安装了 MySQL 来存储和管理您的数据。 PHP 是我们设置的组件,它将处理代码以向最终用户显示动态内容。除了php包外,您还需要php-mysql,一个允许 PHP 与基于 MySQL 的数据库进行通信的 PHP 模块。您还需要libapache2-mod-php来允许 Apache 处理 PHP 文件。

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

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

一旦安装完成,请运行以下命令来确认您的PHP版本:

1php -v
1[secondary_label Output]
2PHP 8.1.2 (cli) (built: Mar 4 2022 18:13:46) (NTS)
3Copyright (c) The PHP Group
4Zend Engine v4.1.2, Copyright (c) Zend Technologies
5    with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies

此时,您的 LAMP 堆栈完全运行,但在使用 PHP 脚本测试安装之前,最好设置一个适当的 Apache Virtual Host来存储您的网站的文件和文件夹。

步骤4:为您的网站创建虚拟主机

在使用Apache Web 服务器时,您可以创建 virtual hosts(类似于 Nginx 中的服务器块)来封装配置细节,并从单个服务器中托管多个域。

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

Apache 在 Ubuntu 22.04 上有一个默认启用的虚拟主机,它配置为从 /var/www/html 目录中服务的文档。虽然这对单个网站非常有效,但如果您托管多个网站,它可能会变得不便。

创建 your_domain 的目录如下:

1sudo mkdir /var/www/your_domain

接下来,与$USER环境变量分配目录的所有权,该变量将参考您的当前系统用户:

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

然后,在Apache的可用网站目录中使用您偏好的命令行编辑器打开一个新的配置文件。

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

这将创建一个新的空格文件. 使用自己的域名添加以下裸体配置:

1[label /etc/apache2/sites-available/your_domain.conf]
2<VirtualHost *:80>
3    ServerName your_domain
4    ServerAlias www.your_domain 
5    ServerAdmin webmaster@localhost
6    DocumentRoot /var/www/your_domain
7    ErrorLog ${APACHE_LOG_DIR}/error.log
8    CustomLog ${APACHE_LOG_DIR}/access.log combined
9</VirtualHost>

如果您正在使用nano,请按CTRL+X,然后按YENTER

通过这个VirtualHost配置,我们告诉Apache使用/var/www/your_domain作为网页根目录来服务你的_域 如果你想测试没有域名的Apache,你可以删除或评论ServerNameServerAlias选项,在每个选项的行开始时添加一个英镑符号(# )。

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

1sudo a2ensite your_domain

您可能想禁用与 Apache 一起安装的默认网站. 如果您不使用自定义域名,则需要此功能,因为在这种情况下,Apache 的默认配置会取代您的虚拟主机。

1sudo a2dissite 000-default

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

1sudo apache2ctl configtest

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

1sudo systemctl reload apache2

您的新网站现在已启动,但网页根 /var/www/your_domain 仍然是空的. 在该位置创建一个 index.html 文件,以测试虚拟主机是否按预期运行:

1nano /var/www/your_domain/index.html

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

 1[label /var/www/your_domain/index.html]
 2<html>
 3  <head>
 4    <title>your_domain website</title>
 5  </head>
 6  <body>
 7    <h1>Hello World!</h1>
 8
 9    <p>This is the landing page of <strong>your_domain</strong>.</p>
10  </body>
11</html>

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

1http://server_domain_or_IP

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

Apache virtual host test landing page that reveals your HTML code to the user

您可以将此文件留在应用程序的临时定位页面中,直到您设置一个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 指令中列出的顺序:

1sudo nano /etc/apache2/mods-enabled/dir.conf
1[label /etc/apache2/mods-enabled/dir.conf]
2<IfModule mod_dir.c>
3        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
4</IfModule>

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

1sudo systemctl reload apache2

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

步骤 5 – 在您的 Web 服务器上测试 PHP 处理

现在你有一个定制的位置来托管你的网站的文件和文件夹,创建一个PHP测试脚本,以确认Apache能够处理和处理PHP文件的请求。

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

1nano /var/www/your_domain/info.php

添加以下文本,即有效的PHP代码,在文件中:

1[label /var/www/your_domain/info.php]
2<?php
3phpinfo();

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

要测试此脚本,请进入您的 Web 浏览器并访问您的服务器的域名或 IP 地址,然后是脚本名称,在这种情况下是 info.php:

1http://server_domain_or_IP/info.php

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

Ubuntu 22.04 PHP web page revealing pertinent information about the current PHP version and settings

此页面从PHP的角度提供有关您的服务器的信息,有助于调试并确保您的设置得到正确应用。

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

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

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

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

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

如果你想测试PHP是否能够连接到MySQL并执行数据库查询,你可以创建一个测试表,从PHP脚本中测试数据和查询其内容。

创建一个名为 example_database 的数据库和一个名为 ** example_user** 的用户。

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

1sudo mysql

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

1CREATE DATABASE example_database;

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

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

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

<$>[note] Note :前面的ALTER USER声明将MySQL用户设置为使用caching_sha2_password插件进行身份验证。

然而,某些版本的 PHP 无法可靠地使用 caching_sha2_password. [PHP 报告称此问题已在 PHP 7.4 开始修复(https://php.watch/articles/PHP-7.4-MySQL-8-server-gone-away-fix),但如果您在稍后尝试登录 phpMyAdmin 时遇到错误,您可能希望设置 root 以使用 mysql_native_password 进行身份验证:

1ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

美元

现在,向example_database数据库授予此用户权限:

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

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

现在离开 MySQL 壳:

1exit

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

1mysql -u example_user -p

注意此命令中的 -p 旗,它会提示您在创建 example_user 用户时使用的密码。登录到 MySQL 控制台后,确认您可以访问 ** example_database** 数据库:

1SHOW DATABASES;

这将为您带来以下结果:

1[secondary_label Output]
2+--------------------+
3| Database           |
4+--------------------+
5| example_database   |
6| information_schema |
7+--------------------+
82 rows in set (0.000 sec)

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

1CREATE TABLE example_database.todo_list (
2    item_id INT AUTO_INCREMENT,
3    content VARCHAR(255),
4    PRIMARY KEY(item_id)
5);

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

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

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

1SELECT * FROM example_database.todo_list;

以下是产量:

 1[secondary_label Output]
 2+---------+--------------------------+
 3| item_id | content                  |
 4+---------+--------------------------+
 5|       1 | My first important item  |
 6|       2 | My second important item |
 7|       3 | My third important item  |
 8|       4 | and this one more thing  |
 9+---------+--------------------------+
104 rows in set (0.000 sec)

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

1exit

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

1nano /var/www/your_domain/todo_list.php

下面的 PHP 脚本连接到 MySQL 数据库并查询 todo_list 表的内容,在列表中显示结果。

将此内容添加到你的todo_list.php脚本中,记住用你自己的代替example_userpassword:

 1[label /var/www/your_domain/todo_list.php]
 2<?php
 3$user = "example_user";
 4$password = "password";
 5$database = "example_database";
 6$table = "todo_list";
 7
 8try {
 9  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
10  echo "<h2>TODO</h2><ol>"; 
11  foreach($db->query("SELECT content FROM $table") as $row) {
12    echo "<li>" . $row['content'] . "</li>";
13  }
14  echo "</ol>";
15} catch (PDOException $e) {
16    print "Error!: " . $e->getMessage() . "<br/>";
17    die();
18}

保存并关闭文件,当你完成编辑。

您现在可以访问您的网页浏览器中的这个页面,访问您的网站配置的域名或公共 IP 地址,然后是 /todo_list.php:

1http://your_domain_or_IP/todo_list.php

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

Example PHP todo list web page in the browser

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

结论

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

作为下一步,您应该通过通过 HTTPS 来确保连接到您的 Web 服务器,以便实现这一点,您可以使用 Let's Encrypt来保护您的网站,使用免费的 TLS / SSL 证书。

Published At
Categories with 技术
comments powered by Disqus