你是否拥有只有一个公共 IP 地址的服务器,但需要托管多个域名或子域名?你会怎么做?如果你是初学者,这种情况可能会让人困惑。但别担心,本教程会为你提供帮助,这样你就可以在一个服务器上为 NGINX 子域和多个域名提供服务。
在本教程中,你将学习如何在一个具有单个 IP 地址的服务器上有效地为 NGINX 子域或多个域名提供服务!
如果你准备好了,那就开始吧!
先决条件
本教程提供了实践演示,但并不需要太多的先决条件,并假定你已经安装了 Ubuntu Server LTS,启用了 SSH,并安装了NGINX。本教程中的演示是在 Ubuntu Server LTS 20.04.1 上进行的。
设置 DNS 记录
在你可以为 NGINX 子域或多个域名提供服务之前,你需要在DNS 控制面板中添加一个A 记录。A 记录将所有域名和子域名绑定并指向单个 IP 地址,以便让网络浏览器找到你的网站。
1. 启动你喜欢的网络浏览器,并登录到你的DNS控制面板。
2. 点击添加记录开始添加A记录。你的浏览器将重定向到一个页面,在这里你将配置你的域和子域的DNS设置。

现在使用以下配置来设置DNS设置:
在类型字段中选择A记录。
在主机字段中输入@,在值字段中输入你的服务器IP。
在TTL字段中选择你想要的值,然后点击确认按钮保存设置。
为其他子域重复相同的过程。

最终的DNS设置页面如下所示。

你的DNS记录控制面板的功能和设计可能有所不同,但相同的原则适用于所有情况。
为NGINX域名和子域设置Web目录
现在你已经为你的域和子域添加了A记录,是时候设置它们的Web目录了。NGINX带有一个默认的虚拟主机文件,并配置为服务于位于/usr/share/nginx/html的Web目录。
你将在NGINX默认文档根目录(/var/www/html)内为每个域创建一个单独的Web目录。
1. 首先,打开您的终端并运行以下命令来为所有域名和子域名创建网络目录。这样做可以将每个网站的文件分离、组织和隔离。
2. 接下来,运行chown
命令以递归方式(-R
)将步骤一中创建的每个目录的所有权更改为www-data
用户和组。您将每个目录的所有权更改为www-data
用户和组,因为NGINX以www-data
用户运行。
3. 在您喜欢的代码编辑器中创建一个名为index.html的文件,然后将下面的代码复制/粘贴到index.html文件中。将文件保存在您的域的主要网络目录(/var/www/html/awstutorial.net)中。
以下HTML代码在Web浏览器中打开index.html文件时显示一条消息,内容为“恭喜!awstutorial.net网站正在运行!”。
4. 最后,在/var/www/html/web1.awstutorial.net和/var/www/html/web2.awstutorial.net目录中创建相同的index.html。但在每个index.html的代码中将awstutorial.net
替换为web1.awstutorial.net
和web2.awstutorial.net
。
为NGINX域名和子域名设置虚拟主机
您已经为您的域名和子域名准备了一个index.html页面,通过NGINX Web服务器提供。下一步是为每个域名创建一个NGINX虚拟主机配置文件,以提供HTML页面。
1. 在您偏好的代码编辑器中创建一个名为awstutorial.net的NGINX虚拟主机配置文件,然后将下面的代码复制粘贴到该文件中。将文件保存在/etc/nginx/sites-available/目录中。
下面的代码控制您的服务器的行为,例如当用户尝试访问您的域时的服务器名称和索引(主页)。
2. 接下来,运行以下nginx
命令来检查(-t
)NGINX配置文件是否存在语法错误。
如果在NGINX配置文件中未发现语法错误,则会得到以下输出。

3. 接下来,运行以下命令创建一个符号链接(ln -s
),从/etc/nginx/sites-available到/etc/nginx/sites-enabled/目录。该命令启用了awstutorial.net虚拟主机配置文件。
sites-available 和 sites-enabled 的格式在 NGINX Ubuntu 安装中是标准的,但其他发行版可能使用不同的标准。
4. 重复第一步至第三步,创建名为web1.awstutorial.net和web2.awstutorial.net的 NGINX 虚拟主机配置文件。
在每个 NGINX 虚拟主机配置文件中更改以下行:
- 用每个子域名的 webroot 目录替换
root /var/www/html/awstutorial.net
这一行(root /var/www/html/web1.awstutorial.net
和root /var/www/html/web2.awstutorial.net
)。 - 用每个子域名的名称替换
server_name awstutorial.net
这一行(server_name web1.awstutorial.net
和server_name web2.awstutorial.net
)。
5. 现在运行以下sudo ln
命令,就像在第三步中所做的那样,以启用虚拟主机配置文件。
6. 运行以下 systemctl
命令重新启动 NGINX(restart nginx
)服务以应用所有配置更改。
7. 最后,使用浏览器导航到域名和子域名的 URL,测试网站是否正常工作。
如果域名和子域名加载成功,您将看到以下类似的消息。

在 NGINX 域名和子域名上设置 HTTPS
您已成功设置并测试了一个 NGINX 域名和子域名的 HTTP 协议,这很好。但是,您必须通过启用 HTTPS 来保护您的域名和子域名的连接。如何?使用您将从类似 Let’s Encrypt SSL 的证书颁发机构获取的证书。
1. 首先,运行以下命令安装 Certbot 软件包(apt-get install certbot
)。Certbot 可让您为您的域名和子域名下载 SSL 证书。
2. 接下来,运行下面的certbot
命令来下载 SSL 证书(certonly
)用于你的域名(-d awstutorial.net
)。请注意,你需要同意服务条款(--agree-tos
)并提供你的邮箱地址(--email
)。
请将邮箱替换为你自己的。
3. 输入‘1’以选择NGINX Web 服务器插件(nginx)来认证ACME CA,如下所示。

选择了 NGINX Web 服务器插件后,你将看到 SSL 证书下载进度,用于你的域名(awstutorial.net)。
默认情况下,Let’s Encrypt 的 SSL 证书存储在/etc/letsencrypt/live/目录中。

4. 现在,像在第二步中一样,依次运行下面的命令来下载剩余子域名的 SSL 证书(web1.awstutorial.net
和 web2.awstutorial.net
)。
5. 最后,运行下面的ls
命令来列出/etc/letsencrypt/live/目录中包含 (*
) awstutorial.net
在名称中的所有 SSL 证书。这样做可以验证 SSL 证书是否存在。
在下面,你将看到你的域名和子域名的 SSL 证书。

配置 NGINX 虚拟主机以使用 SSL 证书
在这一点上,您已经可以使用SSL证书。但是,您如何使用它们来保护您的域和子域呢?您将在每个NGINX虚拟主机配置文件的server
块中定义证书的路径。
1. 打开位于/etc/nginx/sites-available/
目录中的awstutorial.net NGINX虚拟主机配置文件,使用您喜欢的代码编辑器。
2. 用下面的代码替换文件的内容,在其中定义您域的SSL证书的路径和SSL协议(在SSL证书路径
下)。
3. 重复执行相同的步骤(步骤一至步骤二)以配置剩余的虚拟主机配置文件(web1.awstutorial.net和web2.awstutorial.net)。但请确保将SSL证书的路径替换为您子域名的证书路径(在SSL证书路径
下)。
4. 现在重新运行下面的systemctl
命令,以重新启动NGINX服务以应用配置更改。
5. 最后,通过浏览器导航到您的域名和子域名的URL。但这次,不要使用HTTP协议,而是使用HTTPS来查看它们是否正常工作。
在下面,您可以看到地址栏中的挂锁图标,表示该网站已使用您的SSL证书进行了安全保护。

结论
在本教程中,您已经学会了如何通过配置虚拟主机配置文件来提供NGINX子域或多个域。您还介绍了如何使用您在虚拟主机配置文件中定义的SSL证书来保护您的域。
现在,为什么不将这个设置用于生产环境,例如在单个服务器上托管多个应用程序,并提供实惠的Web托管服务?