如何在Rocky Linux 9上设置Nginx服务器块(虚拟主机)
介绍
在使用Nginx web服务器时,可以使用服务器块(类似于Apache中的虚拟主机)来封装配置细节,并在单台服务器上托管多个域名。
在本指南中,您将学习如何在Rocky Linux 9服务器上配置Nginx的服务器块。
先决条件
在本教程中,您应该使用一个具有sudo特权的非root用户。如果您没有配置此类用户,可以按照我们的Rocky Linux 9初始服务器设置指南创建一个。
您还需要在服务器上安装Nginx。您可以按照《在Rocky Linux 9上安装Nginx的方法》进行安装。
步骤1 – 设置新的文档根目录
为了演示目的,本教程将涵盖如何使用Nginx服务器设置两个域名。本指南中使用的域名是example.com和test.com。如果您已经有您自己的域名,可以使用您自己的域名。
Note
如果您没有两个域名需要配置,您可以暂时使用占位名称。您仍将能够测试您的配置。
默认情况下,Rocky Linux 9上的Nginx启用了一个服务器块。它配置为从/usr/share/nginx/html目录中提供文档。虽然这对于单个网站运行良好,但如果需要为多个网站提供服务,您需要使用额外的目录。您可以将/usr/share/nginx/html目录视为默认目录,在客户端请求不匹配其他任何站点时将提供该目录的内容。
您可以在 /usr/share/nginx 目录下为每个站点创建一个目录结构。实际的网页内容将放置在这些站点专属目录中的一个名为 “html” 的目录中。这样,您可以根据需要为每个站点创建其他相关目录,从而获得更多的灵活性。
为每个站点创建这些目录。-p标志告诉mkdir在创建路径上的任何必要的父目录。
- sudo mkdir -p /usr/share/nginx/example.com/html
- sudo mkdir -p /usr/share/nginx/test.com/html
现在你已经有了你的目录,你可以重新分配网页目录的所有权给你的普通用户账户。这样你就可以在没有sudo权限的情况下对它们进行写操作了。
你可以使用 `$USER` 环境变量将当前登录的账户(确保你没有以 root 用户登录)分配为所有权。你应该将这些目录的组权限分配给 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
在文件中创建一个简单的网络着陆页面,以指示您当前访问的网站。它将如下所示:
<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>
当你完成后,请保存并关闭这个文件。现在你有一些页面可以展示给你的两个域名的访问者。
第三步 – 为每个域名创建服务器块文件
现在您已经拥有内容来提供,您需要创建服务器块,告诉Nginx如何实现这一点。
默认情况下,Rocky Linux上的Nginx在其主配置文件nginx.conf中包含一个名为”default”的服务器块。该服务器块如下所示,位于该文件内部。
…
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;
}
}
首先,然后,你应该复查监听指令。服务器上的只能有一个服务器块启用default_server选项。这个选项指明如果请求的server_name与可用的服务器块都不匹配时,应由哪个块提供服务。在实际情况中,这种情况不应该经常发生,因为访问者通常会通过你的域名访问你的网站。
您可以选择在监听指令中包含”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以反映您所做的更改。
第四步 – 启用服务器块并重新启动Nginx
您现在有三个启用的服务器块,它们根据其监听指令和服务器名称进行配置以进行响应(您可以在此处阅读有关Nginx如何处理这些指令的更多信息)。
- example.com: Will respond to requests for example.com and www.example.com
- test.com: Will respond to requests for test.com and www.test.com
- default: Will respond to any requests on port 80 that do not match the other two blocks.
完成后保存并关闭文件。接下来,测试以确保您的所有Nginx文件中没有语法错误。
- sudo nginx -t
如果没有发现任何问题,请重启Nginx以使你所做的更改生效。
- sudo systemctl restart nginx
现在Nginx应该能够为你的两个域名提供服务。
步骤5 — 对本机 hosts 文件进行测试修改(可选)
如果你尚未使用指向此服务器IP地址的自己拥有的域名,而是使用了占位符值,你可以修改本地计算机的hosts文件,以便临时测试你的Nginx服务器块配置。
这个将不允许其他访问者正确地查看您的网站,但它将使您能够独立访问每个网站并测试您的配置。它通过拦截通常会传递到DNS以解析域名的请求来实现。而是,您可以将您的主机文件设置为自动将某些域名硬编码到特定的远程地址。
Note
如果您正在使用Mac或Linux环境工作,您的hosts文件位于/etc/hosts。
- sudo nano /etc/hosts
如果你使用的是Windows操作系统,你的hosts文件位于C:\Windows\System32\drivers\etc\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的所有请求,并将它们发送到您的服务器上,这是您进行测试时所需要的,尤其是当您并不拥有这些域名的时候。
当你完成后,请保存并关闭文件。
第六步 — 测试您的结果
既然你已经做好了一切准备,现在应该测试一下你的服务器区块是否正常运行。你可以通过在浏览器中访问你的域名来进行检查:
http://example.com
你应该看到一个看起来像这样的页面。
如果你访问你的第二个域名,你应该看到一个稍微不同的网站。
http://test.com
如果这两个网站都可以运行,那么您已成功配置了两个独立的Nginx服务器块。
在这一点上,如果你在本地计算机上调整了主机文件以进行测试,那么你可能希望删除你添加的那些行。
如果您需要为公共网站访问服务器的域名,您可能想为每个网站购买一个域名。
结论
现在你应该有能力为每个你希望从同一台服务器上托管的域名创建服务器区块。只要你的硬件能够处理流量,您可以创建无数个服务器区块,没有真正的限制。
接下来,你可能想要学习如何使用Nginx设置密码认证。