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

介绍

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

本指南展示了如何在Ubuntu 20.04服务器上安装LEMP堆栈。Ubuntu操作系统照顾第一个要求。我们将描述如何将其余的组件加载并运行。

前提条件

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

步骤1:安装 Nginx Web 服务器

为了向我们的网站访问者显示网页,我们将使用高性能网页服务器 Nginx,我们将使用apt包管理器获取该软件。

由于这是我们第一次使用apt这个会话,开始更新你的服务器的包索引,然后,你可以使用apt install来安装 Nginx:

1sudo apt update
2sudo apt install nginx

当被提示时,输入Y来确认您想要安装 Nginx. 安装完成后, Nginx Web 服务器将被激活并在您的 Ubuntu 20.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 eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

這將打印出幾個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是的,或其他任何事情,不允许继续。

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 22
 4Server version: 8.0.19-0ubuntu5 (Ubuntu)
 5
 6Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
 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 权限的系统用户。

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

<$>[注] 注: 在此写作时,原生MySQL PHP库 mysqlnd 不支持 caching_sha2_authentication,默认身份验证方法为MySQL 8。 因此,在创建PHP应用程序的PHP数据库用户时,您需要确保它们配置使用‘mysql_native_password’而不是。 我们将在 [步骤 6]中展示如何做到这一点(#step-6-%E2%80%94-testing-database-connection-from-php-(可选)。

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

步骤三:安装PHP

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

虽然Apache在每个请求中嵌入PHP翻译器,但 Nginx需要一个外部程序来处理PHP处理,并作为PHP翻译器本身和Web服务器之间的桥梁。这允许大多数PHP基于网站的整体性能更好,但需要额外的配置。您需要安装php-fpm,这代表PHP fastCGI流程管理器,并告诉Nginx将PHP请求传递给该软件进行处理。此外,您还需要php-mysql,一个PHP模块,允许PHP与MysSQL基于的数据库进行通信。

要安装php-fpmphp-mysql包,请运行:

1sudo apt install php-fpm php-mysql

当提示时,键入YENTER,以确认安装。

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

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

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

在Ubuntu 20.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/php7.4-fpm.sock;
16     }
17
18    location ~ /\.ht {
19        deny all;
20    }
21
22}

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

  • `倾听 ' -- -- 界定Nginx港将听什么。 在这种情况下,它将听取HTTP的默认港口 " 80 " 。
  • `root' – 定义此网站所服务文件存储的文档根 。
  • index' – 定义Nginx为该网站优先排序索引文件的顺序. 通常的做法是列出index.html'文件,其优先位置高于`index'。 php ' 文件,以便在 PHP 应用程序中快速设置维护登陆页. 您可以调整这些设置以更好地适应您的应用程序需求 。
  • `server_name' – 定义哪个域名和/或IP地址是服务器块应该响应的. ** 将此指令指向您的服务器域名或公共IP地址。 **
  • 位置 / — 第一个位置块包括一个 try_ files 指令,该指令检查与 URI 请求匹配的文件或目录是否存在。 如果 Nginx 找不到合适的资源, 它会返回一个 404 个错误 。 *地点~\.php$' - 这个位置块处理实际的 PHP 处理方式是将 Nginx 指向 fastcgi-php.conf配置文件和php7.4-fpm.sock 文件,该文件宣布了与php-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();

完成后,保存并关闭文件,键入CTRL+X,然后yENTER来确认。

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

1http://server_domain_or_IP/info.php

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

PHPInfo Ubuntu 20.04

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

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

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

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

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

在本文写作时,原生MySQL PHP库mysqlnd不支持(https://www.php.net/manual/en/ref.pdo-mysql.php)`caching_sha2_authentication`,这是MySQL 8的默认身份验证方法。

我们将创建一个名为 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控制台来测试新用户是否有正确的权限,这一次使用自定义用户凭证:

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

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 表的内容,在列表中显示结果. 如果数据库连接出现问题,它会引发一个例外。

 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作为数据库系统。

Published At
Categories with 技术
comments powered by Disqus