如何在 Rocky Linux 上为多个网站设置 Nginx¶
介绍¶
这是我承诺的关于在 Rocky Linux 上进行 Nginx 多站点设置的指南。我将从为初学者写的一条说明开始;你们其他人知道自己来这里是为了什么,所以向下滚动吧。
嗨,新手!Nginx 做得非常好的一件事是将流量从一个中心点直接到一台服务器上的多个网站和应用程序,或多个其他服务器上的应用程序。这个功能称为“反向代理”,Nginx 以相对的便捷性执行此操作,这也是我开始使用它的原因之一。
在这里,我将向你展示如何管理单个 Nginx 安装上的多个网站,以及如何以简单且有条理的方式执行此操作,这将使你能够快速轻松地进行更改。
对于那些希望为 Apache 设置类似配置的人,请查看本指南。
我将解释大量细节……但最终,整个过程基本上涉及设置一些文件夹,并创建一些小的文本文件。在本指南中,我们不会使用过于复杂的网站配置,所以请放松身心,喝杯咖啡,享受乐趣。一旦你学会了如何操作,每次操作只需要几分钟。这个很简单。*
* 对于“简单”的给定值。
先决条件和假设¶
这是你需要的全部内容
- 一台已连接到互联网的 Rocky Linux 服务器,并且已在其中运行 Nginx。如果你还没有完成这一步,可以先按照我们的 Nginx 安装指南操作。
对在命令行上执行操作有一定了解,并且已安装像
nano
这样的基于终端的文本编辑器。在紧要关头
…你可以使用像 Filezilla 或 WinSCP 这样的东西——以及一个普通的基于 GUI 的文本编辑器——来复制这些步骤中的大部分,但是在本教程中,我们将采用极客的方式进行操作。
至少有一个指向你服务器的域,用于其中一个测试网站。你可以对另一个网站使用第二个域或子域。
提示
如果你在本地服务器上执行所有这些操作,请根据需要调整你的 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
文件夹的符号链接激活这些文件。
我将在下面向您展示它的工作原理。现在,我们已经完成了文件夹的创建。
为什么您(可能)希望反向编写您的域名
简而言之,这是一种组织方法,在使用带有制表符补全的命令行时特别有用,但在基于 GUI 的应用程序中仍然非常有用。它专为在服务器上运行大量网站或应用程序的人员而设计。
基本上,所有网站文件夹(以及配置文件)将按字母顺序排列;首先是顶级域名(例如 .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。
可选:编辑您的主机文件¶
这部分绝对适合初学者。其他人可能可以跳过。
因此,本节仅适用于您在本地开发环境中尝试本指南的情况。也就是说,如果您在工作站上或在本地家庭或企业网络中的另一台机器上运行测试服务器。
由于将外部域名指向本地机器很麻烦(如果您不知道自己在做什么,还可能很危险),因此您可以设置一些在本地网络上可以正常使用但在其他地方无法使用的“伪造”域名。
最简单的方法是使用计算机上的主机文件。主机文件实际上只是一个文本文件,可以覆盖 DNS 设置。也就是说,您可以手动指定您想要的任何 IP 地址的域名。不过,它只在该一台计算机上有效。
因此,在 Mac 和 Linux 上,主机文件位于/etc/
目录中,可以通过命令行非常轻松地编辑(您需要 root 权限)。假设您正在使用 Rocky Linux 工作站,只需运行
nano /etc/hosts
在 Windows 上,主机文件位于C:\Windows\system32\drivers\etc\hosts
,您可以使用任何您想要的 GUI 文本编辑器,只要您拥有管理员权限即可。
因此,如果您使用的是 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