如何在 Ubuntu 18.04 上安装 Linux、Nginx、MySQL、PHP(LEMP 堆栈)
介绍
LEMP 软件堆栈是一组可用于为动态网页和 Web 应用程序提供服务的软件。这是描述 Linux 操作系统的首字母缩写词,带有 Nginx(读作“Engine-X”)Web 服务器。后端数据存储在 MySQL 数据库中,动态处理由 PHP 处理。
本指南演示了如何在 Ubuntu 18.04 服务器上安装 LEMP 堆栈。 Ubuntu 操作系统满足了第一个要求。我们将描述如何启动和运行其余组件。
先决条件
在完成本教程之前,您应该在服务器上拥有一个具有 sudo
权限的常规非根用户帐户。通过完成我们的 Ubuntu 18.04 初始服务器设置指南来设置此帐户。
一旦您的用户可用,您就可以开始执行本指南中概述的步骤。
第 1 步 – 安装 Nginx Web 服务器
为了向您的站点访问者显示网页,您将使用 Nginx,一种现代、高效的 Web 服务器。
此过程中使用的所有软件都来自 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 浏览器中尝试其中的每一个。
或者,您可以检查从互联网上的其他位置查看哪个 IP 地址是可访问的:
- curl -4 icanhazip.com
在网络浏览器中输入您收到的地址,它将带您进入 Nginx 的默认登录页面:
http://server_domain_or_IP

如果您收到一个网页,上面写着“欢迎使用 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
接下来,系统会要求您提交并确认根密码:
Please set the password for root here.
New password:
Re-enter new password:
对于其余的问题,您应该在每次出现提示时按 Y
并按 ENTER
键。这将删除一些匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便 MySQL 立即遵守我们所做的更改。
请注意,在运行 MySQL 5.7(及更高版本)的 Ubuntu 系统中,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)
此示例演示了根用户实际上使用 auth_socket
插件进行身份验证。要将根帐户配置为使用密码进行身份验证,请运行以下 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要求本软件进行处理。
注意:根据您的云提供商,您可能需要添加 Ubuntu 的 universe
存储库,其中包括由 Ubuntu 社区维护的免费和开源软件,然后再安装 php-fpm
包裹。您可以通过键入以下命令来执行此操作:
- 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
通过创建一个新的服务器块配置文件,而不是编辑默认配置文件,您将能够在需要时恢复默认配置。
将从默认服务器块配置文件中获取并稍作修改的以下内容添加到新的服务器块配置文件中:
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 /
— 第一个 location 块包含一个try_files
指令,它检查是否存在与 URI 请求匹配的文件。如果 Nginx 找不到合适的文件,它将返回 404 错误。location ~ \.php$
— 此位置块通过将 Nginx 指向fastcgi-php.conf
配置文件和php7 来处理实际的 PHP 处理.2-fpm.sock
文件,它声明了与php-fpm
关联的套接字。location ~ /\.ht
— 最后一个位置块处理 Nginx 不处理的.htaccess
文件。通过添加deny all
指令,如果任何.htaccess
文件碰巧进入文档根目录,它们将不会被提供给访问者。
添加此内容后,保存并关闭文件。如果您使用的是 nano
,则可以通过按 CTRL + X
然后按 Y
和 ENTER
来执行此操作。通过创建从新服务器块配置文件(在 /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 代码:
<?php
phpinfo();
完成后,保存并关闭文件。
现在,您可以通过访问服务器的域名或公共 IP 地址后跟 /info.php
来在 Web 浏览器中访问此页面:
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 提供内容。