如何在Ubuntu18.04上安装Linux、Nginx、MySQL、PHP(LEMP堆栈)

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

介绍

LEMP 软件堆栈是一组可用于提供动态网页和 Web 应用程序的软件。 这是描述 Linux 操作系统的首字母缩写词,带有 Nginx(发音为“Engine-X”)Web 服务器。 后端数据存储在MySQL数据库中,动态处理由PHP处理。

本指南演示了如何在 Ubuntu 18.04 服务器上安装 LEMP 堆栈。 Ubuntu 操作系统满足第一个要求。 我们将描述如何启动并运行其余组件。

先决条件

在完成本教程之前,您应该在您的服务器上拥有一个具有 sudo 权限的常规非 root 用户帐户。 通过完成我们的 Ubuntu 18.04 初始服务器设置指南来设置此帐户。

一旦您的用户可用,您就可以开始本指南中概述的步骤了。

第 1 步 – 安装 Nginx Web 服务器

为了向您的网站访问者显示网页,您将使用 Nginx,一种现代、高效的网络服务器。

此过程中使用的所有软件都来自 Ubuntu 的默认软件包存储库。 这意味着您将使用 apt 包管理套件来完成必要的安装。

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

sudo apt update

接下来,安装服务器:

sudo apt install nginx

在 Ubuntu 18.04 上,Nginx 配置为在安装时开始运行。

如果您正在运行 ufw 防火墙,如初始设置指南中所述,您将需要允许连接到 Nginx。 Nginx 在安装时会使用 ufw 进行注册,因此过程相当简单。

建议您启用仍然允许您想要的流量的最严格的配置文件。 由于您没有在本指南中为您的服务器配置 SSL,您只需要允许端口 80 上的流量。

通过键入以下内容启用此功能:

sudo ufw allow 'Nginx HTTP'

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

sudo ufw status

此命令的输出将显示允许 HTTP 流量:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

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

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

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

这将打印出一些 IP 地址。 您可以在 Web 浏览器中尝试其中的每一个。

作为替代方案,您可以检查从 Internet 上的其他位置查看的 IP 地址是可访问的:

curl -4 icanhazip.com

在您的网络浏览器中输入您收到的地址,它将带您进入 Nginx 的默认登录页面:

http://server_domain_or_IP

如果你收到一个网页显示 “Welcome to nginx”,那么你已经成功安装了 Nginx。

第 2 步 - 安装 MySQL 以管理站点数据

现在您有了一个 Web 服务器,您需要安装 MySQL(一个数据库管理系统)来存储和管理您站点的数据。

通过键入以下命令安装 MySQL:

sudo apt install mysql-server

MySQL 数据库软件现已安装,但其配置尚未完成。

为了确保安装安全,MySQL 附带了一个脚本,该脚本会询问您是否要修改一些不安全的默认值。 通过键入以下内容来启动脚本:

sudo mysql_secure_installation

此脚本将询问您是否要配置 VALIDATE PASSWORD PLUGIN

警告: 启用此功能是一个判断调用。 如果启用,不符合指定条件的密码将被 MySQL 拒绝并出现错误。 如果您将弱密码与自动配置 MySQL 用户凭据的软件(例如 phpMyAdmin 的 Ubuntu 软件包)结合使用,这将导致问题。 禁用验证是安全的,但您应该始终为数据库凭据使用强而唯一的密码。


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

接下来,您将被要求提交并确认 root 密码:

Please set the password for root here.

New password:

Re-enter new password:

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

请注意,在运行 MySQL 5.7(及更高版本)的 Ubuntu 系统中,root MySQL 用户默认设置为使用 auth_socket 插件进行身份验证,而不是使用密码。 这在许多情况下允许更高的安全性和可用性,但是当您需要允许外部程序(例如,phpMyAdmin)访问用户时,它也会使事情变得复杂。

如果使用 auth_socket 插件访问 MySQL 适合您的工作流程,您可以继续执行步骤 3。 但是,如果您在以 root 身份连接到 MySQL 时更喜欢使用密码,则需要将其身份验证方法从 auth_socket 切换到 mysql_native_password。 为此,请从终端打开 MySQL 提示符:

sudo mysql

接下来,使用以下命令检查每个 MySQL 用户帐户使用的身份验证方法:

SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

此示例演示 root 用户实际上使用 auth_socket 插件进行身份验证。 要配置 root 帐户以使用密码进行身份验证,请运行以下 ALTER USER 命令。 请务必将 password 更改为您选择的强密码:

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

然后,运行 FLUSH PRIVILEGES 告诉服务器重新加载授权表并使您的新更改生效:

FLUSH PRIVILEGES;

再次检查每个用户使用的身份验证方法,以确认 root 不再使用 auth_socket 插件进行身份验证:

SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

此示例输出显示 root MySQL 用户现在使用密码进行身份验证。 一旦你在你自己的服务器上确认了这一点,你就可以退出 MySQL shell:

exit

注意:在你的root MySQL用户配置密码验证后,你将无法再使用之前使用的sudo mysql命令访问MySQL。 相反,您必须运行以下命令:

mysql -u root -p

输入您设置的密码后,您将收到 MySQL 提示。


至此,您的数据库系统现已设置完毕,您可以继续安装 PHP。

第 3 步 - 安装 PHP 并配置 Nginx 以使用 PHP 处理器

现在安装了 Nginx 来为您的页面提供服务,并安装了 MySQL 来存储和管理您的数据。 但是,您仍然没有任何东西可以生成动态内容。 这就是 PHP 发挥作用的地方。

由于 Nginx 不像其他一些 Web 服务器那样包含原生 PHP 处理,因此您需要安装 php-fpm,它代表“fastCGI 进程管理器”。 之后,您将告诉 Nginx 将 PHP 请求传递给该软件进行处理。

注意:根据您的云提供商,您可能需要在安装 php-fpm 之前添加 Ubuntu 的 universe 存储库,其中包括由 Ubuntu 社区维护的免费和开源软件] 包裹。 您可以通过键入以下命令来执行此操作:

sudo add-apt-repository universe

安装 php-fpm 模块以及附加的帮助程序包 php-mysql,这将允许 PHP 与您的数据库后端进行通信。 安装将引入必要的 PHP 核心文件。 通过键入以下内容来执行此操作:

sudo apt install php-fpm php-mysql

即使安装了所有必需的 LEMP 堆栈组件,您仍然需要进行一些配置更改,以便告诉 Nginx 使用 PHP 处理器处理动态内容。

这是在服务器块级别完成的(服务器块类似于 Apache 的虚拟主机)。 为此,请使用您首选的文本编辑器在 /etc/nginx/sites-available/ 目录中创建一个新的服务器块配置文件。 在此示例中,我们将使用 nano 并且新的服务器块配置文件将显示 your_domain,因此您可以将其替换为您自己的信息:

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

通过创建一个新的服务器块配置文件,而不是编辑默认配置文件,您可以在需要时恢复默认配置。

将以下内容(从默认服务器块配置文件中获取并稍作修改)添加到新的服务器块配置文件中:

/etc/nginx/sites-available/your_domain

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name your_domain;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

以下是每个指令和位置块的作用:

  • listen - 定义 Nginx 将侦听的端口。 在这种情况下,它将侦听端口 80,这是 HTTP 的默认端口。
  • root — 定义存储网站提供的文件的文档根目录。
  • index - 配置 Nginx 在请求索引文件(如果可用)时优先处理名为 index.php 的服务文件。
  • server_name - 定义哪个服务器块应该用于对您的服务器的给定请求。 将此指令指向您服务器的域名或公共IP地址。
  • location / — 第一个位置块包括一个 try_files 指令,它检查是否存在与 URI 请求匹配的文件。 如果 Nginx 找不到合适的文件,会返回 404 错误。
  • location ~ \.php$ - 此位置块通过将 Nginx 指向 fastcgi-php.conf 配置文件和 php7.2-fpm.sock 文件来处理实际的 PHP 处理,该文件声明与 [X194X 关联的套接字]。
  • location ~ /\.ht - 最后一个位置块处理 .htaccess 文件,Nginx 不处理这些文件。 通过添加 deny all 指令,如果任何 .htaccess 文件碰巧进入文档根目录,它们将不会被提供给访问者。

添加此内容后,保存并关闭文件。 如果您正在使用 nano,您可以通过按 CTRL + X 然后按 YENTER 来执行此操作。 通过创建从新服务器块配置文件(在 /etc/nginx/sites-available/ 目录中)到 /etc/nginx/sites-enabled/ 目录的符号链接来启用新服务器块:

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

然后,从 /sites-enabled/ 目录中取消链接默认配置文件:

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

注意:如果您需要恢复默认配置,您可以通过使用如下命令重新创建符号链接来实现:

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

测试新配置文件的语法错误:

sudo nginx -t

如果报告任何错误,请返回并重新检查您的文件,然后再继续。

准备好后,重新加载 Nginx 以进行必要的更改:

sudo systemctl reload nginx

LEMP 堆栈的安装和配置到此结束。 但是,谨慎的做法是确认所有组件都可以相互通信。

第 4 步 – 创建一个 PHP 文件来测试配置

您的 LEMP 堆栈现在应该已完全设置。 您可以对其进行测试以验证 Nginx 是否可以正确地将 .php 文件交给 PHP 处理器。

为此,请使用您喜欢的文本编辑器在文档根目录中创建一个名为 info.php 的测试 PHP 文件:

sudo nano /var/www/html/info.php

在新文件中输入以下行。 这是有效的 PHP 代码,它将返回有关您的服务器的信息:

/var/www/html/info.php

<?php
phpinfo();

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

现在,您可以在您的网络浏览器中访问此页面,方法是访问您的服务器的域名或公共 IP 地址,后跟 /info.php

http://your_server_domain_or_IP/info.php

您的浏览器将加载由 PHP 生成的如下网页,其中包含有关您的服务器的信息:

如果您的页面与描述的一样,则您已成功使用 Nginx 设置 PHP 处理。

在验证 Nginx 正确呈现页面后,最好删除您创建的文件,因为它实际上可以为未经授权的用户提供一些有关您的配置的提示,这可能有助于他们尝试闯入。 如果以后需要,您可以随时重新生成此文件。

现在,删除文件:

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

有了它,您的 Ubuntu 18.04 服务器上就有了一个完全配置且正常运行的 LEMP 堆栈。

结论

LEMP 堆栈是一个强大的平台,可让您从您的服务器设置和服务几乎任何网站或应用程序。

您可以从这里采取许多后续步骤。 例如,您应该确保与服务器的连接是安全的。 为此,您可以 使用 Let's Encrypt 保护您的 Nginx 安装。 通过遵循本指南,您将为您的服务器获得免费的 TLS/SSL 证书,允许它通过 HTTPS 提供内容。