前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
LEMP 软件栈是一组软件,可用于提供动态网页和 Web 应用程序。这是一个首字母缩略词,描述了一个 Linux 操作系统,带有一个 Nginx(发音类似于“Engine-X”)Web 服务器。后端数据存储在 MySQL 数据库中,动态处理由 PHP 处理。
本指南演示了如何在 Ubuntu 18.04 服务器上安装 LEMP 软件栈。Ubuntu 操作系统会处理第一个要求。我们将描述如何启动其余组件。
在完成本教程之前,您应该在服务器上拥有一个常规的非根用户帐户,具有 sudo
权限。通过完成我们的 Ubuntu 18.04 初始服务器设置指南来设置此帐户。
一旦您的用户可用,您就可以开始本指南中概述的步骤。
为了向您的网站访问者显示网页,您将使用 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 流量:
状态: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 地址。
作为替代方案,您可以检查从互联网其他位置查看的可访问的 IP 地址:
curl -4 icanhazip.com
在 Web 浏览器中输入您收到的地址,它将带您到 Nginx 的默认起始页:
http://server_domain_or_IP
!Nginx 默认页面
如果您收到一个显示 “Welcome to nginx” 的网页,那么您已成功安装了 Nginx。
现在您有了一个 Web 服务器,需要安装 MySQL(一个数据库管理系统)来存储和管理网站的数据。
通过输入以下命令安装 MySQL:
sudo apt install mysql-server
MySQL 数据库软件现在已安装,但其配置尚未完成。
为了保护安装,MySQL 自带一个脚本,将询问您是否要修改一些不安全的默认设置。通过输入以下内容启动脚本:
sudo mysql_secure_installation
此脚本将询问您是否要配置 VALIDATE PASSWORD PLUGIN
。
回答 Y
以启用,或者输入其他内容以继续而不启用。
VALIDATE PASSWORD PLUGIN 可用于测试密码并提高安全性。它检查密码的强度,并允许用户仅设置足够安全的密码。您想设置 VALIDATE PASSWORD 插件吗?
按 y|Y 以进行是,按任意其他键以进行否:
如果您启用了验证,脚本还将要求您选择密码验证级别。请记住,如果输入 2 – 表示最强级别 – 当尝试设置不包含数字、大写和小写字母以及特殊字符的密码,或者基于常见词典单词的密码时,您将收到错误。
有三个密码验证策略:
LOW 长度 >= 8
MEDIUM 长度 >= 8,数字,混合大小写和特殊字符
STRONG 长度 >= 8,数字,混合大小写,特殊字符和字典文件
请输入 0 = LOW,1 = MEDIUM 和 2 = STRONG:1
接下来,您将被要求提交并确认根密码:
请在此处设置 root 的密码。
新密码:
重新输入新密码:
对于其余的问题,您应该在每个提示处按 Y
并按 ENTER
键。这将删除一些匿名用户和测试数据库,禁用远程根登录,并加载这些新规则,以便 MySQL 立即遵守我们所做的更改。
请注意,在运行 MySQL 5.7(以及更高版本)的 Ubuntu 系统中,默认情况下 root MySQL 用户设置为使用 auth_socket
插件进行身份验证,而不是使用密码。这在许多情况下可以提供更高的安全性和可用性,但当您需要允许外部程序(例如 phpMyAdmin)访问用户时,可能会使事情变得复杂。
如果使用 auth_socket
插件访问 MySQL 与您的工作流程相符,您可以继续进行第 3 步。但是,如果您更喜欢在连接到 MySQL 作为 root 时使用密码,您需要将其身份验证方法从 auth_socket
切换到 mysql_native_password
。要执行此操作,请从终端打开 MySQL 提示:
sudo mysql
接下来,使用以下命令检查每个 MySQL 用户帐户使用的身份验证方法:
SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| 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
插件进行身份验证。要将 root 帐户配置为使用密码进行身份验证,请运行以下 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;
±-----------------±------------------------------------------±----------------------±----------+
| 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:
```custom_prefix(mysql>)
exit
此时,您的数据库系统已设置好,可以继续安装 PHP。
Nginx 现在已安装用于提供页面服务,MySQL 也已安装用于存储和管理数据。然而,你仍然缺少能够生成动态内容的组件。这就是 PHP 发挥作用的地方。
由于 Nginx 不包含像一些其他 Web 服务器那样的原生 PHP 处理,你需要安装 php-fpm
,它代表 “fastCGI 进程管理器”。之后,你将告诉 Nginx 将 PHP 请求传递给这个软件进行处理。
安装 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 /
— 第一个位置块包括一个 try_files
指令,它检查匹配 URI 请求的文件是否存在。如果 Nginx 找不到适当的文件,它将返回 404 错误。location ~ \.php$
— 这个位置块通过指向 fastcgi-php.conf
配置文件和 php7.2-fpm.sock
文件来处理实际的 PHP 处理,它声明了与 php-fpm
关联的套接字是什么。location ~ /\.ht
— 最后一个位置块处理 .htaccess
文件,Nginx 不会处理这些文件。通过添加 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 nginx -t
如果报告了任何错误,请返回并重新检查你的文件,然后继续。
当你准备好时,重新加载 Nginx 以进行必要的更改:
sudo systemctl reload nginx
这就完成了在 Ubuntu 18.04 服务器上安装和配置 LEMP 栈。然而,最好确认所有组件能够相互通信。
你的 LEMP 栈现在应该已经完全设置好了。你可以测试它以验证 Nginx 是否能够正确地将 .php
文件交给 PHP 处理器。
为此,使用你喜欢的文本编辑器在你的文档根目录中创建一个名为 info.php
的测试 PHP 文件:
sudo nano /var/www/html/info.php
在新文件中输入以下行。这是有效的 PHP 代码,将返回有关你的服务器的信息:
完成后,保存并关闭文件。
现在,你可以通过访问你服务器的域名或公共 IP 地址后跟 /info.php
来在你的 Web 浏览器中访问此页面:
http://your_server_domain_or_IP/info.php
你的浏览器将加载一个类似以下内容的网页,它是由 PHP 生成的,包含有关你的服务器的信息:
!PHP 页面信息
如果你的页面如描述的那样,你已经成功地使用 Nginx 设置了 PHP 处理。
在验证 Nginx 是否正确呈现页面后,最好删除你创建的文件,因为它实际上可能会给未经授权的用户一些关于你配置的提示,这可能会帮助他们试图入侵。如果以后需要,你可以随时重新生成此文件。
现在,删除该文件:
sudo rm /var/www/html/info.php
通过这样,你在你的 Ubuntu 18.04 服务器上已经拥有一个完全配置和运行的 LEMP 栈。
LEMP 栈是一个强大的平台,可以让您从服务器上设置和提供几乎任何网站或应用程序。
从这里开始,您可以采取一些下一步行动。例如,您应该确保与服务器的连接是安全的。为此,您可以使用 Let’s Encrypt 来保护您的 Nginx 安装。通过遵循这个指南,您将获得服务器的免费 TLS/SSL 证书,使其能够通过 HTTPS 提供内容。