跳至内容

如何在 Rocky Linux 上安装最新的 Nginx

简介

Nginx 是一款旨在快速、高效且几乎兼容任何事物的 Web 服务器。我经常使用它,一旦你掌握了它——它设置和配置起来非常容易。为此,我写了这篇初学者指南。

以下是 Nginx 突出/特性的简要概述

  • 一个基本的 Web 服务器
  • 用于将流量路由到多个站点的反向代理
  • 用于管理到多个网站的流量的内置负载均衡器
  • 内置文件缓存以提高速度
  • WebSockets
  • FastCGI 支持
  • 当然,还有 IPv6

太棒了!所以只需 sudo dnf install nginx,对吧?是的,基本上就是这样,但我们包含了一些有用的技巧来帮助您入门。

先决条件和假设

您需要

  • 一台连接到互联网的 Rocky Linux 机器或服务器。
  • 对命令行有基本了解。
  • 以 root 用户或使用 sudo 运行命令的能力。
  • 您选择的文本编辑器,无论是图形界面还是命令行界面。在本教程中,我将使用 nano

安装和运行 Nginx

首先,请确保您的机器已更新

sudo dnf update

然后,安装 nginx

sudo dnf install nginx

安装完成后,一次性自动启动 nginx 服务并启用它在重新启动时启动

sudo systemctl enable --now nginx

要验证最新版本的 Nginx(不过是 Rocky 仓库中最新的版本)是否已安装,请运行

nginx -v

在那里,您只需将 HTML 文件放入 /usr/share/nginx/html/ 目录即可构建一个简单的静态网站。默认网站/虚拟主机的配置文件名为“nginx.conf”,位于 /etc/nginx/。它还包含许多其他基本的 Nginx 服务器配置,因此即使您选择将实际网站配置移动到另一个文件,您也应该保留“nginx.conf”的其余部分不变。

注意

本指南的旧版本描述了 nginx-mainline 的安装。这不再是一个选项。在大多数情况下,Rocky 仓库中的 Nginx 版本已经足够,可提供稳定的基础和向后移植的安全补丁。那些仍想使用 nginx-mainline 的人可以通过网络搜索找到方法。但是,找到的所有操作方法都将针对 Rocky Linux 8。请注意,使用 nginx-mainline 通常完全可行,但不受支持。

配置防火墙

注意

如果您在 LXD/LXC 或 Docker 等容器中安装 Nginx,您可以暂时跳过此部分。防火墙应由主机操作系统处理。

如果您尝试从另一台计算机查看您机器的 IP 地址或域名处的网页,您很可能会一无所获。嗯,如果您启用了防火墙,情况就是这样。

为了打开必要的端口以便您实际“看到”您的网页,我们将使用 Rocky Linux 的内置防火墙 firewalld。用于此操作的 firewalld 命令是 firewall-cmd。有两种方法可以做到:官方方法和手动方法。在这种情况下,官方方法最好,但您应该了解这两种方法以备将来参考。

官方方法会向 http 服务开放防火墙,该服务当然是处理网页的服务。只需运行此命令

sudo firewall-cmd --permanent --zone=public --add-service=http

让我们分解一下

  • --permanent 标志告诉防火墙确保在每次防火墙重新启动和服务器重新启动时都使用此配置。
  • --zone=public 告诉防火墙允许所有人传入此端口的连接。
  • 最后,--add-service=http 告诉 firewalld 让所有 HTTP 流量通过服务器。

现在这是手动方法。它基本相同,只是您专门打开 HTTP 使用的端口 80。

sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
  • --add-port=80/tcp 告诉防火墙接受端口 80 上的入站连接,只要它们使用传输控制协议 (TCP),在这种情况下,这正是您想要的。

对于 SSL/HTTPS 流量,只需再次运行命令并更改服务或端口号。

sudo firewall-cmd --permanent --zone=public --add-service=https
# Or, in some other cases:
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp

在强制执行这些配置之前,它们不会生效。为此,请告诉 firewalld 重新加载其配置,如下所示

sudo firewall-cmd --reload

注意

现在,这种情况极有可能不会成功。在那些罕见的情况下,让 firewalld 按照老套路——关机再开机——来完成您的任务。

systemctl restart firewalld

要确保端口已正确添加,请运行 firewall-cmd --list-all。配置正确的防火墙看起来会是这样

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp9s0
  sources:
  services: cockpit dhcpv6-client ssh http https
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

这样,防火墙方面就应该万事俱备了。

现在您应该能够看到一个看起来像这样的网页

The Nginx welcome page

这不算什么,但它意味着服务器正在运行。您还可以使用以下命令从命令行测试您的网页是否正常工作

curl -I http://[your-ip-address]

创建服务器用户和更改网站根文件夹

虽然您可以直接将网站放入默认目录然后就走了(对于运行在容器内的 Nginx 或测试/开发服务器来说,这可能没问题),但这并不是我们所说的最佳实践。相反,为您的网站在系统上创建一个特定的 Linux 用户,并将您的网站文件放在为该用户创建的目录中是一个好主意。

如果您想构建多个网站,您应该创建不同的用户和根目录以实现组织和安全。

在本指南中,我将只有一个用户:一个帅气的家伙,名叫“www”。决定在哪里存放您的网站文件会变得更复杂。

根据您的服务器设置,您可以将网站文件放在几个地方。如果您使用的是裸机(物理)服务器,或者您直接在 VPS 上安装 nginx,您可能正在运行 Security Enhanced Linux (SELinux)。SELinux 是一个保护您机器的工具,但它也规定了您可以将某些内容(如网页)放在哪里。

因此,如果您直接在机器上安装 nginx,您会将网站放在默认根文件夹的子目录中。在这种情况下,默认根是 /usr/share/nginx/html,因此“www”用户的网站可能放在 /usr/share/nginx/html/www

然而,如果您在 LXD/LXC 等容器中运行 nginx,SELinux 可能不会安装,您可以将文件放在任何您喜欢的地方。在这种情况下,我喜欢将一个用户的所有网站文件放在普通主目录下的一个目录中,如下所示:/home/www/

我将继续本指南,就好像 SELinux 已安装一样。只需根据您的用例更改所需的内容。您还可以通过 我们关于该主题的指南 了解更多关于 SELinux 如何工作的信息。

创建用户

首先,我们创建将要使用的文件夹

sudo mkdir /usr/share/nginx/html/www

接下来,创建 www 组

sudo groupadd www

然后,我们创建用户

sudo adduser -G nginx -g www -d /usr/share/nginx/html/www www --system --shell=/bin/false

该命令告诉机器

  • 创建一个名为“www”的用户(正如中间的文本所示),
  • 将其所有文件放在 /usr/share/nginx/html/www
  • 并将其添加到以下组:“nginx”作为附加组,“www”作为主组。
  • --system 标志表示该用户不是人类用户,它是为系统保留的。如果您想创建人类用户帐户来管理不同的网站,那将是另一份指南。
  • --shell=/bin/false 确保没有人可以尝试以“www”用户身份登录。

“nginx”组可以实现一些真正的魔法。它允许 Web 服务器读取和修改属于“www”用户及其用户组的文件。有关更多信息,请参阅 Rocky Linux 的 用户管理指南

更改服务器根文件夹

现在您有了自己漂亮的账户,是时候让 nginx 在该文件夹中查找您的网站文件了。再次拿起您最喜欢的文本编辑器。

现在,只需运行

sudo nano /etc/nginx/conf.d/default.conf

打开文件后,查找类似 root /usr/share/nginx/html; 的行。将其更改为您选择的网站根文件夹,例如 root /usr/share/nginx/html/www;(如果您像我一样在容器中运行 nginx,则为 /home/www)。保存并关闭文件,然后测试您的 nginx 配置,确保您没有遗漏分号或任何东西

nginx -t

如果您收到以下成功消息,说明一切顺利

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

然后,使用以下命令对服务器进行软重启

sudo systemctl reload nginx

注意

万一软重启不起作用,请使用以下命令强制重启 nginx

sudo systemctl restart nginx

您新根文件夹中的任何 HTML 文件现在应该可以从...您的浏览器中浏览了。

更改文件权限

必须正确设置权限,以确保 nginx 可以读取、写入和执行网站目录中的任何文件。

首先,请确保根文件夹中的所有文件都属于服务器用户及其用户组,使用

sudo chown -R www:www /usr/share/nginx/html/www

然后,为确保想要浏览您网站的用户能够实际看到页面,请运行以下命令(是的,这些分号很重要)

sudo find /usr/share/nginx/html/www -type d -exec chmod 555 "{}" \;
sudo find /usr/share/nginx/html/www -type f -exec chmod 444 "{}" \;

这基本上赋予了每个人查看服务器上文件的权利,但不能修改。只有 root 用户和服务器用户才能这样做。

为您的站点获取 SSL 证书

目前,我们关于 使用 certbot 获取 SSL 证书的指南 已更新,其中包含 nginx 的基本说明。去看一下,因为它包含了安装 certbot 和生成证书的完整说明。

随着时间的推移,浏览器可能会停止允许用户查看没有证书的网站,因此请确保为每个网站都获取一个。

其他配置选项和指南

SELinux 规则

请注意,当强制执行时,nginx proxy_pass 指令将失败并显示“502 Bad Gateway”

您可以选择在开发目的下禁用 setenforce

sudo setenforce 0

或者您可以在 /var/log/audit/audit.log 中启用 httpd 或与 nginx 相关的其他服务

sudo setsebool httpd_can_network_connect 1 -P

结论

nginx 的基本安装和配置很容易,即使获取最新版本比它应该的要复杂一些。但是,按照步骤操作,您将很快就能启动并运行最好的服务器选项之一。

现在您只需要去创建一个网站?这需要多长时间,另外十分钟?在网页设计师的悲伤中哭泣

作者:Ezequiel Bruni

贡献者:Antoine Le Morvan, Steven Spencer, Ganna Zhyrnova