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

介绍

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

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

先决条件

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

步骤1-安装Apache并更新防火墙

Apache web服务器是世界上最流行的web服务器之一。它有很好的文档记录,有一个活跃的用户社区,在web历史的大部分时间里都被广泛使用,这使得它成为托管网站的最佳选择。

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

sudo apt update

然后,安装Apache:

sudo apt install apache2

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

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

sudo ufw app list
Output
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

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

  • Apache:此配置文件仅打开端口80(正常、未加密的web流量)。

  • 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
Output
Status: 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

无论选择哪种方法,请在web浏览器中键入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,您的服务器接下来都会要求您为MySQLroot用户选择并确认密码。不要将其与系统根混淆。数据库根用户是对数据库系统具有完全权限的管理用户。即使MySQL根用户的默认身份验证方法不涉及使用密码,即使设置了密码,您也应该在这里定义一个强密码作为额外的安全措施。

如果您启用了密码验证,则会显示您刚输入的根密码的密码强度,并且您的服务器会询问您是否要继续使用该密码。如果您对当前密码满意,请在提示下输入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键。这将删除一些匿名用户和测试数据库,禁用远程根登录,并加载这些新规则,以便MySQL立即尊重您所做的更改。

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

sudo mysql

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

Output
Welcome 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。尽管这似乎是一个安全问题,它使数据库服务器更加安全,因为允许以rootMySQL用户身份登录的唯一用户是具有sudo权限的系统用户,这些用户可以从控制台连接,也可以通过具有相同权限的应用程序运行。实际上,这意味着您将无法使用管理数据库root用户从PHP应用程序进行连接。在默认身份验证方法从unix_socket更改为password的情况下,为rootMySQL帐户设置密码可以起到保护作用。

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

**注意:**有些旧版本的PHP不支持caching_sha2_authentication,这是MySQL 8的默认身份验证方法。因此,在MySQL 8上为PHP应用程序创建数据库用户时,您可能需要将应用程序配置为使用mysql_native_password插件。本教程将在步骤6中演示如何执行此操作。

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

第3步-安装PHP

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

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

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

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

php -v
Output
PHP 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中的服务器块)来封装配置详细信息,并从单个服务器托管多个域。在本指南中,我们将设置一个名为您的\ \u域的域,但您应该将其替换为您自己的域名

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

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

您的\ \u域创建目录,如下所示:

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\u 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,可以删除或注释掉选项ServerNameServerAlias,方法是在每个选项行的开头添加一个磅符号(#)。

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

sudo a2ensite your_domain

您可能希望禁用Apache附带的默认网站。如果您不使用自定义域名,这是必需的,因为在这种情况下,Apache的默认配置将覆盖您的虚拟主机。要禁用Apache的默认网站,请键入:

sudo a2dissite 000-default

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

sudo apache2ctl configtest

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

sudo systemctl reload apache2

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

nano /var/www/your_domain/index.html

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

/var/www/your\ u 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文件,并修改DirectoryIndex指令中列出index.php文件的顺序:

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\ u 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\ \u database的数据库和一个名为此exchange\ \uuser的用户。可以用不同的值替换这些名称。

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

sudo mysql

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

CREATE DATABASE example_database;

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

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

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

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

然而,某些版本的PHP不能可靠地与caching_sha2_password一起工作。[PHP报告说,这个问题在PHP 7.4(https://php.watch/articles/PHP-7.4-MySQL-8-server-gone-away-fix)时已得到修复,但如果您稍后尝试登录到phpMyAdmin时遇到错误,您可能希望将设置为使用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 \u user用户对exchange \uDatabase数据库的完全权限,同时阻止该用户在您的服务器上创建或修改其他数据库。

现在使用以下命令退出MySQL shell:

exit

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

mysql -u example_user -p

注意这个命令中的-p标志,它将提示您在创建示例\u用户用户时使用的密码。登录MySQL控制台后,确认您可以访问示例\u数据库数据库:

SHOW DATABASES;

这将为您提供以下输出:

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

接下来,创建一个名为todo \u 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

现在您可以创建PHP脚本,该脚本将连接到MySQL并查询您的内容。使用首选编辑器在自定义web根目录中创建新的PHP文件:

nano /var/www/your_domain/todo_list.php

下面的PHP脚本连接到MySQL数据库并查询todo \u list表的内容,将结果显示在一个列表中。如果数据库连接有问题,它将引发异常。

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

/var/www/your\u domain/todo\u 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();
}

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

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

http://your_domain_or_IP/todo_list.php

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

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

结论

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

作为下一步,您应该通过HTTPS提供服务,确保与web服务器的连接安全。为了实现这一点,您可以使用让我们加密使用免费的TLS/SSL证书来保护您的站点。

猜你喜欢

转载自blog.csdn.net/zhishifufei/article/details/127780498