如何在 Rocky Linux 上为多个网站设置 Nginx¶
简介¶
好了,这是我承诺的关于 Rocky Linux 上 Nginx 多站点设置的指南。我将首先为初学者做一些说明;其他有经验的读者应该知道自己要找什么,请直接向下滚动。
嗨,新手们!Nginx 擅长的一件事就是从一个中心点将流量重定向到一台服务器或多台其他服务器上的多个网站和应用程序。这个功能被称为“反向代理”,Nginx 能够相对轻松地实现这一点是我开始使用它的原因之一。
在这里,我将向您展示如何在单个 Nginx 安装中管理多个网站,以及如何以一种简单有序的方式进行操作,让您可以快速轻松地进行更改。
如果您正在寻找 Apache 的类似设置,请参考此指南。
我将解释大量的细节……但最终,整个过程基本上包括设置一些文件夹,以及创建一些小的文本文件。本指南中我们将不使用过于复杂的网站配置,所以请放松,喝杯咖啡,然后享受乐趣。一旦您学会了如何操作,每次都只需要几分钟。这个很简单。*
* 在“简单”的给定值下。
先决条件和假设¶
这是您需要的一切
- 一台已连接到互联网的 Rocky Linux 服务器,上面已经运行了 Nginx。如果您还没有走到这一步,可以先参考我们安装 Nginx 的指南。
-
对在命令行下操作有一定的熟悉度,并安装了像
nano
这样的终端文本编辑器。实在不行
……您可以使用 Filezilla 或 WinSCP — 以及一个常规的图形界面的文本编辑器 — 来完成大多数这些步骤,但在本教程中,我们将采用更“技术宅”的方式。
-
至少有一个域名指向您的服务器,用于其中一个测试网站。您可以使用第二个域名或子域名用于另一个。
技巧
如果您在本地服务器上进行所有这些操作,请根据需要调整您的 hosts 文件以创建模拟域名。说明见下文。
-
我们假定您在裸金属服务器或常规 VPS 上运行 Nginx,并且 SELinux 正在运行。所有说明默认都与 SELinux 兼容。
- 所有命令都必须以 root 用户身份运行,通过登录 root 用户或使用
sudo
。
设置您的文件夹和测试站点¶
网站文件夹¶
首先,您需要几个文件夹来存放您的网站文件。当您首次安装 Nginx 时,所有“演示”网站文件都位于 /usr/share/nginx/html
。如果您只托管一个站点,这样是可以的,但我们要做得更花哨。暂时忽略 html
目录,只需导航到它的父文件夹
cd /usr/share/nginx
出于本教程的考虑,测试域名将是 site1.server.test
和 site2.server.test
,我们将相应地命名这些网站文件夹。当然,您应该将这些域名更改为您正在使用的域名。但是(这是我从更聪明的人那里学到的一个技巧TM),我们将“颠倒”书写域名。
例如:“yourwebsite.com”应该放在一个名为 com.yourwebsite
的文件夹中。请注意,您可以随意命名这些文件夹,但这种方法有一个很好的理由,我已在下面进行了概述。
现在,先创建您的文件夹
mkdir -p test.server.site1/html
mkdir -p test.server.site2/html
所以该命令将创建,例如,test.server.site1
文件夹,并在其中创建另一个名为 html
的文件夹。这就是您将要存放通过 Web 服务器提供服务的实际文件的地方。(您也可以将其命名为“webroot”或类似的名称。)
这样一来,您就可以将您不想公开的与网站相关的文件放在父目录中,同时又将所有内容保持在一个地方。
注意
-p
标志告诉 mkdir
命令创建您刚刚定义的路径中任何缺失的文件夹,这样您就不必逐个创建每个文件夹。
为了进行此测试,我们将“网站”本身保持得非常简单。只需使用您喜欢的文本编辑器在第一个文件夹中创建一个 HTML 文件
nano test.server.site1/html/index.html
然后粘贴以下 HTML 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Site 1</title>
</head>
<body>
<h1>This is Site 1</h1>
</body>
</html>
保存并关闭文件,然后使用 test.server.site2
文件夹重复这些步骤,将上面 HTML 代码中的“Site 1”更改为“Site 2”。这样我们稍后就可以确保一切正常工作。
您的测试网站已完成,我们继续。
配置文件文件夹¶
现在让我们进入 Nginx 设置和配置文件夹,这是我们在本指南其余部分将要操作的地方
cd /etc/nginx/
如果您运行 ls
命令查看这里的文件和文件夹,您会看到很多不同的东西,其中大部分今天无关紧要。需要注意的有这些:
nginx.conf
是包含您猜到的默认 Nginx 配置的文件。我们稍后会编辑它。conf.d
是一个目录,您可以在其中放置自定义配置文件。您可以用于网站,但最好将其用于您希望在所有网站上生效的功能特定设置。default.d
是一个目录,如果您只在该服务器上运行一个网站,或者您的服务器有一个“主”网站,您的网站配置可能会放在这里。暂时将其保留。
我们要创建两个新文件夹,名为 sites-available
和 sites-enabled
mkdir sites-available
mkdir sites-enabled
我们将要做的是将所有网站配置文件放在 sites-available
文件夹中。在那里,您可以根据需要处理配置文件,直到您准备好通过符号链接激活文件并将其链接到 sites-enabled
文件夹。
我将在下面向您展示它的工作原理。现在,我们已完成文件夹的创建。
为什么您(可能)希望颠倒书写您的域名
简单来说,这是一种组织方式,在使用命令行和 Tab 键自动补全时特别有用,但在图形界面的应用程序中也很有用。它适用于在服务器上运行大量网站或应用程序的人。
基本上,您的所有网站文件夹(和配置文件)将按字母顺序组织;首先是顶级域名(例如 .com, .org 等),然后是主域名,然后是任何子域名。当您搜索长域名列表时,通过这种方式可以更容易地缩小搜索范围。
它还可以让您更容易地通过命令行工具对文件夹和配置文件进行排序。要列出与特定域名相关的所有文件夹,您可以运行
ls /usr/share/nginx/ | grep com.yoursite*
这将输出类似以下内容
com.yoursite.site1
com.yoursite.site2
com.yoursite.site3
设置您的配置文件¶
编辑 nginx.conf¶
默认情况下,Rocky Linux 的 Nginx 实现对所有 HTTP 流量都是开放的,并将所有流量重定向到您可能在我们安装 Nginx 的指南中看到的演示页面。我们不希望这样。我们希望来自我们指定的域名的流量转到我们指定的网站。
因此,从 /etc/nginx/
目录开始,用您喜欢的文本编辑器打开 nginx.conf
nano nginx.conf
首先,找到类似这样的行
include /etc/nginx/conf.d/*.conf;
并在此行下方添加这部分
include /etc/nginx/sites-enabled/*.conf;
这样,当我们的网站配置文件准备好上线时,它们就会被加载。
现在向下滚动到类似这样的部分,然后用井号 #
注释掉,或者如果您愿意,可以将其删除
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/www/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
“注释掉”后的样子
#server {
# listen 80;
# listen [::]:80;
# server_name _;
# root /usr/share/nginx/www/html;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /404.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
#}
如果您是初学者,您可能希望保留注释掉的代码以供参考,这同样适用于文件中更靠下位置已注释掉的示例 HTTPS 代码。
保存并关闭文件,然后使用以下命令重新启动服务器
systemctl restart nginx
现在至少没有人会看到演示页面了。
添加网站配置文件¶
现在让我们让您的测试网站在服务器上可用。如前所述,我们将通过符号链接来实现,这样我们就可以轻松地随意开启和关闭网站。
注意
对于绝对的初学者来说,符号链接基本上是一种让文件同时出现在两个文件夹中的方式。更改原始文件(或“目标”),它会在所有链接到它的地方都发生改变。如果您使用程序通过链接编辑文件,原始文件就会被更改。
但是,如果您删除指向目标的链接,原始文件完全不会受到影响。这个技巧允许我们将网站配置文件放在一个工作目录(sites-available
)中,然后通过从 sites-enabled
链接到这些文件来“激活”它们。
我将向您展示我的意思。像这样为第一个网站创建一个配置文件
nano sites-available/test.server.site1.conf
现在粘贴此代码。这是您可以拥有的最简单的 Nginx 工作配置,并且对于大多数静态 HTML 网站来说应该效果很好
server {
listen 80;
listen [::]:80;
# virtual server name i.e. domain name #
server_name site1.server.test;
# document root #
root /usr/share/nginx/test.server.site1/html;
# log files
access_log /var/log/nginx/www_access.log;
error_log /var/log/nginx/www_error.log;
# Directives to send expires headers and turn off 404 error logging. #
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off; log_not_found off; expires max;
}
}
而且,从文档根目录开始的所有内容在技术上都是可选的。有用且推荐,但并非网站正常运行所必需的。
无论如何,保存并关闭文件,然后进入 sites-enabled
目录
cd sites-enabled
现在,在 sites-available
文件夹中创建指向您刚刚制作的配置文件的符号链接。
ln -s ../sites-available/test.server.site1.conf
使用 nginx -t
命令测试您的配置,如果您收到一切正常的提示,请重新加载服务器
systemctl restart nginx
然后将您的浏览器指向您为第一个站点使用的域名(在我这里是:site1.server.test),并查找我们在 HTML 文件中放入的“This is Site 1”消息。如果您在系统上安装了 curl
,您可以运行 curl site1.server.test
并查看 HTML 代码是否在您的终端中加载。
注意
某些浏览器会(尽最大努力)在您在地址栏中输入服务器域名时强制您使用 HTTPS。如果您没有配置 HTTPS,这只会给您带来错误。
请确保在浏览器地址栏中手动指定“http://”以避免此问题。如果无效,请清除缓存,或在此测试部分使用不那么挑剔的浏览器。我推荐 Min。
如果所有这些都顺利进行,请重复以上步骤,在进行过程中更改文件名和配置文件内容。“site1”改为“site2”等等。一旦您为 Site 1 和 Site 2 都创建了配置文件和符号链接,并重新启动了 Nginx,它应该看起来像这样
注意
您也可以使用 ln -s
命令的长格式从 sites-enabled 目录外部创建链接。它看起来像 ln -s [source-file] [link]
。
在这种情况下,那就是
ln -s /etc/nginx/sites-available/test.server.site1.conf /etc/nginx/sites-enabled/test.server.site1.conf
禁用网站¶
如果您需要停止其中一个网站进行处理,然后再重新上线,只需删除 sites-enabled 中的符号链接
rm /etc/nginx/sites-enabled/test.server.site1.conf
然后像往常一样重新启动 Nginx。要使站点重新上线,您需要重新创建符号链接,然后再次重新启动 Nginx。
可选:编辑您的 hosts 文件¶
这部分绝对是为初学者准备的。其他所有人都可以跳过。
所以这一部分仅适用于如果您在本地开发环境中尝试本指南。也就是说,如果您在工作站或家庭/公司局域网内的另一台计算机上运行测试服务器。
由于将外部域名指向您的本地计算机很麻烦(如果您不知道自己在做什么,甚至可能很危险),您可以设置一些“假”域名,这些域名在您的本地网络上可以正常工作,但在其他地方则不行。
最简单的方法是使用您计算机上的 hosts 文件。hosts 文件本身就是一个文本文件,可以覆盖 DNS 设置。也就是说,您可以手动指定一个域名来匹配您想要的任何 IP 地址。但是,它仅在该计算机上有效。
因此,在 Mac 和 Linux 上,hosts 文件位于 /etc/
目录中,可以通过命令行非常轻松地进行编辑(您需要 root 权限)。假设您在 Rocky Linux 工作站上操作,只需运行
nano /etc/hosts
在 Windows 上,hosts 文件位于 C:\Windows\system32\drivers\etc\hosts
,只要您有管理员权限,您就可以使用任何图形界面的文本编辑器。
因此,如果您在 Rocky Linux 计算机上工作,并且在该计算机上运行 Nginx 服务器,您只需打开文件,然后定义您想要的域名/IP 地址。如果您在同一台计算机上运行工作站和测试服务器,那将是
127.0.0.1 site1.server.test
127.0.0.1 site2.server.test
如果您在网络上的另一台计算机上运行 Nginx 服务器,只需使用该计算机的地址,例如
192.168.0.45 site1.server.test
192.168.0.45 site2.server.test
然后您就可以在浏览器中指向这些域名,它应该可以按预期工作。
为您的站点设置 SSL 证书¶
去看看我们使用 Let's Encrypt 和 certbot 获取 SSL 证书的指南。那里的说明将很好地适用。
结论¶
请记住,这里的许多文件夹/文件组织和命名约定在技术上都是可选的。您的网站配置文件大部分只需要放在 /etc/nginx/
目录内的任何地方,并且 nginx.conf
需要知道这些文件的位置。
实际的网站文件应该位于 /usr/share/nginx/
的某个位置,其余的都是附加的。
尝试一下,做一些科学研究TM,在重新启动 Nginx 之前,不要忘记运行 nginx -t
来确保您没有遗漏分号或任何其他内容。这将为您节省大量时间。
作者:Ezequiel Bruni
贡献者:Steven Spencer, Ganna Zhyrnova