在 Ubuntu 20.04 LTS 上安装 Nginx、MySQL、PHP(LEMP 堆栈)

在我们之前的教程中,我们讨论了如何 在 Ubuntu 20.04 LTS 中安装 LAMP 堆栈 服务器。 在本教程中,我们将了解如何在 Ubuntu 20.04 LTS 服务器版上安装 Nginx、MySQL、PHP(LEMP 堆栈)。 LEMP 是 大号内克斯,Engine-x, 咏叹调/ySQL, 生命值/错误/ython。

在 Ubuntu 20.04 LTS 上安装 Nginx、MySQL、PHP(LEMP 堆栈)

出于本教程的目的,我将使用以下测试机器:

  • 操作系统 : Ubuntu 20.04 LTS 服务器
  • IP地址 : 192.168.225.52/24

让我们开始吧。

1. 在 Ubuntu 上安装 Nginx

从终端运行以下命令来安装 Nginx 网络服务器:

$ sudo apt install nginx

安装 Nginx 后,使用命令检查 Nginx 服务是否正在运行:

$ sudo systemctl status nginx

样本输出:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-05-29 10:13:47 UTC; 56s ago
       Docs: man:nginx(8)
   Main PID: 1349 (nginx)
      Tasks: 2 (limit: 2283)
     Memory: 4.4M
     CGroup: /system.slice/nginx.service
             ├─1349 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─1350 nginx: worker process

May 29 10:13:46 ubuntuserver systemd[1]: Starting A high performance web server and a reverse proxy server...
May 29 10:13:47 ubuntuserver systemd[1]: Started A high performance web server and a reverse proxy server.

如果您看到类似上面的输出,则 Nginx 服务已启动。

如果 Nginx 服务尚未启动,您可以使用以下命令启动它:

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

1.1 通过 UFW 防火墙允许 Nginx Web 服务器

UFW, 代表 ü不复杂 F愤怒wall,是一个用于管理 netfilter 防火墙的程序,其设计易于使用。 默认情况下,UFW 在所有 Ubuntu 版本中都可用。

默认情况下,如果您在 Ubuntu 20.04 LTS 中启用了 UFW 防火墙,则无法从远程系统访问 Nginx Web 浏览器。 您必须允许 httphttps 按照下面给出的步骤进行端口。

首先,让我们使用命令查看哪些应用程序安装了配置文件:

$ sudo ufw app list

样本输出:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

如您所见,Nginx 和 OpenSSH 应用程序已经安装了 UFW 配置文件。

如果您查看 “Nginx 满” 配置文件,您将看到它启用了到端口的流量 80443

$ sudo ufw app info "Nginx Full"

样本输出:

Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server

Ports:
80,443/tcp

现在,运行以下命令以允许此配置文件的传入 HTTP 和 HTTPS 流量:

$ sudo ufw allow in "Nginx Full"

您将看到如下输出:

Rules updated
Rules updated (v6)

如果您想允许 https 流量,但只允许 http (80) 流量,请运行:

$ sudo ufw app info "Nginx HTTP"

让我们继续运行 Nginx 测试页面。

为此,请打开您的 Web 浏览器并导航到 https://localhost/ 或者 https://IP 地址/.

您将看到如下所示的 Nginx 欢迎页面。

恭喜! Nginx 服务器正在工作!

2. 在 Ubuntu 上安装 MySQL

要在 Ubuntu 上安装 MySQL,请运行:

$ sudo apt install mysql-server

使用命令验证 MySQL 服务是否正在运行:

$ sudo systemctl status mysql

样本输出:

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-05-29 10:31:56 UTC; 51s ago
   Main PID: 2288 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 2283)
     Memory: 325.6M
     CGroup: /system.slice/mysql.service
             └─2288 /usr/sbin/mysqld

May 29 10:31:49 ubuntuserver systemd[1]: Starting MySQL Community Server...
May 29 10:31:56 ubuntuserver systemd[1]: Started MySQL Community Server.

正如您在上面的输出中看到的,Mysql 正在运行!

2.1 为 Mysql 设置数据库管理用户(root)密码

默认情况下,MySQL 用户密码为空。 不建议对数据库管理帐户使用空密码。 您需要通过运行以下脚本来保护您的 MySQL 服务器:

$ sudo mysql_secure_installation

系统将询问您是否要设置 “验证密码” 组件与否。 该组件允许用户为数据库凭据配置强密码。 如果启用,它将自动检查密码强度并强制用户仅设置足够安全的密码。 将其禁用是安全的. 但是,您必须为数据库凭据使用强且唯一的密码。 如果您不想启用此组件,只需按任意键即可跳过密码验证部分并继续其余步骤。

如果你的答案是 是的,您将被要求选择密码验证的级别。

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

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 y

可用的密码验证是 低的, 中等的强的. 只需输入适当的数字(0 表示低密码,1 表示中等密码,2 表示强密码),然后按 ENTER 键。

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: 0

现在,输入 MySQL root 用户的密码。 请注意,您必须根据您在上一步中选择的密码策略为 mysql root 用户使用密码。 如果您没有启用该插件,只需使用您选择的任何强且唯一的密码。

Please set the password for root here.

New password:

Re-enter new password:

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

输入两次密码后,您将看到密码强度(在我们的例子中是 100)。 如果您可以,请按 Y 继续使用提供的密码。 如果对密码长度不满意,请按任何其他键并设置强密码。 我对我当前的密码没问题,所以我选择了 是的.

对于其余的问题,只需键入 是的 并按 ENTER。 这将删除匿名用户,禁止 root 用户远程登录并删除测试数据库。

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.

- Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

完毕! 我们已经设置了 MySQL root 用户的密码。

2.2 更改 MySQL root 用户的认证方式

默认情况下,MySQL root 用户设置为使用 “auth_socket” 从 MySQL 5.7 和 Ubuntu 上的更新版本开始的插件。 尽管它增强了安全性,但当您使用任何外部程序访问数据库服务器时,它也会使事情变得复杂,例如 example phpMyAdmin。 要解决此问题,您需要将身份验证方法从 auth_socket 更改为 “caching_sha2_password” 或者 “mysql_native_password”.

从 MySQL 8.0 版本开始,首选和默认的身份验证插件是 cache_sha2_password. cache_sha2_password 身份验证插件提供比 mysql_native_password 插件更安全的密码加密。

要更改身份验证插件,请使用命令登录到您的 MySQL 提示符:

$ sudo mysql

在 mysql 提示符下运行以下命令,查找所有 mysql 用户帐户的当前身份验证方法:

mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;

样本输出:

+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user             | authentication_string                                                  | plugin                | host      |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | $A$005$=s%UO"�[email protected]>[email protected] | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| root             |                                                                        | auth_socket           | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
5 rows in set (0.00 sec)

如您所见,mysql root 用户使用 auth_socket 用于身份验证的插件。

要将 auth_socket 插件更改为 caching_sha2_password,请在 mysql 提示符下运行以下命令。 如果您启用了验证密码插件,请确保您使用了基于当前政策要求的强密码。 一个strong应该由至少8个字符组成,包括一个大写字母、一个小写字母、一个数字和一个特殊字符。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Password123#@!';

代替 “密码123#@!” 在上述命令中使用您选择的强大且唯一的密码。

使用命令更新更改:

mysql> FLUSH PRIVILEGES;

现在使用命令检查当前的身份验证插件是否已更改:

mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;

样本输出:

检查mysql中当前的身份验证插件

好的! 现在 mysql root 用户可以使用密码进行身份验证以访问 mysql shell。

Exit 从 mysql 提示符:

mysql> exit

笔记:

尽管 caching_sha2_password 插件提供了增强的安全加密,但它与现有的 MySQL 安装存在一些兼容性问题。 有关详细信息,请参阅 这个链接. 如果遇到任何兼容性问题,则需要设置 “mysql_native_password” 插件作为默认身份验证插件。

更改为 mysql_native_password 插件,在 mysql 提示符下运行以下命令。

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

使用命令更新更改:

mysql> FLUSH PRIVILEGES;

现在再次使用命令检查身份验证方法是否更改:

mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;

样本输出:

查找所有 mysql 用户帐户的当前身份验证方法

Exit 在 mysql 提示符下输入以下命令:

exit

3. 在 Ubuntu 上安装 PHP

要安装 PHP,请运行:

$ sudo apt-get install php-fpm php-mysql

安装 PHP 后,我们需要通过简单的更改来保护它 php.ini 文件。

为此,请编辑 php.ini 使用您喜欢的编辑器创建文件:

$ sudo vi /etc/php/7.4/fpm/php.ini

找到以下行:

;cgi.fix_pathinfo=1

取消注释并更改其值 10(零).

cgi.fix_pathinfo=0

Save 和 close 文件。 然后,重新启动 PHP-FPM 服务以使更改生效。

$ sudo systemctl restart php7.4-fpm

使用命令检查 PHP-FPM 服务是否正在运行:

$ sudo systemctl status php7.4-fpm

样本输出:

● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: en>
     Active: active (running) since Fri 2020-05-29 10:40:45 UTC; 11s ago
       Docs: man:php-fpm7.4(8)
    Process: 10711 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/ph>
   Main PID: 10693 (php-fpm7.4)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 2283)
     Memory: 7.0M
     CGroup: /system.slice/php7.4-fpm.service
             ├─10693 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
             ├─10709 php-fpm: pool www
             └─10710 php-fpm: pool www

May 29 10:40:44 ubuntuserver systemd[1]: Starting The PHP 7.4 FastCGI Process Manager...
May 29 10:40:45 ubuntuserver systemd[1]: Started The PHP 7.4 FastCGI Process Manager.

3.1 配置 Nginx 使用 PHP-FPM

我们需要配置 Nginx 以使用 PHP-FPM。

为此,请编辑 Nginx 的默认虚拟主机(服务器块) /etc/nginx/sites-available/default 文件:

$ sudo vi /etc/nginx/sites-available/default

找到服务器部分,并设置您的 Ubuntu 服务器的 FQDN 或 IP 地址,如下所示。 此外,请仔细检查您是否添加了 索引.php 线。 所有更改均以粗体字显示。

[...]
server {
 listen 80 default_server;
 listen [::]:80 default_server;

[...]

root /var/www/html;

 # Add index.php to the list if you are using PHP
 index index.php index.html index.htm index.nginx-debian.html;

 server_name 192.168.225.52;
[...]

配置 Nginx 以使用 PHP-FPM

这里,

  • 听 80; -> 监听 ipv4。
  • 听 [::]:80 默认服务器; -> 监听 ipv6。
  • 索引.php -> 如果您使用 PHP,请添加此项。
  • 根 /var/www/html; -> Nginx 文档根目录。
  • 服务器名称 192.168.225.52; -> 我们的 Ubuntu 服务器的 IP 地址。

然后,向下滚动一点,找到 “#location ~ .php$” 部分。

取消注释并修改以下行,如下所示。

location ~ .php$ {
include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
 # concurs with nginx's one
 #
 location ~ /.ht {
 deny all;
 }
}

请参阅以下屏幕截图。 更改用红色标记/下划线。

在 Ubuntu 中配置 Nginx 以使用 PHP-FPM

Save 并退出文件。

支付 close 修改时注意 fastcgi_pass 指令内 位置 ~ .php$ 堵塞。 您必须提及正确的名称文件以及实际存储在 /var/运行/php 服务器上的目录。 要验证它,请运行:

$ ls /var/run/php/
php-fpm.sock php7.4-fpm.pid php7.4-fpm.sock

如您所见,文件的名称是 php7.4-fpm.sock. 确保您在此指令中提到了正确的名称。

使用以下命令检查 Nginx 配置文件是否有任何语法错误:

$ sudo nginx -t

样本输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果您没有看到任何错误,请重新启动 nginx 服务以使更改生效。

为此,请运行:

$ sudo systemctl restart nginx

现在,让我们创建一个示例 PHP 文件来通过浏览器测试 PHP 配置。

为此,请在 Nginx 文档根文件夹下创建一个名为“info.php”的文件。

$ sudo vi /var/www/html/info.php

添加以下行:

<?php
phpinfo();
?>

Save 并退出文件。 重新启动 nginx 服务以使更改生效。

$ sudo systemctl restart nginx

然后,打开您的网络浏览器并导航到 https://IP地址/info.php.

您将看到 PHP 详细信息。

PHP-FPM 信息页面

恭喜! PHP 正在运行!!

3.2 安装 PHP 模块

为了改进 PHP 的功能,您可以安装一些额外的 PHP 模块。

要列出可用的 PHP 模块,请运行:

$ sudo apt-cache search php- | less

样本输出:

列出 Ubuntu 20.04 中所有可用的 PHP 模块

使用 和 箭头在结果之间上下移动。 要退出,请键入 q.

要查找任何特定 php 模块的详细信息,对于 example php-gd, 跑:

$ sudo apt-cache show php-gd

要安装 php 模块,请运行:

$ sudo apt-get install php-gd

要安装所有模块(虽然不是必需的),请运行:

$ sudo apt-get install php*

安装任何 php 模块后不要忘记重新启动 Nginx 服务。

恭喜! 我们已经在 Ubuntu 20.04 LTS 服务器中成功设置了 LEMP 堆栈。 开始在您的新 LEMP Web 堆栈中部署网站和 Web 应用程序。

阅读下一篇:

  • 在 Ubuntu 20.04 LTS 上使用 LEMP 堆栈安装 phpMyAdmin

感谢您的光临!

帮助我们帮助您:

祝你有美好的一天!!