如何在 Rocky Linux 9 上设置 Nginx 服务器块(虚拟主机)
介绍
使用 Nginx Web 服务器时,可以使用服务器块(类似于 Apache 中的虚拟主机)来封装配置细节,并在一台服务器上托管多个域。
在本指南中,您将学习如何在 Rocky Linux 9 服务器上的 Nginx 中配置服务器块。
先决条件
在本教程中,您应该使用具有 sudo
权限的非根用户。如果您没有这样配置的用户,您可以按照我们的 Rocky Linux 9 初始服务器设置指南创建一个。
您还需要在服务器上安装 Nginx。您可以按照如何在 Rocky Linux 9 上安装 Nginx 安装它:
第 1 步 — 设置新的文档根目录
出于演示目的,本教程将介绍使用 Nginx 服务器设置两个域。本指南中使用的域名是 test.com。如果您已经拥有自己的域,则可以改用它们。
注意:有关使用 DigitalOcean 注册新域的更多信息,请参阅我们的域和 DNS 产品文档。
如果您没有要配置的两个域名,您现在可以使用占位符名称。您仍然可以测试您的配置。
默认情况下,Rocky Linux 9 上的 Nginx 启用了一个服务器块。它被配置为从位于 /usr/share/nginx/html
的目录中提供文档。虽然这适用于单个站点,但您需要额外的目录来为多个站点提供服务。您可以将 /usr/share/nginx/html
目录视为客户端请求与您的任何其他站点不匹配时将提供的默认目录。
您可以在 /usr/share/nginx
中为您的每个站点创建一个目录结构。实际的 Web 内容将放置在这些特定于站点的目录中的 html
目录中。这为您提供了一些额外的灵活性,可以根据需要创建与您的站点关联的其他目录。
为您的每个站点创建这些目录。 -p
标志告诉 mkdir
在此过程中创建任何必要的父目录:
- sudo mkdir -p /usr/share/nginx/example.com/html
- sudo mkdir -p /usr/share/nginx/test.com/html
现在您有了自己的目录,您可以将 Web 目录的所有权重新分配给您的普通用户帐户。这将允许您在没有 sudo
权限的情况下写信给他们。
您可以使用 $USER
环境变量将所有权分配给您当前登录的帐户(确保您未以根用户身份登录)。您应该将这些目录的组权限分配给 nginx
,这是一个在 Rocky Linux 上为 Nginx 自动创建的帐户,它将允许 Web 服务器本身在您的 Web 应用程序需要时创建新文件。 chown
命令允许您同时执行这两项操作:
- sudo chown -R $USER:nginx /usr/share/nginx/example.com/html
- sudo chown -R $USER:nginx /usr/share/nginx/test.com/html
最后,使用 chmod
命令确保您的用户和 nginx
组都具有完全 (7) 权限,而其他用户具有只读 (5) 权限。要了解有关 Linux 权限的更多信息,请参阅 Linux 权限基础知识。
- sudo chmod -R 775 /usr/share/nginx
您的目录结构现已配置完毕,您可以继续了。
第 2 步 — 为每个站点创建示例页面
现在您已经设置了目录结构,为每个站点创建一个默认页面,以便您可以显示一些内容。
使用 nano
或您最喜欢的文本编辑器,在您的第一个域中创建一个 index.html
文件:
- nano /usr/share/nginx/example.com/html/index.html
在该文件中,创建一个准系统 Web 登录页面,指示您当前正在访问的站点。它看起来像这样:
<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com server block is working!</h1>
</body>
</html>
完成后保存并关闭文件。如果您使用的是 nano
,请按 Ctrl+X
,然后在出现提示时按 Y
,然后按 Enter。
由于您的第二个站点的文件出于演示目的将是相同的,您可以将其复制到您的第二个文档根目录,如下所示:
- cp /usr/share/nginx/example.com/html/index.html /usr/share/nginx/test.com/html/
现在,您可以在 nano
或您最喜欢的文本编辑器中打开新文件:
- nano /usr/share/nginx/test.com/html/index.html
修改它,使其指向您的第二个域:
<html>
<head>
<title>Welcome to Test.com!</title>
</head>
<body>
<h1>Success! The test.com server block is working!</h1>
</body>
</html>
完成后保存并关闭此文件。您现在有一些页面可以显示给您的两个域的访问者。
第 3 步 — 为每个域创建服务器块文件
现在您有了要提供的内容,您需要创建服务器块来告诉 Nginx 如何执行此操作。
默认情况下,Rocky Linux 上的 Nginx 在其主配置文件 nginx.conf
中包含一个“默认”服务器块。该文件中的块如下所示:
…
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
…
您可以将其用作您自己的配置的模板,您可以在单独的文件中创建这些配置。首先设计您的第一个域的服务器块,然后您可以将其复制到您的第二个域并进行任何必要的修改。
创建第一个服务器块文件
在 /etc/nginx/conf.d
目录中创建您的第一个服务器块配置文件。主 Nginx 配置文件默认包含 include /etc/nginx/conf.d/*.conf;
行,这意味着它将检查与该模式匹配的文件以获取额外的服务器块。
使用您最喜欢的具有 sudo
权限的文本编辑器为您的第一个域创建配置文件:
- sudo nano /etc/nginx/conf.d/example.com.conf
首先粘贴到这个准系统服务器块中:
server {
listen 80;
listen [::]:80;
root /usr/share/nginx/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
首先,您应该查看 listen
指令。服务器上只有一个服务器块可以启用 default_server
选项。如果请求的 server_name
不匹配任何可用的服务器块,这将指定哪个块应该为请求提供服务。这在现实世界中不应该经常发生,因为访问者将通过您的域名访问您的网站。
您可以通过在 listen
指令中包含 default_server
选项来选择将您的网站之一指定为“默认”,或者您可以在 nginx.conf
,如果找不到请求的主机,它将提供 /usr/share/nginx/html
目录的内容。
在本指南中,您将保留“默认”服务器块以处理不匹配的请求,因此您的新 example.com
配置将不包含 default_server
:
server {
listen 80;
listen [::]:80;
. . .
}
接下来要调整的是文档根目录,由 root
指令指定。将它指向您创建的站点的文档根目录:
server {
listen 80;
listen [::]:80;
root /usr/share/nginx/example.com/html;
}
接下来,您需要修改 server_name
以匹配您的第一个域的请求。您还可以添加任何需要匹配的别名。在本教程中,您将添加一个 example.com
和一个 www.example.com
别名来进行演示。
完成后,您的文件将如下所示:
server {
listen 80;
listen [::]:80;
root /usr/share/nginx/example.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
这就是配置所需的全部内容。保存并关闭文件以退出。
创建第二个服务器块文件
现在您有了初始服务器块配置,您可以将其用作第二个文件的基础。将其复制过来创建一个新文件:
- sudo cp /etc/nginx/conf.d/example.com.conf /etc/nginx/conf.d/test.com.conf
在您喜欢的编辑器中使用 sudo
权限打开新文件:
- sudo nano /etc/nginx/conf.d/test.com.conf
同样,如果您已经在其他地方使用过,请确保您没有在该文件中为 listen
指令使用 default_server
选项。调整 root
指令以指向您的第二个域的文档根目录,并调整 server_name
以匹配您的第二个站点的域名(确保包含任何别名)。
完成后,您的文件可能如下所示:
server {
listen 80;
listen [::]:80;
root /usr/share/nginx/test.com/html;
index index.html index.htm index.nginx-debian.html;
server_name test.com www.test.com;
location / {
try_files $uri $uri/ =404;
}
}
保存并关闭文件。在下一步中,您将重新加载 Nginx 以反映您的更改。
第 4 步 — 启用服务器块并重新启动 Nginx
您现在启用了三个服务器块,它们被配置为根据它们的 listen
指令和 server_name
进行响应(您可以在此处阅读有关 Nginx 如何处理这些指令的更多信息):
example.com
:将响应对example.com
和www.example.com
的请求 test.com
:将响应对test.com
和www.test.com
的请求 default
:将响应端口 80 上与其他两个块不匹配的任何请求。
完成后保存并关闭文件。接下来,测试以确保您的任何 Nginx 文件中没有语法错误:
- sudo nginx -t
如果没有发现问题,请重新启动 Nginx 以启用您的更改:
- sudo systemctl restart nginx
Nginx 现在应该为您的两个域名提供服务。
第 5 步 — 修改本地主机文件以进行测试(可选)
如果您没有使用您拥有的域名并且实际上指向此服务器的 IP 地址,而是使用占位符值,您可以修改本地计算机的 hosts 文件,让您暂时测试您的Nginx 服务器块配置。
这将不允许其他访问者正确查看您的站点,但它使您能够独立访问每个站点并测试您的配置。这是通过拦截通常会转到 DNS 来解析域名的请求来实现的。相反,您可以将主机文件设置为自动将某些域硬编码到某些远程地址。
注意:确保您在执行这些步骤时是在本地计算机上操作,而不是在远程服务器上操作。您将需要具有 root 访问权限,成为管理组的成员,或者能够编辑系统文件来执行此操作。
如果您在 Mac 或 Linux 环境中工作,您的主机文件位于 /etc/hosts
:
- sudo nano /etc/hosts
如果您使用的是 Windows,您的主机文件位于 C:\Windows\System32\drivers tc\hosts
。
您需要知道服务器的公共 IP 地址以及要路由到服务器的域。假设您的服务器的公共 IP 地址是 203.0.113.5
,您添加到文件中的行将如下所示:
127.0.0.1 localhost
. . .
203.0.113.5 example.com www.example.com
203.0.113.5 test.com www.test.com
这将拦截对 example.com
和 test.com
的任何请求,并将它们发送到您的服务器,如果您实际上并不拥有这些域,这就是您需要的你正在测试。
完成后保存并关闭文件。
第 6 步 — 测试结果
现在您已全部设置完毕,您应该测试您的服务器块是否正常运行。您可以通过访问网络浏览器中的域来做到这一点:
http://example.com
您应该会看到如下所示的页面:

如果您访问您的第二个域名,您应该会看到一个略有不同的站点:
http://test.com

如果这两个站点都能正常工作,那么您已经成功地使用 Nginx 配置了两个独立的服务器块。
此时,如果您调整了本地计算机上的 hosts
文件以进行测试,您可能想要删除添加的行。
如果您需要为面向公众的站点访问服务器的域名,您可能需要为每个站点购买一个域名。
结论
您现在应该能够为您希望从同一服务器托管的每个域创建服务器块。您可以创建的服务器块的数量没有任何实际限制,只要您的硬件可以处理流量即可。
接下来,您可能想了解如何使用 Nginx 设置密码身份验证。