一直以来都是用 LNMP.org 的一键编译安装 LNMP(LEMP),受机器的性能影响,编译安装往往很慢。本文记录使用 apt 在Ubuntu 18.04 服务器上安装安装 LEMP 的过程。

本文以下所有操作均使用 root 用户在系统版本为 Ubuntu 18.04.3 LTS 的 DigitalOcean VPS 上进行操作。(推荐使用具有 sudo 权限的非 root 用户进行安装)

安装 Nginx

Ubuntu 默认的存储库包括 Nginx 软件包,所以通过 apt 可以非常方便地安装。

在安装 Nginx 之前,使用 apt update来更新一下本地软件包索引,以便下载最新地软件包。

apt update
apt install nginx

执行以上的指令之后,apt 会将 Nginx 及其所需地依赖安装到服务器上 。默认情况下,此时 Nginx 已经启动并且设置自启动。

防火墙配置

在测试 Nginx 之前,需要检查一下防火墙配置。Ubuntu 默认的防火墙为 UFW,并且默认处于关闭状态。

可以通过 ufw status 查看 UFW 运行状态,以下为关闭状态:

root@nyc:~# ufw status
Status: inactive

如果你的服务器没有处于安全组内,且 UFW 为关闭状态,可以直接 测试 Nginx

如果你的服务器处于安全组内,请在安全组规则中打开 22(SSH)、80(HTTP)、443(HTTPS) 端口,并且没有必要开启 UFW。

如果你正在使用 UFW,可以执行以下操作:

开启 UFW 并设置 UFW 自启动

ufw enable

快速配置:开启 22、 80、443 端口,禁止其他入站,允许所有出站:

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw default deny incoming
ufw default allow outgoing

允许以上指令,查看状态:

root@nyc:~# ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443/tcp (v6)               ALLOW       Anywhere (v6) 

禁用 UFW 并禁止其自启动:

ufw disable

UFW 的详细配置可以参考这篇文章:ubuntu UFW 防火墙的配置 状态查询命令等

测试 Nginx

可以通过执行 nginx -v 查看 Nginx 的版本号,通过 systemctl status nginx 查看运行状态。

root@nyc:~# nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
root@nyc:~# 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 Wed 2019-12-04 08:32:42 UTC; 1min 37s ago
   ...

通过访问 http://ip 可以看到 Nginx 的默认站点欢迎页面,如下图所示:

管理 Nginx 服务

通过 apt 安装 Nginx 之后,可以使用和其他 systemd 服务相同的方式管理 Nginx。

1、停止 Nginx

systemctl stop nginx
# 也可以使用 service nginx stop

2、启动 Nginx

systemctl start nginx
# 也可以使用 service nginx start

3、重启 Nginx

systemctl restart nginx
# or
service nginx restart

4、允许 Nginx 自动启动

systemctl enable nginx

5、禁止 Nginx 自动启动

systemctl disable nginx

6、检测 Nginx 配置是否正确 nginx -t,以下为正确输出:

root@nyc:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

7、对于修改 Nginx 配置文件,Nginx 可以在不关闭的情况下重载配置:

systemctl reload nginx
#or
service nginx reload

需要了解的 Nginx 文件和目录

1、Nginx 默认的用户是 www-data

root@nyc:~# cat -n /etc/nginx/nginx.conf | grep www-data
     1    user www-data;

2、/etc/nginx :Nginx 配置目录,所有的 Nginx 配置文件都在这个目录下
3、/etc/nginx/nginx.conf:主要的 Nginx 配置文件
4、Nginx 使用服务器块(类似于 Apache 服务器中的虚拟主机[virtual hosts])来保存网站的详细配置,使得可以在一台服务器上建立多个不同域名的网站。
5、Nginx 默认启用的服务器块为:/etc/nginx/sites-available/default,其对应的网站为:/var/www/html(也就是打开访问 IP 看到的页面),并且符号链接到 /etc/nginx/sites-enabled目录。Nginx 只读取 /etc/nginx/sites-enabled 目录中的服务器块,如果服务器块没有链接到此目录,则该服务器块无法被启用。

root@nyc:~# cat -n /etc/nginx/nginx.conf | grep 'sites-enabled'
    62        include /etc/nginx/sites-enabled/*;
root@nyc:~# cat /etc/nginx/sites-available/default 
...
server {
    listen 80 default_server;
    listen [::]:80 default_server;
...
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
...
root@nyc:~# ll /etc/nginx/sites-enabled
total 8
drwxr-xr-x 2 root root 4096 Dec  4 12:11 ./
drwxr-xr-x 8 root root 4096 Dec  4 12:11 ../
lrwxrwxrwx 1 root root   34 Dec  4 12:11 default -> /etc/nginx/sites-available/default

6、如果需要启用一个服务器块,建议将其命名为 /etc/nginx/sites-available/example.com.conf,其中 example.com 为你网站的域名。然后将其符号链接:/etc/nginx/sites-enabled 目录。

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

安装 PHP

由于 Nginx 不像其他 Web 服务器不支持内置 PHP 处理,所以需要安装 php-fpm (fastCGI 进程管理器)。通过配置 Nginx,Nginx 将 PHP 请求传递给 php-fpm 进行处理。

Ubuntu 18.04 通过 apt 安装 PHP 默认的版本为:PHP 7.2.24。

通过以下指令安装 php-fpm 以及一些常用的插件:

apt install php-fpm php-mysql php-curl php-xml php-mbstring php-opcache php-gd

安装 php 拓展之后需要重启以下 php-fpm:

systemctl restart php7.2-fpm.service 

通过 php -v 查看 PHP 版本以及通过 systemctl status php7.2-fpm.service 查看 php-fpm 运行状态:

root@nyc:~# php -v
PHP 7.2.24-0ubuntu0.18.04.1 (cli) (built: Oct 28 2019 12:07:07) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.24-0ubuntu0.18.04.1, Copyright (c) 1999-2018, by Zend Technologies
root@nyc:~# systemctl status php7.2-fpm.service 
● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-12-06 02:49:42 UTC; 1min 39s ago
     Docs: man:php-fpm7.2(8)
 Main PID: 27621 (php-fpm7.2)
...

php-fpm 的一些说明

1、php-fpm 默认的用户是 www-data

root@nyc:~# cat -n /etc/php/7.2/fpm/pool.d/www.conf | grep www-data
    23    user = www-data
    24    group = www-data
    47    listen.owner = www-data
    48    listen.group = www-data

2、 php-fpm 默认与 Web 服务器的通信方式是 socket

root@nyc:~# cat -n /etc/php/7.2/fpm/pool.d/www.conf | grep 'listen ='
    36    listen = /run/php/php7.2-fpm.sock

测试 PHP

在默认的服务器块 /etc/nginx/sites-available/default 对应的网站目录 var/www/html 下创建 phpinfo.php 文件。

touch /var/www/html/phpinfo.php
# 以下五行为一条指令
cat > /var/www/html/phpinfo.php << EOF
<?php
    echo phpinfo();
?>
EOF

修改服务器块 /etc/nginx/sites-available/default:

vim /etc/nginx/sites-available/default

找到以下内容,并且去除一些注释,其中 fastcgi_pass 要和 /etc/php/7.2/fpm/pool.d/www.conf 中一致(见 php-fpm 说明的第2条):

# pass PHP scripts to FastCGI server
    #
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
    
        # With php-fpm (or other unix sockets):
         fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    #    # With php-cgi (or other tcp sockets):
    #    fastcgi_pass 127.0.0.1:9000;
    }

修改 Nginx 服务器块配置后记得检查配置和 reload nginx:

nginx -t
systemctl reload nginx

这时便可以访问 http://ip/phpinfo.php , 如果配置成功,可以看到如图所示网页:

安装 MySQL

这一部分由于比较复杂,所以分另一篇博文写:Ubuntu 18.04 通过 apt 安装 MySQL 5.7


参考文章:
How To Install Nginx on Ubuntu 18.04 - DigitalOcean tutorials