夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
[翻译]LNMP的安装

来源

本文翻译自: How To Install Linux, Nginx, MySQL, PHP (LEMP stack) on Ubuntu 18.04

如果原文作者或原文版权所有者认为翻译不当或有侵权行为,请联系本站站长.

前言

LNMPLinux操作系统,Nginx服务器,储存后端数据的MySQL以及负责动态处理数据的PHP的缩写,由于Nginx的发音很想Engine-X,所以LNMP很多时候被人们称作LEMP.

这个教程说明的是如何在Ubuntu 18.04 Server系统上安装LNMP.要想按照此教程顺利安装LNMP,首先需要保证使用的是Ubuntu操作系统.

开始之前

你需要一个拥有sudo权限的用户,或者有root用户的使用权限,否则下面的操作无法顺利进行.

如果满足条件,那就开始吧.

译注: 如果使用的是root用户,下列命令中的sudo都不用输入.

第一步 : 安装 Nginx 服务器

为了能够把网页呈现给网站的访问者,我们需要部署Nginx服务器.

这个步骤用到的所有软件都来源于Ubuntu系统内置的包储存库(Package repositories).也就是说接下来的步骤会使用apt包管理器来安装需要的软件.

因为这是第一次在这里使用apt,所以先更新一下源(不知道什么叫的不用纠结)会比较好一些.更新完以后安装Nginx:

sudo apt update
sudo apt install nginx

Ubuntu 18.04里,Nginx在安装时就已经被配置好.

如果运行了ufw防火墙,就需要允许与Nginx的通信.Nginx在安装时就已经被注册,所以配置起来相当简单.

推荐限制其他不必要的通信(当然也可以不这么做).如果没有允许SSL通信,那么你可能只需要允许在端口80的通信.

允许80端口的通信:

sudo ufw allow 'Nginx HTTP'

使用下面的命令查看ufw状态:

sudo ufw status

下列输出说明允许HTTP通信:

Output
Status: active

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

如果没有开启ufw防火墙或者查看状态时有这样的结果(Status: inactive),可以用下面的命令开启ufw防火墙:

sudo ufw enable

并且再次运行上述命令:

sudo ufw allow 'Nginx HTTP'

新增防火墙规则以后,可以使用浏览器访问服务器的IP地址或者域名以确认安装成功.(本地可以使用127.0.0.1localhost)

如果你没有一个指向你的服务器的域名并且不知道服务器的IP,可以执行以下命令来找到IP:

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

输出可能包含几个IP地址,你可以在浏览器中逐个尝试.

你还可以从其他地方查看哪个IP可以访问:

curl -4 icanhazip.com

在浏览器中输入以下地址,会得到一个Nginx的默认页面:

http://server_domain_or_IP

img
如果看到了上面的页面,就证明Nginx已经安装成功.

第二步: 安装 MySQL

现在已经有了一个网页服务器(刚刚安装的Nginx),你还需要安装MySQL(一个数据库管理系统)来存储你的网站的数据.

用以下的命令来安装MySQL:

sudo apt install mysql-server

现在MySQL已经安装好,但是还需要配置.

为了保障安装时的安全性,MySQL提供了一个脚本(Script),这个脚本会在安装时询问你如何处理一些不安全的默认配置.用以下的命令运行这个脚本:

sudo mysql_secure_installation

这个脚本会让你输入一个密码,作为使用MySQL的凭证.完成以后,它还会询问是否启用VALIDATE PASSWORD PLUGIN.

注意:这个功能起判定作用.如果启用,MySQL将不接受所有不符合判定标准的密码并且报错.若果你输入的密码强度较弱,在与其他有管理、配置MySQL功能的软件结合使用的时候可能会报错(比如phpMyAdmin).显然,禁用这个功能会比较安全且不易出错,但是你应该设置一个强密码.

译注: 如果只是这次安装只是实验性质,禁用这个插件并且设置一个简单密码是个不错的选择.

输入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

译注: 如果对自己的密码没有太大信心或者对密码的强度要求不高的话,推荐使用强度1.

如果你启用了密码验证,脚本将会输出你输入的密码的强度并且询问你是否需要更改密码.如果你对当前的密码十分满意,请输入N:

Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

译注: 如果密码强度显示的是50或者更低,以后使用密码的很有可能报错,最好换一个.

对于其他的问题,输入Y并且按ENTER就可以了.如果你是这么做的,那么脚本将会一处所有的匿名用户并且对数据库进行测试,禁止root用户远程登录MySQL并且使所有变更立即生效.

需要指出的是,在Ubuntu系统的MySQL 5.7(或更新的版本)中,MySQLroot用户默认使用auth_socket插件(而不是密码)来进行验证.这样做可以提高安全性并且在很多时候很有用,但是当你需要允许一些其他程序使用这个用户(比如说phpMyAdmin)的时候可能会变得比较麻烦.

如果你更想使用密码登录MySQLroot用户,你需要把验证方式从auth_socket改成mysql_native_password.要实现这个功能,需要先开启mysql:

sudo 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方式验证.将下列命令中的password改为自己的密码之后运行:

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

译注: 如果之前启用了VALIDATE_PASSWORD_PLUGIN,当上面命令里面的密码强度不足时会报错;如果命令报错,请先检查是否漏写;,然后检查是否密码强度是否足够.

之后,运行FLUSH PRIVILEGES告诉MySQL重新载入,使变更生效:

FLUSH PRIVILEGES;

检查root用户的验证方式是否从author_socket改为mysql_native_password:

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:

exit

现在,MySQL已经安装完毕,可以进行下一步.

第三步: 安装 PHP 并且使 Nginx 使用 PHP 处理器

现在已经安装了用来显示网页的Nginx和用来储存、管理数据的MySQL,但是还没有东西可以帮助我们显示动态界面.PHP就是干这个的.

因为Nginx不像其他网页服务器一样预装了PHP处理器,你需要安装全称是 “fastCGI process manager”的php-fpm,我们需要告诉Nginx把所有PHP请求给php-fpm处理.

安装这个模快的同时安装其他帮助PHP与数据库后端通信的包.安装需要引入必要的PHP核心文件.输入以下命令:

sudo apt install php-fpm php-mysql

现在你已经把LNMP需要的所有东西安装完毕,但是仍然需要配置Nginx使它把PHP请求交给PHP处理器处理以达到动态页面的效果.

这些将会在服务块(Server Block)中完成,(服务块[Server Block]与Apache中的虚拟主机[Virtual Host]类似).在/etc/nginx/sites-available/目录下打开一个新的服务块配置文件examle.com,这里的example.com可以改成你喜欢的名字:

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

新建一个服务块文件而不是使用默认的服务块文件的原因是这样可以更容易地备份默认的配置文件.

译注:上面命令中的example.com是文件名,可以随意更改.如果更改了此文件名,那么下面的命令(是命令不是配置文件)中的example.com应全部改为你更改后的名字.

/etc/nginx/sites-available/example.com中加入以下内容,这些内容是从默认配置文件中略微修改得来的:

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

        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;
        }
}

指令和location blocks的作用如下:
listen–定义Nginx监听哪一个端口.在这里,选择80端口,这个端口是HTTP的默认端口.
root–定义网站的内容储存在那个文件里面
index–当请求索引(index)的时候展现的网页文件,这里把index.php放在最前面是想让Nginx优先展示index.php.
server_name–定义Nginx收到请求时应该应用哪个服务块.请在这里填上你网站的域名或IP地址.
location /–第一个包含try_files的块,这一部分用于检测访问者访问的文件是否存在,如果Nginx没有找到对应的文件,那么将会返回404错误.
location ~ \.php$–这一块用于处理PHP请求,即把所有PHP请求交给fastcgi-php.conf配置文件和php7.2-fpm.sock文件.php7.2-fpm.sock用于声明哪种socket与php-fpm有联系.
location ~ /\.ht–最后一个块用于处理.htaccess文件.Nginx不处理.htaccess文件.当添加了deny all指令以后,所有在网站所在文件夹里的.htaccess文件都不会生效.

译注: 上述server_name填的是自己网站的域名或IP,可以与文件名不相同.如果想让这一个配置文件应用于在多个网站,请把网站的域名和IP全部写在server_name后面,以空格隔开.

添加完上述内容以后,保存并关闭文件.然后从新的服务块配置文件(位于/etc/nginx/sites-available)创建一个链接(Symbolic Link)到/etc/nginx/sites-enable目录中:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enable/

测试一下新的服务块配置文件是否有语法错误:

sudo nginx -t

如果这一步报错,请检查服务块配置文件,
并使这一步成功以后再进行下一步.

如果上一步顺利完成,那么用以下命令使Nginx重新载入:

sudo systemctl reload nginx

走到这一步说明LNMP已经安装并配置完成.但是,谨慎起见,需要测试一下各个部分是否能通信.

第四步: 创建一个 PHP 文件以测试

LNMP应该已经全部安装完成.你可以通过这一步验证Nginx是否成功吧.php文件交给PHP 处理器处理.

用文本编辑器在网站的根目录创建一个名为info.php的文件:

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

把以下内容输入到刚刚创建的文件中.以下的内容是一段有效的PHP代码,这段代码的功能是返回服务器的信息:

<?php
phpinfo();

完成输入后,关闭并保存文件.

现在你可以通过浏览器访问这个文件(即在服务器域名或者IP后面添加/info.php):

http://your_server_domain_or_IP/info.php

应该可以看见由PHP生成的关于服务器的页面.
img
如果看见这个页面,就证明PHP处理器Nginx之间的通信成功.

当我们验证了Nginx成功给出这个页面之后,最好把刚刚创建的文件删除.这个文件包含了许多用户信息,可能会让其他人发现漏洞,有被黑的风险.如果你需要这个文件,可以在需要时重新创建.

现在,删除这个文件:

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

好了.现在一个配置好的LNMP已经搭建完成.

总结

LNMP是一个非常强大的软件组合,可以让服务器提供网页服务或者服务于其他应用程序.

完成搭建LNMP后,还有很多事情可以做.比如,你可能需要使网站的连接更加安全.如果你想这么做,可以参考使用 Let’s Encrypt使 Nginx 更安全一文.这篇文章会帮助你拿到一个TLS/SSL证书,并使你的网站能通过HTTPS呈现内容.

评论

发送评论 编辑评论


				
下一篇