如何在CentOS7上使用软件集合安装和配置LEMP堆栈
作为 Write for DOnations 计划的一部分,作者选择了 Apache Software Foundation 来获得 100 美元的捐款。
介绍
LEMP 软件堆栈是一组开源软件,通常安装在一起以使服务器能够托管动态网站和 Web 应用程序。 这个术语实际上是一个首字母缩写词,代表 Linux 操作系统,带有 ENginx Web 服务器(它取代了 LAMP 堆栈的 Apache 组件)。 站点数据存储在 MySQL 数据库(使用 MariaDB)中,动态内容由 PHP 处理。
LEMP 堆栈组件有时使用 CentOS 7 EPEL 存储库 安装。 但是,此存储库包含过时的软件包。 例如,您无法从 EPEL 安装任何高于 5.4.16 的 PHP 版本,即使此版本已很久不支持 [1]。 为了获得较新版本的软件,建议您使用软件集合,也称为 SCL。 SCL 是 RedHat 提供的开发人员资源的集合,允许您在同一系统上使用多个版本的软件,而不会影响以前安装的软件包。
在本指南中,您将在 CentOS 7 服务器上安装 LEMP 堆栈。 CentOS 操作系统负责 Linux 组件。 您将使用 Software Collections 存储库安装其余组件,然后将它们配置为提供一个简单的网页。
先决条件
在开始本教程之前,您应该按照 CentOS 7 初始服务器设置指南 设置 CentOS 7 服务器,包括 sudo 非 root 用户。
第 1 步 - 启用软件集合存储库
为了获得对 CentOS 的 SCL 的访问权限,安装 CentOS Linux Software Collections 发行文件:
sudo yum install centos-release-scl
使用以下命令查看可用 SCL 包的列表:
yum --disablerepo='*' --enablerepo='centos-sclo-rh' --enablerepo='centos-sclo-sclo' list available
为了避免任何系统范围的冲突,SCL 包安装在 /opt/rh
目录中。 例如,这允许您在 CentOS 7 机器上安装 Python 3.5,而无需删除或干扰 Python 2.7。
SCL 包的所有配置文件都存放在/etc/opt/rh/
目录下的相应目录中。 SCL 包提供的 shell 脚本定义了使用包含的应用程序所需的环境变量,例如 PATH
、LD_LIBRARY_PATH
和 MANPATH
。 这些脚本以 /opt/rh/package-name/enable
的形式存储在文件系统中。
现在您已准备好开始安装本指南中概述的软件包。
第 2 步 — 安装 Nginx Web 服务器
为了向访问者显示网页,我们将使用 Nginx,一种现代、高效的 Web 服务器。
使用以下 yum
命令安装 Nginx。 请务必将突出显示的值替换为您要安装的 Nginx 版本; 最新版本将在包名称中具有最高编号(撰写本文时为 112
):
sudo yum install rh-nginx112
安装完成后,启动 Nginx 服务:
sudo systemctl start rh-nginx112-nginx
通过输入 systemctl status
命令确认 Nginx 正在运行:
sudo systemctl status rh-nginx112-nginx
Output● rh-nginx112-nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/rh-nginx112-nginx.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2018-03-19 15:15:43 UTC; 1min 17s ago Main PID: 10556 (nginx) CGroup: /system.slice/rh-nginx112-nginx.service ├─10556 nginx: master process /opt/rh/rh-nginx112/root/usr/sbin/nginx ├─10557 nginx: worker process └─10558 nginx: worker process Mar 19 15:15:43 lemp-centos-222 systemd[1]: Starting The nginx HTTP and reverse proxy server... Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: the configuration file /etc/opt/rh/rh-nginx... ok Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: configuration file /etc/opt/rh/rh-nginx112/...ful Mar 19 15:15:43 lemp-centos-222 systemd[1]: Started The nginx HTTP and reverse proxy server. Hint: Some lines were ellipsized, use -l to show in full.
此时,您的服务器可能容易受到未经授权的用户未经授权的访问。 要解决此问题,请使用 firewalld 设置防火墙。 您可能需要先安装firewalld,可以使用以下命令完成:
sudo yum install firewalld
然后,启动firewalld服务:
sudo systemctl start firewalld
接下来,添加一些防火墙规则以允许 SSH 访问您的服务器,以及与 Nginx 的 HTTP 和 HTTPS 连接:
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --zone=public --permanent --add-service=http sudo firewall-cmd --zone=public --permanent --add-service=https
重新加载 firewalld 以实现新的防火墙规则:
sudo firewall-cmd --reload
在 如何在 CentOS 7 上使用 FirewallD 设置防火墙中了解有关 firewalld 的更多信息。
添加这些新的防火墙规则后,您可以通过在 Web 浏览器中访问服务器的域名或公共 IP 地址来测试服务器是否已启动并运行。
如果您没有指向您的服务器的域名并且您不知道您的服务器的公共 IP 地址,您可以通过在终端中键入以下内容来找到它:
curl -4 icanhazip.com
在浏览器的地址栏中输入生成的 IP 地址,您应该会看到 Nginx 的默认登录页面:
http://server_domain_or_IP
如果你看到这个页面,你已经成功安装了 Nginx。 在继续之前,使用以下命令使 Nginx 在启动时启动:
sudo systemctl enable rh-nginx112-nginx
Nginx 服务器现已安装,您可以继续安装 MariaDB 数据库软件。
第 3 步 — 安装 MariaDB 以管理站点数据
现在我们有了一个 Web 服务器,是时候安装 MariaDB 了,它是 MySQL 的直接替代品,用于存储和管理您网站的数据。
使用以下命令安装 MariaDB。 同样,将突出显示的值替换为您要安装的任何版本号,最高的数字是最新的可用版本(102
,在撰写本文时):
sudo yum install rh-mariadb102
安装完成后,使用以下命令启动 MariaDB 服务:
sudo systemctl start rh-mariadb102-mariadb
这样,MariaDB 就安装并运行了。 但是,它的配置尚未完成。
为了确保安装安全,MariaDB 安装了一个安全脚本,提示您修改一些不安全的默认设置。 通过键入以下内容运行脚本:
source /opt/rh/rh-mariadb102/enable mysql_secure_installation
提示将询问您当前的 root 密码。 由于您刚刚安装了 MySQL,因此您很可能没有,因此请按 ENTER
将其留空。 然后提示将询问您是否要设置root密码。 继续输入 Y
,然后按照说明进行操作:
. . . Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorization. Set root password? [Y/n] Y New password: password Re-enter new password: password Password updated successfully! Reloading privilege tables.. ... Success! . . .
对于其余的问题,在每个提示中按 ENTER
键以接受默认值。 这将删除一些匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便 MariaDB 立即实施我们所做的更改。
这里要做的最后一件事是让 MariaDB 在启动时启动。 使用以下命令执行此操作:
sudo systemctl enable rh-mariadb102-mariadb
至此,您的数据库系统现已设置完毕,您可以继续在服务器上设置 PHP。
第 4 步 — 安装和配置 PHP 以进行处理
您现在已经安装了 Nginx 来为您的页面提供服务,并安装了 MariaDB 来存储和管理您的数据。 但是,您仍然没有安装任何可以生成动态内容的东西。 这就是 PHP 的用武之地。
由于 Nginx 不像其他一些 Web 服务器那样包含原生 PHP 处理,因此您需要安装 php-fpm
,它代表“fastCGI 进程管理器”。 稍后,您将配置 Nginx 以将 PHP 请求传递给该软件进行处理。
安装此模块并获取一个帮助程序包,允许 PHP 与您的数据库后端进行通信。 安装将引入必要的 PHP 核心文件。 通过键入:
sudo yum install rh-php71-php-fpm rh-php71-php-mysqlnd
您的 PHP 组件现在已安装,但您应该对配置进行轻微更改以增强设置的安全性。
使用 root 权限打开主 php.ini
配置文件:
sudo vi /etc/opt/rh/rh-php71/php.ini
在此文件中,查找设置 cgi.fix_pathinfo
的参数。 这将用分号 (;) 注释掉并默认设置为“1”。
这是一个非常不安全的设置,因为如果找不到请求的 PHP 文件,它会告诉 PHP 尝试执行它可以找到的最近的文件。 这基本上将允许用户以允许他们执行不应被允许执行的脚本的方式制作 PHP 请求。
通过取消注释该行并将其设置为“0”来更改这两个条件,如下所示:
/etc/opt/rh/rh-php<^>71<^>/php.ini
cgi.fix_pathinfo=0
完成后保存并关闭文件(按ESC
,输入:wq
,然后按Enter
)。
接下来打开php-fpm配置文件【X42X】【X46X】:
sudo vi /etc/opt/rh/rh-php71/php-fpm.d/www.conf
默认情况下,此文件配置为与 Apache 服务器一起使用。 由于您的服务器上安装了 Nginx,请找到设置 user
和 group
的行并将它们的值从“apache”更改为“nginx”:
/etc/opt/rh/rh-php<^>71<^>/php-fpm.d/www.conf
user = nginx group = nginx
然后保存并关闭文件。
接下来,通过键入以下命令启动您的 PHP 处理器:
sudo systemctl start rh-php71-php-fpm
然后启用 php-fpm 以在启动时启动:
sudo systemctl enable rh-php71-php-fpm
至此,您已成功将 PHP 安装到您的服务器上。 但是,它仍然必须配置为与您安装的其他软件一起使用,以使您的服务器能够正确地为您的站点内容提供服务。
第 5 步 — 配置 Nginx 以使用 PHP 处理器
至此,您已经安装了 LEMP 堆栈的所有必需组件。 您仍然需要进行的唯一配置更改是告诉 Nginx 使用您的 PHP 处理器来处理动态内容。
此配置更改是在服务器块级别进行的(服务器块类似于 Apache 的虚拟主机)。 通过键入以下命令打开默认的 Nginx 服务器块配置文件:
sudo vi /etc/opt/rh/rh-nginx112/nginx/nginx.conf
通过删除每行开头的井号 (#) 取消注释 location ~ \.php$
块(处理 PHP 请求的文件段,位于 server
块中)及其内容。 您还需要将 fastcgi_param
选项更新为 SCRIPT FILENAME $document_root$fastcgi_script_name
。 这会通知 PHP 可以找到要处理的文件的文档根目录的位置。
进行必要的更改后,server
块将如下所示:
/etc/nginx/sites-available/default
... server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /opt/rh/rh-nginx112/root/usr/share/nginx/html; # Load configuration files for the default server block. include /etc/opt/rh/rh-nginx112/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } ...
进行更改后,您可以保存文件并退出编辑器。
接下来,通过运行以下命令来测试配置文件的语法错误:
source /opt/rh/rh-nginx112/enable sudo nginx -t
如果报告任何错误,请返回并重新检查您的文件,然后再继续。
一旦您的配置文件有效,重新加载 Nginx 以实现您所做的更改:
sudo systemctl reload rh-nginx112-nginx
现在已经安装和配置了 Nginx、PHP 和 MariaDB,剩下要做的就是确认 LEMP 堆栈配置能够正确地为您网站的访问者提供内容。
第 6 步 — 创建一个 PHP 文件来测试配置
您的 LEMP 堆栈现已完全设置,您可以对其进行测试以验证 Nginx 是否能够正确地将 .php
文件交给您的 PHP 处理器。 这是通过在我们的文档根目录中创建一个测试 PHP 文件来完成的。
在文档根目录中打开一个名为 info.php
的新文件:
sudo vi /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php
将以下行添加到新文件中。 这是有效的 PHP 代码,它将返回有关您的服务器的信息:
/opt/rh/rh-nginx<^>112<^>/root/usr/share/nginx/html/info.php
<?php phpinfo(); ?>
完成后,保存并关闭文件。 然后,在您的网络浏览器中访问此页面,方法是访问您的服务器的域名或公共 IP 地址,后跟 /info.php
:
http://server_domain_or_IP/info.php
您将看到一个由 PHP 生成的网页,其中包含有关您的服务器的信息:
如果你看到一个像这样的页面,那么你已经成功地使用 Nginx 设置了 PHP 处理。
在验证 Nginx 正确呈现页面后,最好删除您创建的文件,因为它实际上可以为未经授权的用户提供一些有关您的配置的提示,这可能有助于他们尝试闯入。 如果以后需要,您可以随时重新生成此文件。
通过键入以下内容删除文件:
sudo rm /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php
至此,您已确认 LEMP 堆栈的所有组件都已在您的服务器上正确安装和配置。
结论
现在,您在 CentOS 7 服务器上拥有了一个完全配置的 LEMP 堆栈。 这为您为访问者提供 Web 内容提供了非常灵活的基础。
SCL 还用于安装各种版本的软件并在它们之间切换。 您可以通过运行以下命令查看系统上所有已安装集合的列表:
scl --list
如果有兴趣,您可以在官方网站上找到更多关于软件合集的信息。