本教程适用于以下操作系统版本

  • Ubuntu 24.04 (Noble Numbat)
  • Ubuntu 22.04 (Jammy Jellyfish)
  • Ubuntu 20.04 (Focal Fossa)
  • Ubuntu 20.04 (Focal Fossa)
  • Ubuntu 18.04 (Bionic Beaver)
  • Ubuntu 16.04 (Xenial Xerus)

本页内容

  • 先决条件
  • 配置防火墙
  • 安装 PHP
  • 安装 MariaDB
  • 安装 Redis
  • 配置 Redis 服务器
  • 安装 Nginx
  • 配置 Nginx
  • 配置 PHP-FPM
  • 安装 phpMyAdmin
  • 配置 phpMyAdmin
  • 配置 Opcache
  • 通过 Let's Encrypt 安装 SSL
  • 验证 SSL 自动续期
  • 结论

缩写“LEMP”代表一组通常一起安装的软件,用于让服务器托管动态网站和 Web 应用。这个术语实际上是一个缩写,代表四个关键组件:

  • L inux:操作系统。Linux 是一个流行的开源操作系统,作为服务器的基础。
  • E ngine-X(读作“nginx”):Web 服务器。Nginx 是一个高性能的 Web 服务器,以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。
  • M ySQL 或 MariaDB:数据库系统。MySQL 是一个广泛使用的关联式数据库管理系统,用于存储和管理网站或应用的数据。注意 MySQL 有时会被 MariaDB 取代,后者是 MySQL 的一个增强的、完全开源的、由社区开发的衍生版本。
  • P HP:编程语言。PHP 是一种为 Web 开发设计的服务器端脚本语言,但也用作通用编程语言。

LEMP 栈是托管需要数据库和服务器端处理的网站(如 WordPress 网站、电子商务平台以及其他动态 Web 应用)的热门选择。它可与 LAMP 栈相媲美,后者使用 Apache(即 LAMP 中“A”所代表的)来替代 Nginx。

在本指南中,你将在基于 Ubuntu 20.04 的服务器上安装 LEMP 栈。我们还将安装 phpMyAdmin、Redis、Opcache 以及 Let's Encrypt SSL。

先决条件

  • 一台运行 Ubuntu 20.04 的服务器。
  • 一个非 root 的 sudo 用户。
  • 确保所有内容都已更新。 $ sudo apt update $ sudo apt upgrade
  • 你的系统需要的一些软件包。 $ sudo apt install wget curl nano -y 其中部分软件包可能已在你的系统上安装。

一台运行 Ubuntu 20.04 的服务器。

一个非 root 的 sudo 用户。

确保所有内容都已更新。

$ sudo apt update
$ sudo apt upgrade

你的系统需要的一些软件包。

$ sudo apt install wget curl nano -y

其中部分软件包可能已在你的系统上安装。

配置防火墙

第一步是配置防火墙。Ubuntu 默认自带 ufw(Uncomplicated Firewall)。

检查防火墙是否正在运行。

$ sudo ufw status

你应该会得到如下输出。

Status: inactive

放行 SSH 端口,以免启用防火墙时中断当前连接。

$ sudo ufw allow OpenSSH

同时放行 HTTP 和 HTTPS 端口。

$ sudo ufw allow 80
$ sudo ufw allow 443

启用防火墙

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

再次检查防火墙的状态。

$ sudo ufw status

你应该会看到类似的输出。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

安装 PHP

Ubuntu 20.04 默认附带 PHP 7.4,但为了使用更新的 PHP 软件源,我们将添加 Ondrej 的 PHP 仓库。

安装 Ondrej 的 PHP 仓库。

$ sudo add-apt-repository ppa:ondrej/php

安装 PHP 7.4 以及一些额外软件包。

$ sudo apt install php-cli php-fpm php-mysql -y

检查 PHP 是否正常工作。

$ php --version

你应该会看到类似的输出。

PHP 7.4.5 (cli) (built: Apr 28 2020 14:49:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies

安装 MariaDB

MariaDB 是 MySQL 的即插即用替代品,这意味着运行和操作 MariaDB 的命令与 MySQL 相同。

Ubuntu 20.04 默认附带 MariaDB 10.3,略显过时。为了获取 MariaDB 的最新稳定版,我们将安装其官方仓库。

添加 MariaDB 的官方仓库。

$ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
$ sudo add-apt-repository 'deb [arch=amd64] http://mirror.lstn.net/mariadb/repo/10.4/ubuntu focal main'

要安装 MariaDB,请执行以下命令。

$ sudo apt install mariadb-server -y

检查 MariaDB 是否安装正确。

$ mysql --version

你应该会看到如下输出。

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

启用 MariaDB 服务。

$ sudo systemctl enable mariadb

运行以下命令执行默认安全配置,例如设置 root 密码、删除匿名用户、禁止 root 远程登录以及删除测试表。

$ sudo mysql_secure_installation

使用 MariaDB 10.4 时,系统会询问你使用 root 密码还是 unix_socket 插件。unix_socket 插件允许你使用 Linux 用户凭据登录 MariaDB。这被认为更安全,不过你需要传统的用户名/密码来使用 phpMyAdmin 等第三方应用。本教程将坚持使用 unix_socket 插件。你仍然可以通过为数据库创建的任意特定用户来使用 phpMyAdmin。

按回车键会选择默认选项(即大写字母对应的选项,此处为 Y)。

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): [PRESS ENTER]
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] [PRESS ENTER]
Enabled successfully!
Reloading privilege tables..
 ... Success!

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] [ANSWER n]
... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] [PRESS ENTER]
 ... 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? [Y/n] [PRESS ENTER]
 ... Success!

By default, MariaDB 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? [Y/n] [PRESS ENTER]
 \- 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? [Y/n] [PRESS ENTER]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

就这样。下次你想登录 MySQL 时,使用以下命令

$ sudo mysql

在提示时输入你的 root 密码。

安装 Redis

使用以下命令安装 Redis 以及相应的 PHP Redis 扩展。

$ sudo apt install redis php-redis

配置 Redis 服务器

让我们对 Redis 服务器进行一些基本配置。

使用 Nano 编辑器打开 /etc/redis/redis.conf 文件。

$ sudo nano /etc/redis/redis.conf

在文件内,找到 supervised 指令。该指令允许你声明一个 init 系统将 Redis 作为服务管理。它默认设置为 no。由于我们使用的是采用 systemd init 系统的 Ubuntu,请按如下方式将其值从 no 改为 systemd。

supervised systemd

如果你想让远程客户端连接到你的 Redis 实例,请找到 bind 127.0.0.1 这一行,并将其改为以下内容。

bind 0.0.0.0

你也可以将 Redis 监听的默认端口从 6379 改为你选择的数值。

port 3458

要将 Redis 配置为缓存服务器,请按如下设置以下值。

maxmemory 256mb
maxmemory-policy allkeys-lru

这会指示 Redis 在达到 256MB 最大内存时,使用 LRU 算法移除任意键。你可以根据你的需求和所用服务器设置内存值。

你可以设置密码,以便任何需要访问 Redis 的客户端都必须先进行身份验证。为此,请使用以下指令设置密码。

requirepass  <AuthPassword>

你可以在配置文件中找到更多可修改的指令。完成后,按 Ctrl + X,并在提示时输入 Y 以保存文件。

重启 Redis 服务器以应用更改。

$ sudo systemctl restart redis

如果你希望远程客户端连接到它,我们还需要在防火墙中添加相应规则。否则你可以跳过此步骤。

$ sudo ufw allow 6379/tcp

你需要修改上述命令中的端口值,以匹配你在上方配置文件中选择的端口。

安装 Nginx

Ubuntu 20.04 默认附带 Nginx 的最新 Mainline 版本(1.17.10)。不过,我们将切换到使用 Nginx 的官方稳定版仓库。

先安装一些前置依赖。

$ sudo apt install curl gnupg2 ca-certificates lsb-release

其中部分可能已在你的系统上安装。

添加 Nginx 的仓库。

$ echo "deb [arch=amd64] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
$ curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -

安装 Nginx。

$ sudo apt update
$ sudo apt install nginx -y

检查它是否正常工作。

$ nginx -v

你应该会看到如下输出,具体内容取决于你选择安装的 Nginx 版本。

nginx version: nginx/1.18.0

启动并启用 Nginx。

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

在浏览器中打开你服务器的 IP 地址以查看以下页面。这表示 Nginx 运行正常。

在 Ubuntu 20.04 上安装 Nginx PHP MariaDB LEMP 栈

配置 Nginx

创建存放 server block 的目录。

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

创建存放你站点的目录。

$ sudo mkdir /var/www/example.com/html -p

使用 -p 指令会创建此前不存在的父目录。

运行以下命令为你的站点添加配置文件。

$ sudo nano /etc/nginx/sites-available/example.com.conf

在编辑器中粘贴以下代码。

server {
  listen          *:80;
  server_name     example.com;
  root            /var/www/example.com/html;
  index           index.php index.html;

  location / {
    try_files   $uri $uri/ =404;
  }
    
  access_log /var/log/nginx/example.com.access.log;
  error_log /var/log/nginx/example.com.error.log;

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass  unix:/run/php/php7.4-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include  fastcgi_params;
  }
}

按 Ctrl + X 关闭编辑器,并在提示时按 Y 保存文件。

该文件假设我们将在 /var/www/html 目录中托管 example.com。如果你不打算使用任何域名,并且只想通过 IP 地址/localhost 访问服务器,则需要从 nginx.conf 文件中删除相应的 server block 设置,否则它会与你将要创建的 server block 冲突。

通过将其链接到 sites-enabled 目录来启用该配置文件。

$ sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

打开 /etc/nginx/nginx.conf 文件进行编辑。

$ sudo nano /etc/nginx/nginx.conf	

在 include /etc/nginx/conf.d/*.conf 这一行之后粘贴以下行

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;
types_hash_max_size 4096;

按 Ctrl + X 关闭编辑器,并在提示时按 Y 保存文件。测试 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 reload nginx

配置 PHP-FPM

打开 /etc/php-fpm.d/www.conf 文件。

$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf

我们需要将 PHP 进程的 Unix 用户/组设置为 nginx。在文件中找到 user=www-data 和 group=www-data 两行,并将其改为 nginx。

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

同样,在文件中找到 listen.owner=www-data 和 listen.group=www-data 两行,并将其改为 nginx。

listen.owner = nginx
listen.group = nginx

按 Ctrl + X,并在提示时输入 Y 以保存文件。

重启 PHP-fpm 进程。

$ sudo systemctl restart php7.4-fpm

要测试你的 PHP 配置,请在 html 文件夹中创建一个 test.php 文件。

$ sudo nano /var/www/example.com/html/test.php

向其添加以下内容,并按 Ctrl + X,在提示时输入 Y 以保存文件。

<?php phpinfo();

在你的 Web 浏览器中打开 http:///test.php,你应该会看到以下内容。

在 Ubuntu 20.04 上安装 Nginx PHP MariaDB LEMP 栈

安装 phpMyAdmin

本教程中我们将手动安装 phpMyAdmin。

首先,我们需要安装一些额外的 PHP 软件包以使 phpMyAdmin 正常工作。

$ sudo apt install php-mbstring php-zip php-gd php-json php-curl php-bz2 php-xml

切换到 /usr/share 目录,以便将 phpMyAdmin 下载并安装到该处。

$ cd /usr/share

下载 phpMyAdmin 文件。(请从其官网查看最新版本)我们将只安装英文语言版本。

$ sudo wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-english.tar.gz
$ tar xvzf phpMyAdmin-5.0.2-english.tar.gz
$ sudo mv phpMyAdmin-5.0.2-english /usr/share/phpmyadmin
$ sudo rm phpMyAdmin*.tar.gz

为 phpMyAdmin 文件夹赋予正确的权限。

$ sudo chown -R nginx:nginx phpmyadmin 
$ sudo chmod -R 744 phpmyadmin 

配置 phpMyAdmin

根据软件包附带的示例文件创建配置文件。

$ sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

我们需要在配置文件中添加一个密钥值,用于 cookie 和安全目的。使用以下命令生成并添加该代码。

$ randomBlowfishSecret=$(openssl rand -base64 32)
$ sed -i "s|cfg\['blowfish_secret'\] = ''|cfg['blowfish_secret'] = '$randomBlowfishSecret'|" /usr/share/phpmyadmin/config.inc.php

为了让 Nginx Web 服务器正确找到并提供 phpMyAdmin 文件,我们需要从其实际位置创建一个指向 Nginx 根文档目录的符号链接。

为此,运行以下命令。

$ sudo ln -s /usr/share/phpmyadmin /var/www/example.com/html/phpmyadmin

你的 phpMyAdmin 安装已可正常使用。要访问它,只需打开 http://example.com/phpmyadmin。

默认情况下,应更改此默认位置,因为它是最容易被黑客找到你 phpMyAdmin 安装位置的路径。为此,运行以下命令。

$ sudo mv /var/www/example.com/html/phpmyadmin /var/www/example.com/html/sm123

基本上,我们将 phpMyAdmin 的位置移动到了 sm123 文件夹。要访问它,你现在需要在浏览器中打开 http://example.com/sm123。

由于我们在此处使用了 MySQL 的 unix_authentication,因此没有可供通过 phpMyAdmin 登录的 root 用户。你需要先创建一个 MySQL 用户,并赋予其数据库权限,才能使用 phpMyAdmin。

为此,请登录 MySQL shell。

$ sudo mysql

现在,粘贴以下命令以创建一个新用户并授予其全部数据库权限。

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
EXIT

你现在可以使用该用户在 http://example.com/phpmyadmin 登录。

配置 Opcache

如果你一直按照本教程操作,Opcache 应该已经随 PHP 一起安装了。如果尚未安装,你可以直接使用以下命令安装 Opcache。

$ sudo apt install php7.4-opcache	

验证它是否已安装。

$ php -v
PHP 7.4.5 (cli) (built: Apr 28 2020 14:49:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies

要更改 Opcache 设置,请打开 /etc/php/7.4/fpm/conf.d/10-opcache.ini 文件。

$ sudo nano /etc/php/7.4/fpm/conf.d/10-opcache.ini

将以下代码粘贴到文件末尾。以下设置可帮助你开始使用 Opcache,通常也被推荐为良好的性能配置。

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

按 Ctrl + X,并在提示时输入 Y 以保存文件。

重启你的服务器以应用设置。

$ sudo systemctl restart php7.4-fpm

通过 Let's Encrypt 安装 SSL

SSL 已成为任何网站必不可少的一部分。此处我们将使用 Let's Encrypt 服务来安装 SSL。

为此,首先安装 Certbot 工具。

$ sudo apt install certbot python3-certbot-nginx

生成证书。

$ sudo certbot --nginx -d example.com

如果你是在系统上首次运行 certbot,系统会要求你提供电子邮件地址并同意服务条款。你还会被询问是否同意与 EFF 基金会共享数据,你可以选择拒绝。完成后,certbot 将与 Let's Encrypt 服务器通信,并运行一个 challenge 来验证你的域名。

如果成功,系统会询问你如何处理 HTTPS 重定向。

Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

选择你的选项并按回车。随后将创建你的证书,并且你的 Nginx 配置文件会更新 SSL 设置。

你的证书已就绪,现在你可以通过访问 https://example.com 打开你的站点

验证 SSL 自动续期

这是我们结束本教程之前的最后一步。

通过执行续期流程的试运行来检查续期过程。

$ sudo certbot renew --dry-run

如果没有报错,说明一切就绪。Certbot 将自动为你续期证书。你还将收到一封关于证书过期的提醒邮件。

结论

本教程到此结束。你的 LEMP 环境搭建已完成,可以开始制作并托管你的网站和应用了。