如何为NGINX子域或多个域名提供服务

你是否拥有只有一个公共 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设置。

Adding an A Record

现在使用以下配置来设置DNS设置:

类型字段中选择A记录。

主机字段中输入@,在字段中输入你的服务器IP。

TTL字段中选择你想要的值,然后点击确认按钮保存设置。

为其他子域重复相同的过程。

Configuring DNS settings for Domain and Subdomains The final DNS Settings page looks like the one below.

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

Viewing DNS Settings Page

你的DNS记录控制面板的功能和设计可能有所不同,但相同的原则适用于所有情况。

为NGINX域名和子域设置Web目录

现在你已经为你的域和子域添加了A记录,是时候设置它们的Web目录了。NGINX带有一个默认的虚拟主机文件,并配置为服务于位于/usr/share/nginx/html的Web目录。

你将在NGINX默认文档根目录(/var/www/html)内为每个域创建一个单独的Web目录。

1. 首先,打开您的终端并运行以下命令来为所有域名和子域名创建网络目录。这样做可以将每个网站的文件分离、组织和隔离。

sudo mkdir /var/www/html/awstutorial.net
sudo mkdir /var/www/html/web1.awstutorial.net
sudo mkdir /var/www/html/web2.awstutorial.net

2. 接下来,运行chown命令以递归方式(-R)将步骤一中创建的每个目录的所有权更改为www-data用户和组。您将每个目录的所有权更改为www-data用户和组,因为NGINX以www-data用户运行。

sudo chown -R www-data:www-data /var/www/html/awstutorial.net
sudo chown -R www-data:www-data /var/www/html/web1.awstutorial.net
sudo chown -R www-data:www-data /var/www/html/web2.awstutorial.net

3. 在您喜欢的代码编辑器中创建一个名为index.html的文件,然后将下面的代码复制/粘贴到index.html文件中。将文件保存在您的域的主要网络目录(/var/www/html/awstutorial.net)中。

以下HTML代码在Web浏览器中打开index.html文件时显示一条消息,内容为“恭喜!awstutorial.net网站正在运行!”。

<html>
	<head>
	  <title>Welcome to awstutorial.net!</title>
  </head>
	  <body>
	    <h1>Congratulations! The awstutorial.net website is working!</h1>
    </body>
</html>

4. 最后,在/var/www/html/web1.awstutorial.net/var/www/html/web2.awstutorial.net目录中创建相同的index.html。但在每个index.html的代码中将awstutorial.net替换为web1.awstutorial.netweb2.awstutorial.net

为NGINX域名和子域名设置虚拟主机

您已经为您的域名和子域名准备了一个index.html页面,通过NGINX Web服务器提供。下一步是为每个域名创建一个NGINX虚拟主机配置文件,以提供HTML页面。

1. 在您偏好的代码编辑器中创建一个名为awstutorial.net的NGINX虚拟主机配置文件,然后将下面的代码复制粘贴到该文件中。将文件保存在/etc/nginx/sites-available/目录中。

下面的代码控制您的服务器的行为,例如当用户尝试访问您的域时的服务器名称和索引(主页)。

server {
        # 绑定TCP端口80。
        listen 80; 

				# 用于搜索文件的根目录
        root /var/www/html/awstutorial.net;
				# 定义用作索引页的文件
        index index.html index.htm;
				# 定义域名或子域名。 
        # 如果在服务器块中未定义server_name,则
				# Nginx使用“空”名称
        server_name awstutorial.net;

        location / {
            # 对于服务器接收到的情况下返回404错误 
						# 请求不可追踪的文件和目录。
            try_files $uri $uri/ =404;
        }
    }

2. 接下来,运行以下nginx命令来检查(-t)NGINX配置文件是否存在语法错误。

sudo nginx -t

如果在NGINX配置文件中未发现语法错误,则会得到以下输出。

Verifying NGINX configuration file

3. 接下来,运行以下命令创建一个符号链接(ln -s),从/etc/nginx/sites-available/etc/nginx/sites-enabled/目录。该命令启用了awstutorial.net虚拟主机配置文件。

sudo ln -s /etc/nginx/sites-available/awstutorial.net /etc/nginx/sites-enabled/

sites-available 和 sites-enabled 的格式在 NGINX Ubuntu 安装中是标准的,但其他发行版可能使用不同的标准。

4. 重复第一步至第三步,创建名为web1.awstutorial.netweb2.awstutorial.net的 NGINX 虚拟主机配置文件。

在每个 NGINX 虚拟主机配置文件中更改以下行:

  • 用每个子域名的 webroot 目录替换root /var/www/html/awstutorial.net这一行(root /var/www/html/web1.awstutorial.netroot /var/www/html/web2.awstutorial.net)。
  • 用每个子域名的名称替换server_name awstutorial.net这一行(server_name web1.awstutorial.netserver_name web2.awstutorial.net)。

5. 现在运行以下sudo ln命令,就像在第三步中所做的那样,以启用虚拟主机配置文件。

# 启用 web1.awstutorial.net NGINX 虚拟主机配置文件
sudo ln -s /etc/nginx/sites-available/web1.awstutorial.net /etc/nginx/sites-enabled/
# 启用 web2.awstutorial.net NGINX 虚拟主机配置文件
sudo ln -s /etc/nginx/sites-available/web2.awstutorial.net /etc/nginx/sites-enabled/

6. 运行以下 systemctl 命令重新启动 NGINX(restart nginx)服务以应用所有配置更改。

sudo systemctl restart nginx

7. 最后,使用浏览器导航到域名和子域名的 URL,测试网站是否正常工作。

如果域名和子域名加载成功,您将看到以下类似的消息。

Verifying websites are loading through the web browser.

在 NGINX 域名和子域名上设置 HTTPS

您已成功设置并测试了一个 NGINX 域名和子域名的 HTTP 协议,这很好。但是,您必须通过启用 HTTPS 来保护您的域名和子域名的连接。如何?使用您将从类似 Let’s Encrypt SSL 的证书颁发机构获取的证书。

1. 首先,运行以下命令安装 Certbot 软件包(apt-get install certbot)。Certbot 可让您为您的域名和子域名下载 SSL 证书。

sudo apt-get install certbot python3-certbot-nginx -y

2. 接下来,运行下面的certbot 命令来下载 SSL 证书(certonly)用于你的域名(-d awstutorial.net)。请注意,你需要同意服务条款(--agree-tos)并提供你的邮箱地址(--email)。

sudo certbot certonly --agree-tos --email [email protected] -d awstutorial.net

请将邮箱替换为你自己的。

3. 输入‘1’以选择NGINX Web 服务器插件(nginx)来认证ACME CA,如下所示。

Selecting Plugin to Authenticate with ACME CA

选择了 NGINX Web 服务器插件后,你将看到 SSL 证书下载进度,用于你的域名(awstutorial.net)。

默认情况下,Let’s Encrypt 的 SSL 证书存储在/etc/letsencrypt/live/目录中。

Showing Download Progress of the SSL Certificate

4. 现在,像在第二步中一样,依次运行下面的命令来下载剩余子域名的 SSL 证书(web1.awstutorial.netweb2.awstutorial.net)。

sudo certbot certonly --agree-tos --email [email protected] -d web1.awstutorial.net
sudo certbot certonly --agree-tos --email [email protected] -d web2.awstutorial.net

5. 最后,运行下面的ls命令来列出/etc/letsencrypt/live/目录中包含 (*) awstutorial.net 在名称中的所有 SSL 证书。这样做可以验证 SSL 证书是否存在。

ls /etc/letsencrypt/live/*awstutorial.net/

在下面,你将看到你的域名和子域名的 SSL 证书。

Showing SSL certificate for all domains.

配置 NGINX 虚拟主机以使用 SSL 证书

在这一点上,您已经可以使用SSL证书。但是,您如何使用它们来保护您的域和子域呢?您将在每个NGINX虚拟主机配置文件的server块中定义证书的路径。

1. 打开位于/etc/nginx/sites-available/目录中的awstutorial.net NGINX虚拟主机配置文件,使用您喜欢的代码编辑器。

2. 用下面的代码替换文件的内容,在其中定义您域的SSL证书的路径和SSL协议(在SSL证书路径下)。

server {
	     # 绑定TCP端口80。
       listen 80;
	     # 定义域名或子域名。
       # 如果在服务器块中未定义server_name,则 
	     # Nginx将使用'empty'名称
       server_name awstutorial.net;
	     # 将流量重定向到相应的 
	     # HTTPS服务器块,状态码为301
       return 301 https://$host$request_uri;
       }

server {
        # 绑定TCP端口443并启用SSL。
        listen 443 SSL;
	      # 用于搜索文件的根目录        
	      root /var/www/html/awstutorial.net; 
	      # 定义域名或子域名。
        # 如果在服务器块中未定义server_name,则 
	      # Nginx将使用'empty'名称
        server_name awstutorial.net;

	      # SSL证书的路径
        ssl_certificate /etc/letsencrypt/live/awstutorial.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/awstutorial.net/privkey.pem;
	      # 使用certbot命令生成的文件。
        include /etc/letsencrypt/options-ssl-nginx.conf;
	      # 定义dhparam.pem文件的路径。
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {
	      # 在服务器收到 
	      # 请求不可追踪的文件和目录时返回404错误。
        try_files $uri $uri/ =404;
        }

    }

3. 重复执行相同的步骤(步骤一至步骤二)以配置剩余的虚拟主机配置文件(web1.awstutorial.netweb2.awstutorial.net)。但请确保将SSL证书的路径替换为您子域名的证书路径(在SSL证书路径下)。

4. 现在重新运行下面的systemctl命令,以重新启动NGINX服务以应用配置更改。

sudo systemctl restart nginx

5. 最后,通过浏览器导航到您的域名和子域名的URL。但这次,不要使用HTTP协议,而是使用HTTPS来查看它们是否正常工作。

在下面,您可以看到地址栏中的挂锁图标,表示该网站已使用您的SSL证书进行了安全保护。

Verifying Domain is Secure

结论

在本教程中,您已经学会了如何通过配置虚拟主机配置文件来提供NGINX子域或多个域。您还介绍了如何使用您在虚拟主机配置文件中定义的SSL证书来保护您的域。

现在,为什么不将这个设置用于生产环境,例如在单个服务器上托管多个应用程序,并提供实惠的Web托管服务?

Source:
https://adamtheautomator.com/nginx-subdomain/