2

介绍

LEMP 栈是用来开发动态网页和web 应用程序的一系列软件集合,LEMP描述的是Linux操作系统,Nginx web 服务器,以及后端数据存储MySQL/MariaDB数据库和服务器端动态脚本语言PHP.

在此教程中,我们将会演示如何在Ubuntu 16.04 服务器中安装一个完整的LEMP栈。首先你需要一个运行良好的Ubuntu操作系统,我采用了在虚拟机VirtualBox中安装的Ubuntu 16.04 LTS系统。下面,我来介绍其他组件如何安装和配置。


前置条件

在完成本教程之前,你应该在Ubuntu系统中具有的常规的非root账户,以及'sudo'权限。您可以通过学习一下教程 使用Ubuntu 16.04服务器的的初始化设置.了解如何设置此类型的账户。

在您的普通用户账户可用后,使用此账户登录您的服务器。现在来开始跟着本教程的步骤开始吧!


Step 1: 安装Nginx web 服务器

为了向我们的网站访问者显示网页,我们将使用Nginx,一个现代化,高效的网络服务器。我们在安装LEMP栈中用到的所有组件均来自Ubuntu的默认软件包存储库。这意味着我们可以使用 apt 软件包管理套件来完成所有安装。

因为这是我们第一次在这个会话中使用apt,所以我们应该首先更新我们的本地包索引。然后再安装服务器:

sudo apt-get update
sudo apt-get install nginx

在Ubuntu 16.04上,Nginx在安装时开始运行配置。

如果您有正在运行的 ufw 防火墙,正如我们初始设置教程所说,您必须允许它连接到Nginx。因为Nginx在安装时注册自己的ufw,所以安装程序相当简单。

建议您启用运行所需的最严格的配置文件。由于我们尚未为我们的服务器配置SSL,因此在本教程中,我们只需要允许端口80上的连接。

您可以通过键入以下命令启用此功能:

sudo ufw allow 'Nginx HTTP'

您可以通过键入以下命令来验证更改:

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)

在添加新的防火墙规则后,您可以通过在Web浏览器中访问服务器的域名或公共IP地址来测试服务器是否已启动并正在运行。

如果您还没有指定您的服务器域名,并且您不知道您的服务器的公共IP地址,您可以通过在终端中键入以下内容之一找到它:

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

这将打印出几个IP地址,您可以在您的浏览器中依次尝试每个IP。或者,您可以检查从互联网上的其他位置查看哪个IP地址是可访问的:

#eg. to access baidu.com
curl -4 www.baidu.com

键入您的公网IP地址或者域名,它应该带你到Nginx的默认登陆页面:

http://server_domain_or_IP

//以下两个地址是在本地运行时
http://localhost/

http://127.0.0.1/

图片描述

如果您看到了如上图的页面,您就已经成功安装了Nginx 服务器了。


Step 2: 安装MySQL 数据库

现在我们已经有了一个Web服务器,我们需要安装MySQL,一个数据库管理系统,用来存储和管理我们网站的数据。
您可以通过键入以下命令轻松安装:

sudo apt-get install mysql-server

您将被要求提供root(管理员)密码以在MySQL系统中使用。MySQL数据库软件现已安装完成后,但其配置尚未完全完成。
为了确保安装,我们可以运行一个简单的安全脚本,询问我们是否要修改一些不安全的默认值。通过键入开始脚本:

sudo mysql_secure_installation

接下来将要求您输入为MySQL root帐户设置的密码。然后,将询问您是否想要配置 VALIDATE PASSWORD PLUGIN。

<span style="background-color: #fedee1;white-space: normal;display: block;padding: 13px 17px;">
Warning: Enabling this feature is something of a judgment call. If enabled, passwords which don't match the specified criteria will be rejected by MySQL with an error. This will cause issues if you use a weak password in conjunction with software which automatically configures MySQL user credentials, such as the Ubuntu packages for phpMyAdmin. It is safe to leave validation disabled, but you should always use strong, unique passwords for database credentials.
</span>

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

如果启用了密码验证,则会显示现有root密码的密码强度,并询问您是否要更改该密码。如果您不想更改当前root密码,请在提示符处输入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

对于其余的问题,您只要按Y就行了,并在每个提示符下按Enter键。这将删除一些匿名用户和测试数据库,禁用远程根登录,并加载这些新规则,以便MySQL立即启用这些我们所做的更改。

此时,您的数据库系统现已设置完成。


Step 3: 安装PHP

我们现在安装了Nginx来访问我们的页面,安装了MySQL用啦存储和管理我们的数据。但是,我们还没有任何可以生成动态内容的东西。我们可以使用PHP完成生成动态页面的功能。

由于Nginx不包含本地PHP处理,像其他一些Web服务器一样,我们需要安装php-fpm,它代表"fastCGI process manager"。我们通过配置Nginx使它可以将PHP请求传递给 php-fpm 进行处理。

我们安装php-fpm 这个组件,并且还将获得一个额外的帮助包,它将允许PHP与我们的数据库后端进行通信。安装将提取必要的PHP核心文件。通过键入以下命令执行此安装操作:

sudo apt-get install php-fpm php-mysql
配置PHP环境



我们现在已经安装了PHP组件,但我们需要进行一些小的配置更改,以使我们的环境更安全。

使用root权限打开主php-fpm配置文件:

sudo vim /etc/php/7.0/fpm/php.ini

我们在这个文件中寻找的是叫做cgi.fix_pathinfo的配置。这将使用分号(;)注释掉,默认设置为"1",并被分号(;)注释掉了。

这是一个非常不安全的设置,因为它告诉PHP,如果PHP请求找不到所需的文件,它将会尝试执行最近的文件。基本上,这将允许用户以某种方式模拟PHP请求去执行哪些本不该被执行的PHP脚本。

我们将通过取消注释行并将其设置为"0"来更改这个条件,如下所示:

<span style="text-align:center;display:block;padding:8px 15px;margin-bottom: -40px;background-color: #e5e5e5;">/etc/php/7.0/fpm/php.ini
</span>

cgi.fix_pathinfo=0

保存并在完成后关闭文件。现在,我们只需要重新启动PHP处理器:

sudo systemctl restart php7.0-fpm

重启后PHP服务将会接受我们所做的改变。

Step 4: 配置Nginx服务器使用PHP

现在,我们安装了所有必需的组件。唯一需要的配置是告诉Nginx去使用PHP服务处理PHP文件。

我们在服务器块级别上执行此操作(服务器块类似于Apache的虚拟主机)。通过键入以下命令打开默认的Nginx服务器块配置文件:

sudo vim /etc/nginx/sites-available/default

当前,打开default文件后,去掉所有注释,默认Nginx服务器块文件看起来像这样:
<span style="text-align:center;display:block;padding:8px 15px;margin-bottom: -40px;background-color: #e5e5e5;">/etc/nginx/sites-available/default
</span>

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

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}

我们需要对这些文件做一些更改。

  • 首先,我们需要添加index.php作为index指令的第一个值,以便在请求设置的目录时可以访问index.php
  • 修改server_name指令以指向我们服务器的域名或者公共IP地址。
  • 对于处理PHP请求,我们只需要取消位于location ~.php$处的代码段的注释即可,它包括fastcgi-php.conf,以及和PHP-fpm关联的接口。
  • 我们还将取消用于处理*.htaccees文件的代码注释。Nginx服务器不负责处理这些文件,如果这些文件碰巧进入文档根目录,它们不会被提供给访问者。

您需要所做的更改位于下面被[[]]包裹的代码:
<span style="text-align:center;display:block;padding:8px 15px;margin-bottom: -40px;background-color: #e5e5e5;">/etc/nginx/sites-available/default
</span>

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

    root /var/www/html;
    index [[index.php]] index.html index.htm index.nginx-debian.html;

    server_name [[server_domain_or_IP]];

    location / {
        try_files $uri $uri/ =404;
    }

    [[location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }]]

    [[location ~ /\.ht {
        deny all;
    }]]
}

当您进行上述更改后,就可以保存并关闭文件。

键入以下命令以测试配置文件是否有语法错误:

sudo nginx -t

如果报告了任何错误,请返回并重新检查您的文件,然后再继续。

当你准备好,重新加载Nginx接受上述所做的更改:

sudo systemctl reload nginx

Step 5: 创建PHP文件测试配置

您的LEMP堆栈现在应该完全设置。我们可以通过测试它来验证Nginx是否可以正确地将.php文件移交给我们的PHP处理器来处理。

在我们的文档根目录中创建一个名称为info.php测试文件。
在文本编辑器中的文档根目录中打开一个名为info.php的新文件:

cd /var/www/html/
sudo touch info.php

在新文件中键入或粘贴以下代码,将返回有关我们的服务器的信息:
<span style="text-align:center;display:block;padding:8px 15px;margin-bottom: -40px;background-color: #e5e5e5;">/var/www/html/info.php
</span>

<?php
phpinfo();

完成后,保存并关闭文件。

现在您可以在浏览器中访问info.php,查看服务器信息。

http://server_domain_or_IP/info.php

您将看到一个由PHP生成的网页,其中包含有关您的服务器的信息:
图片描述

如果你看到一个类似这样的页面,你已经成功地设置了PHP以及Nginx服务器。

当Nginx正确呈现了此页面后,最好删除这个文件,因为它实际上可以向未经授权的用户提供有关您的配置的一些提示信息,可能有助于他们尝试非法链接。如果以后需要,可以随时重新生成此文件。

键入以下命令删除这个文件:

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

结束

现在应该已经在您的Ubuntu 16.04服务器上配置了一个LEMP栈。


青天雪日
7 声望0 粉丝