如果你不确定虚拟主机是什么,让我解释一下。这是一个Apache HTTP Server 术语,然而,Nginx 用户也经常使用它。事实上,Nginx 的正确术语是
server block
。虚拟主机是一种在单个服务器上托管多个域名的方法。
当你在服务器上启动像 Nginx 这样的 Web 服务器软件时,该 Web 服务器将自己绑定到一个或多个网络端口。通常用于将成为端口 80 和 443 的 Web 服务器。
现在,当计算机访问网站时,它将通过 Internet 向服务器发送请求,服务器将接收该请求。服务器要做的第一件事是查看请求发送到目标端口的端口。
接下来,它将使用该目标端口来确定将该信息转发到哪个应用程序。这意味着你的 Web 服务器只能有一个接收请求的应用程序。
但是,如果你想在同一 Web 服务器上托管两个不同的网站怎么办?服务器需要能够判断数据包何时进入请求网站。它需要能够知道正在请求哪个网站,以便知道要发回哪些信息。
无论请求哪个网站,服务器都不能仅使用端口号和目标端口来确定客户端尝试访问哪个网站。服务器要做的就是说我要向 Nginx 发送这个请求,然后 Nginx 必须从那里决定它要发回什么。
Nginx 有一个叫做
server blocks
的概念。服务器块实际上可以用于两种不同的事情。它们可用于根据请求的 IP 地址为不同的网站提供服务,也可用于根据正在使用的域名为不同的网站提供服务。
因此,当你输入网站名称时
www.example.com
,当服务器收到该名称时,Nginx 实际上可以查看请求的服务器名称的 HTTP 标头内部,然后根据其配置的虚拟主机,决定存储哪个目录网站文件,并根据服务器名称将正确的响应返回给客户端。
我们可以在两个目录中创建和存储我们的虚拟主机配置文件。它们都位于
/etc/nginx
目录中。这两个目录的名称是sites-available
和sites-enabled
。
/etc/nginx/sites-available
定义单个虚拟主机(网站)的目录。请记住,Nginx 不会使用在此目录中找到的配置文件,除非它们链接到该
/etc/nginx/sites-enabled
目录。
/etc/nginx/sites-enabled
由 Nginx 主动提供服务的虚拟主机(网站)列表。
你可能想知道为什么我们需要两个目录来存储我们的虚拟主机文件?这样做的主要好处是我们可以在 Nginx 服务器上创建许多虚拟主机文件,但我们可以根据我们的要求启用它们。
现在,我们将创建虚拟主机文件以在 Nginx 服务器中托管具有多个域的多个站点。域名为
rumenz.com
和tooltt.com
。
我们需要做的第一件事是为每个虚拟主机创建一个目录来存储不同的网站内容。我们将这些目录放在其中
/var/www
,并以每个域名命名。运行以下命令来创建目录:
sudo mkdir -p /var/www/rumenz
sudo mkdir -p /var/www/tooltt
-p
上面命令中的 标志告诉mkdir
在此过程中创建任何必要的父目录。
接下来,出于演示目的,让我们
index.html
在域的文档根目录中创建一个 文件,以便我们可以显示一些内容。
sudo vim /var/www/rumenz/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to Website 1!</title>
</head>
<body>
<h1>入门小站!</h1>
</body>
</html>
现在对 tooltt.com 重复上述步骤。
sudo vim /var/www/tooltt/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to Website 2!</title>
</head>
<body>
<h1>tooltt.com!</h1>
</body>
</html>
要在
sites-available
目录中创建 Nginx 虚拟主机文件,请执行以下命令:
sudo vim /etc/nginx/sites-available/rumenz.conf
需要注意的是,Nginx 虚拟主机配置文件可以任意命名,但通常情况下,使用域名是一个好习惯。
现在,将以下内容粘贴到你的虚拟主机文件中:
server {
listen 80;
server_name www.rumenz.com;
root /var/www/rumenz;
access_log /var/log/nginx/rumenz-access.log;
error_log /var/log/nginx/rumenz-error.log;
}
为了让事情更清楚,让我们分解这个语法。以下是每个参数的含义:
listen
: 指定 Nginx 服务器在哪个端口上侦听连接。server_name
: 在这里,我们匹配对我们域的请求。该指令包含我们要用于访问我们网站的域名列表。root
:我们存储网站文件的目录的位置。error_log
:我们存储此虚拟主机的所有错误日志的日志文件的完整路径。access_log
:我们存储此虚拟主机的所有访问日志的日志文件的完整路径。现在我们可以使用我们的初始虚拟主机配置作为我们第二个文件的基础。只需复制它以创建一个新文件:
sudo cp /etc/nginx/sites-available/rumenz.conf /etc/nginx/sites-available/tooltt.conf
打开新文件并调整它以匹配我们的第二个 (
tooltt.com
) 域名:
sudo vim /etc/nginx/sites-available/tooltt.conf
server {
listen 80;
server_name www.tooltt,com;
root /var/www/tooltt;
access_log /var/log/nginx/tooltt-access.log;
error_log /var/log/nginx/tooltt-error.log;
}
在测试之前我们需要做的最后一件事是启用虚拟主机。我们可以通过创建从文件到
sites-enabled
目录的符号链接来做到这一点 :
sudo ln -s /etc/nginx/sites-available/rumenz.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/tooltt.conf /etc/nginx/sites-enabled/
如下图所示,这些文件现在已链接到
sites-enabled
目录中。将 Nginx 配置文件链接到启用站点的目录中
在我们继续之前,让我们仔细检查一下是否有任何错别字。测试 Nginx 配置的正确语法:
sudo nginx -t
最后,如果没有发现问题,重启Nginx
sudo systemctl restart nginx
为了测试 Nginx 虚拟主机,我们首先需要将我们的域名记录指向服务器的 IP 地址。在我们的例子中,服务器 IP 地址是
192.168.122.101
.编辑
/etc/hosts
文件
vim /etc/hosts
192.168.122.101 rumenz.com
192.168.122.101 tooltt.com
完成后保存并关闭文件。以这种方式进行将允许我们测试我们实际上并不拥有的域。
现在打开浏览器输入
www.rumenz.com
并www.tooltt.com
。你将分别看到两个域的索引页面。
要在 Nginx 中禁用虚拟主机,我们只需要删除我们在启用虚拟主机文件时创建的符号链接。例如,要禁用
tooltt.com
,我们只需要执行以下命令:
sudo rm -rf /etc/nginx/sites-enabled/tooltt.conf
要应用更改,我们必须重新启动 Nginx 服务器:
sudo systemctl restart nginx