Loading...
墨滴

码农小黄

2021/05/29  阅读:25  主题:橙蓝风

在 Nginx 中配置二级域名

前言

这两天在研究如何通过 Nginx 来配置二级域名(subdomains),觉得挺有意思的,想跟大家分享一下。我在一个机器部署多个子域名的原因很简单,就是因为:穷。。。没钱买服务器,于是想把多个服务部署在同一台机器上面,通过 Nginx 来实现。阅读本文后,你会明白:

  • 如何在阿里云配置关于 DNS 的“域名解析”
  • 如何在 Nginx 中配置 HTTP 的重定向(redirection)
  • 如何在 Nginx 中配置部署多个子域名(subdomains)

在开始之前,先明确一下目的。文章的目的是造出让三个关于吉米数据(?https://jimidata.fr)的子域名,然后让它们都指向同一个服务器:

URL IP 地址 描述
?https://www.jimidata.fr 47.243.61.237 静态网页服务
?https://api.jimidata.fr 47.243.61.237 API 服务
?https://blog.jimidata.fr 47.243.61.237 博客服务

吉米数据是一个没什么实质内容的网站,只是为了练手用的。下面就让我们开始吧!

配置域名解析

第一步在阿里云的“云解析 DNS / 域名解析 / 解析设置”中添加新的记录。这里以api.jimidata.fr为例:我们选择一个 A 记录,也就是将域名指向一个 IPV4 地址;它的解析路线根据阿里云默认线路实现;记录值是我的机器的名字;缓存最长存活时间十分钟。具体配置如下:

阿里云:在解析设置中添加记录
阿里云:在解析设置中添加记录

用同样的方法配置其他的几个记录,最后生成结果如下:

阿里云:解析列表
阿里云:解析列表

可以看到,除了 HTTPS 的证书验证以外,其他的主机记录全部指向同一台机器,也就是我的服务器47.243.61.237

配置 HTTP 重定向

第二步是 HTTP 重定向(redireciton)。当用户以 HTTP 协议访问的时候,自动导向 HTTPS 保证安全。

server {
    listen       80;
    server_name  _;
    return       301 https://$host$request_uri;
}

解释一下上面的配置:

  • listen 80 这个命令告诉 Nginx 要监听 80 号端口。所有 HTTP 都是通过 80 号端口抵达的。
  • server_name _ 这个命令告诉 Nginx 无论什么 hostname 都会被匹配,无论是 www.jimidata.frapi.jimidata.frblog.jimidata.fr还是别的 host。
  • return 301 https://$host$request_uri 把用户的 HTTP 请求永久重定向(301 Moved Permanently[1])到 HTTPS 那边,并且保证链接的剩余部分不变:host 以及 URI 部分都是一样的。唯一改变的就是把 HTTP 变成了 HTTPS。

整个 Nginx 只需要这一个服务器(Server block)监听 80 号端口就可以了。因为它对所有的 hostname 都是匹配的。

配置子域名

下一步就是在 Nginx 中配置三个子域名相对应的服务器:

ssl_certificate      /path/to/fullchain.cer;
ssl_certificate_key  /path/to/cert.key;

server {
    listen       443 ssl;
    server_name  www.jimidata.fr;
    root         /app/jimi/www.jimidata.fr;
    index        index.html;
}

server {
    listen       443 ssl;
    server_name  api.jimidata.fr;
    root         /app/jimi/api.jimidata.fr;
    index        index.html;
}

server {
    listen       443 ssl;
    server_name  blog.jimidata.fr;
    root         /app/jimi/blog.jimidata.fr;
    index        index.html;
}

解释一下上面的配置:

  • ssl_certificate /path/to/fullchain.cer 是 SSL 证书存放的地址。
  • ssl_certificate_key /path/to/cert.key 是 SSL 密匙存放的地址。
  • listen 443 ssl 监听 443 号端口,也就是 HTTPS 端口。
  • server_name 填写相应的子域名,不需要加 https:// 的前缀。填写这个使得 Nginx 可以正确匹配不同子域的请求。
  • root /app/jimi/blog.jimidata.fr 指示这个子域名所对应的文件夹根目录的位置。
  • index index.html 指示显示主页时所使用的文件名。

下一个问题是:上面所说的配置,它应该放在哪里呢?其实它的存放位置有很多选择,你可以:

  • 放在主配置文件 /etc/nginx/nginx.conf 里面的 http block
  • 放在配置文件夹 /etc/nginx/conf.d/ 里面,但是我觉得这个文件夹主要是放公共的配置文件的,放这里虽然方便,但似乎不太妥当。
  • 放在文件夹 /etc/nginx/sites-available/ 里面。每一个子域网站用一个独立的文件存储,然后再文件夹 /etc/nginx/site-enabled 创建快捷方式(symlink)激活这些子域网站。

没准还有别的配置方法,希望大家留言分享哈。配置完成后,重启 Nginx 服务器来激活这些配置:

nginx -s reload

验证结果

打开网站来验证一下结果:

Home Service
Home Service
API Service
API Service
Blog Service
Blog Service

再检查一下 HTTP 到 HTTPS 的重定向:

➜  ~ curl -iL http://jimidata.fr
HTTP/1.1 301 Moved Permanently
Server: nginx/1.20.0
Date: Sat, 29 May 2021 14:13:46 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://jimidata.fr/

HTTP/1.1 200 OK
Server: nginx/1.20.0
Date: Sat, 29 May 2021 14:13:48 GMT
Content-Type: text/html
Content-Length: 111
Last-Modified: Sat, 29 May 2021 07:30:14 GMT
Connection: keep-alive
ETag: "60b1ed86-6f"
Accept-Ranges: bytes

<!DOCTYPE html>
<html>
<head>
    <title>Jimi</title>
</head>
<body>
    <h1>Home Service</h1>
</body>
</html>

你可以看见 curl 一共发送了两个请求:第一个请求被永久地重导向(301 Moved Permanently)到 HTTPS 版的网页;然后第二个请求成功(200 OK)并显示网页。

扩展

如何从这篇文章中扩展出去?

  • 如果想知道关于给 Nginx 配置 HTTPS 服务器的更多详情,访问官网页面:NGINX SSL Termination[2]
  • 看完了这篇文章还是不懂怎么配置二级域名?可以翻墙看看 Coding with Glove 的 YouTube 视频 Using Nginx to Host Multiple Websites on One Server[3]

结论

在本文中,我们看到了如何通过 Nginx 来配置二级域名:如何在阿里云配置关于 DNS 的域名解析;如何在 Nginx 中配置 HTTP 到 HTTPS 的重定向;如何在 Nginx 中配置多个子域名。最后,我们还分享了一些资源,让大家可以从这篇文章拓展出去。希望这篇文章能够解决你关于 Nginx 的配置问题,并且给你带来一些额外的思考。谢谢大家!

参考文献

写作不易,希望大家点个赞、点个在看支持一下,谢谢!

参考资料

[1]

301 Moved Permanently: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

[2]

NGINX SSL Termination: https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-http/

[3]

Using Nginx to Host Multiple Websites on One Server: https://youtu.be/b6YKx72XXQM

码农小黄

2021/05/29  阅读:25  主题:橙蓝风

作者介绍

码农小黄