如何在 Ubuntu 22.04 上安装 Linux、Nginx、MySQL 和 PHP(LEMP 协议栈

介绍

LEMP软件堆栈是一组软件,可以用来服务动态的网页和网页应用程序写在PHP. 这是一个缩写,描述一个 L inux操作系统,与一个 Nginx(发音为** E** ngine-X)的网页服务器。 后端数据存储在 ** M** ySQL数据库中,动态处理由 ** P** HP处理。

本指南展示了如何在 Ubuntu 22.04 服务器上安装 LEMP 堆栈. Ubuntu 操作系统负责堆栈的 Linux 部分。

前提条件

要完成本教程,您将需要访问Ubuntu 22.04服务器作为一个常规的,非root sudo用户,并在您的服务器上启用防火墙。

步骤1:安装 Nginx Web 服务器

要向网站访问者显示网页,您将使用高性能网页服务器 Nginx,您将使用 APT 包管理器获取此软件。

由于这是您第一次在本会话中使用apt,请先更新您的服务器的包索引:

1sudo apt update

接下来,运行apt install来安装 Nginx:

1sudo apt install nginx

当被提示时,按YENTER来确认您想要安装 Nginx. 安装完成后, Nginx 网页服务器将被激活并在您的 Ubuntu 22.04 服务器上运行。

如果您已启用ufw防火墙,正如我们最初的服务器设置指南中推荐的那样,您将需要允许连接到 Nginx。 Nginx在安装时会注册几个不同的 UFW 应用程序配置文件。

1sudo ufw app list
1[secondary_label Output]
2Available applications:
3  Nginx Full
4  Nginx HTTP
5  Nginx HTTPS
6  OpenSSH

建议您启用最具限制性的配置文件,以便仍然允许您需要的流量. 由于您在本指南中尚未为您的服务器配置 SSL,您只需要在端口 `80 上允许正常的 HTTP 流量。

通过运行以下操作来实现这一点:

1sudo ufw allow 'Nginx HTTP'

您可以通过检查状态来验证变更:

1sudo ufw status

此输出显示现在允许 HTTP 流量:

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

随着新的防火墙规则的添加,您可以通过访问您的服务器的域名或公共 IP 地址在您的 Web 浏览器中测试服务器是否正在运行。

如果您没有指向您的服务器的域名,并且您不知道您的服务器的公共IP地址,您可以通过执行下列命令之一来找到它:

1ip addr show
1hostname -I

這將打印出幾個IP地址,您可以在您的網頁瀏覽器中嘗試每一個。

或者,您可以检查哪个 IP 地址可访问,如从互联网上的其他位置查看:

1curl -4 icanhazip.com

输入您在 Web 浏览器中接收的地址,它将带您到 Nginx 的默认定位页面:

1http://server_domain_or_IP

Nginx default page

如果您收到此页面,则意味着您已成功安装了 Nginx 并为您的 Web 服务器启用了 HTTP 流量。

第2步:安装MySQL

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

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

1sudo apt install mysql-server

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

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

1sudo mysql_secure_installation

您将被提示提出一个问题,询问您是否想要配置验证密码插件

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

回答Y,或其他任何事情,以继续而不允许:

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

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

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

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

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

1[secondary_label Output]
2Estimated strength of the password: 100 
3Do 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脚本时已经定义了一个密码,这是因为,在 Ubuntu 上安装时,管理 MySQL 用户的默认身份验证方法是auth_socket,而不是使用使用密码的方法。这可能起初看起来像是一个安全问题,但它使数据库服务器更安全,因为唯一允许登录作为 ** root** MySQL 用户的用户是从控制台或通过运行相同权限的应用程序连接的sudo权限的系统用户。

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

<$>[note] 注: 某些旧版本的原始MySQL PHP库 mysqlnd 不支持 caching_sha2_authentication,默认身份验证方法为创建用户MySQL 8。因此,当创建数据库用户的PHP应用程序在MySQL 8,你可能需要确保他们配置使用‘mysql_native_password’而不是。

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

步骤三:安装PHP

你安装了 Nginx 来服务你的内容,安装了 MySQL 来存储和管理你的数据,现在你可以安装 PHP 来处理代码,并为 Web 服务器生成动态内容。

虽然Apache在每个请求中嵌入PHP翻译器,但 Nginx需要一个外部程序来处理PHP处理,并作为PHP翻译器本身和Web服务器之间的桥梁。这使得大多数PHP基于的网站的整体性能更好,但需要额外的配置。您需要安装php8.1-fpm,这代表PHP fastCGI流程管理器,并使用PHP的当前版本(在写作时),告诉 Nginx将PHP请求传递给该软件进行处理。

要安装php8.1-fpmphp-mysql包,请运行:

1sudo apt install php8.1-fpm php-mysql

当提示时,按YENTER来确认安装。

您现在已经安装了 PHP 组件,接下来,您将配置 Nginx 来使用它们。

步骤 4 — 配置 Nginx 以使用 PHP 处理器

在使用 Nginx 网页服务器时,我们可以创建 _server 块(类似于 Apache 中的虚拟主机),以封装配置细节,并在单个服务器上托管多个域名。

<$>[info] 信息: 有关使用 DigitalOcean 设置域名的更多信息,请阅读我们的 DigitalOcean DNS 介绍

在Ubuntu 22.04,Nginx默认允许一个服务器块,并配置为在/var/www/html中的目录中服务文档。虽然这对单个网站非常有效,但如果您托管多个网站,则很难管理。

创建 your_domain 的根网页目录如下:

1sudo mkdir /var/www/your_domain

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

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

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

1sudo nano /etc/nginx/sites-available/your_domain

这将创建一个新的空格文件. 插入以下裸骨配置:

 1[label /etc/nginx/sites-available/your_domain]
 2server {
 3    listen 80;
 4    server_name your_domain www.your_domain;
 5    root /var/www/your_domain;
 6
 7    index index.html index.htm index.php;
 8
 9    location / {
10        try_files $uri $uri/ =404;
11    }
12
13    location ~ \.php$ {
14        include snippets/fastcgi-php.conf;
15        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
16     }
17
18    location ~ /\.ht {
19        deny all;
20    }
21
22}

以下是这些指令和位置块的每个功能:

  • 倾听 ' -- -- 界定Nginx港将听什么。 在此情况下,它将在 HTTP. *root ' 的默认端口 " 80 " 上收听—— 定义此网站所服务文件的存储地的文档根. *index'—— 定义Nginx对该网站索引文件的排序. 通常的做法是列出index.html'文件,其优先位置高于`index'。 php ' 文件,以便在 PHP 应用程序中快速设置维护登陆页. 您可以调整这些设置以更好地适应您的应用程序需要。
  • server_name' – 定义该服务器块应该响应的域名和/或IP地址 。 ** 将此指令指向您的服务器域名或公共IP地址。 *位置 /'- 第一个位置块包括一个`try_files'指令,该指令检查匹配URL请求的文件或目录是否存在. 如果 Nginx 找不到合适的资源, 它会返回一个 404 个错误 。
  • 位置 ~\.php$' - 这个位置块处理实际的PHP处理,将Nginx指向"快克吉-php.conf"配置文件和"php8.1-fpm.sock"文件,该文件宣布了哪些套接字与"php8.1-fpm"有关. *"位置~/\.ht"——最后一个位置块处理的是".htaccess"文件,而Nginx没有处理. 如果任何.htaccess ' 文件碰巧进入了文件根,则通过添加`拒绝所有 ' 指令,它们不会提供给访客。

完成编辑后,保存并关闭文件. 如果您使用nano,您可以通过按CTRL+X,然后按YENTER来确认。

通过从 Nginx 的网站启用目录链接到配置文件来激活您的配置:

1sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

然后,从 /sites-enabled/ 目录中卸载默认配置文件:

1sudo unlink /etc/nginx/sites-enabled/default

<$>[注] :如果您需要恢复默认配置,您可以通过重置标志性链接,如下:

1sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

美元

这将告诉 Nginx下次重新加载时使用配置,您可以通过执行以下操作来测试您的配置以检测语法错误:

1sudo nginx -t

如果报告了任何错误,请返回配置文件,查看其内容,然后继续。

当您准备好时,重新加载 Nginx 以应用更改:

1sudo systemctl reload nginx

您的新网站现在正在运行,但网页根 /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地址,如您的服务器封锁配置文件中的server_name指令中列出的:

1http://server_domain_or_IP

您将收到如下的一页:

Nginx server block

如果您收到此页面,则意味着您的 Nginx 服务器块按预期运行。

您可以将此文件留在应用程序的临时定位页面中,直到您设置一个index.php文件来取代它. 一旦您这样做,请记住从文档根中删除或更名index.html文件,因为它将优先于index.php文件。

在下一步,您将创建一个PHP脚本来测试 Nginx实际上能够在新配置的网站中处理 .php 文件。

步骤 5 – 使用 Nginx 测试 PHP

您可以测试它以验证 Nginx 可以正确地将 .php 文件发送到您的 PHP 处理器。

您可以通过在您的文件根中创建一个测试PHP文件来做到这一点。在您偏好的文本编辑器中打开名为info.php的新文件:

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

将下列行添加到新文件中. 这是有效的 PHP 代码,将返回有关您的服务器的信息:

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

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

您现在可以在您的 Web 浏览器中访问此页面,访问您在 Nginx 配置文件中设置的域名或公共 IP 地址,然后是 /info.php:

1http://server_domain_or_IP/info.php

您将收到一个包含您服务器的详细信息的网页:

PHPInfo Ubuntu 22.04

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

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

您可以随时重建此文件,如果您需要它以后。

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

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

<$>[note] **注: ** 某些旧版本的原始MySQL PHP库 mysqlnd 不支持 caching_sha2_authentication,默认身份验证方法为MySQL 8,您可能需要确保它们配置使用mysql_native_password而不是。

我们将创建一个名为 example_database 的数据库和一个名为 ** example_user** 的用户,但您可以用不同的值代替这些名称。

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

1sudo mysql

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

1CREATE DATABASE example_database;

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

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

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

现在我们需要在example_database数据库上授予此用户权限:

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

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

现在,用以下命令离开MySQL壳:

1exit

您可以通过再次登录到MySQL控制台来测试新用户是否具有适当的权限,这一次使用自定义用户凭证。注意此命令中的p旗,该命令会提示您在创建 example_user 用户时使用的密码:

1mysql -u example_user -p

登录 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 的测试表。

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 脚本中:

 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://server_domain_or_IP/todo_list.php

您应该收到如下的一页,显示您在测试表中插入的内容:

Example PHP todo list

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

结论

在本指南中,您建立了一个灵活的基础,以便为您的访问者提供PHP网站和应用程序,使用NGINX作为Web服务器和MySQL作为数据库系统。您也可以使用ApacheWeb服务器,查看我们在Ubuntu 22.04上安装Linux,Apache,MySQL,PHP(LAMP)堆栈的教程(https://andsky.com/tech/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-22-04)。

Published At
Categories with 技术
comments powered by Disqus