域名解析中,A记录只能指向服务器IP,CNAME只能指向另一个域名。如果希望访问服务自动使用非标准端口,比如Minecraft服务器把默认25565改成其他端口,A记录和CNAME都无法实现。这时候就需要SRV记录。SRV记录的作用很简单,告诉客户端目标服务部署在哪台主机,使用哪个端口通信。
SRV全称Service Record,定义在RFC 2782,DNS类型编号33。和普通解析记录最大区别,普通记录只返回服务器地址,SRV额外附带端口信息。一条完整SRV记录包含四项内容:优先级、权重、端口、目标主机。优先级和权重都是数字,优先级数值越小优先度越高,客户端优先连接优先级更低的主机。多台主机优先级相同,再参考权重,权重越高分配到的请求越多,用来做负载均衡。端口就是服务监听端口,目标主机是承载服务的域名,这个域名必须有A记录或者AAAA记录,不能填写CNAME。

SRV记录书写格式固定。服务名和协议名前面都加下划线,中间用点分隔,后面填写域名。例如配置SIP电话服务,服务名_sip,协议_tcp,域名example.com,主机记录填写_sip._tcp.example.com。记录值按顺序填写优先级、权重、端口、目标主机,空格隔开。腾讯云和阿里云控制台填写规则一致,腾讯云填写完成会自动在目标主机末尾补点,不用手动添加。
拿Minecraft举例,这是SRV记录最常用场景。假设域名example.com,网站由A记录指向一台服务器,Minecraft服务部署在另一台机器,IP地址203.0.113.1。想要玩家直接输入example.com进入游戏,不用额外填写端口。操作分为两步。先给Minecraft服务器新增A记录,主机记录填写mc,记录值203.0.113.1。再添加SRV记录,主机记录_minecraft._tcp.example.com,记录值0 5 25565 mc.example.com。0代表优先级,5是权重,25565是Minecraft默认端口,mc.example.com就是前面A记录对应的主机。玩家客户端输入example.com,会查询SRV记录,自动获取端口和目标主机完成连接。
如果修改Minecraft监听端口,从25565改为30000,只需要修改SRV记录内端口数字,A记录不用改动。客户端读取SRV记录之后,按照记录内端口发起连接,不会关心服务器底层监听端口。SRV自定义端口的原理就是把端口信息写进DNS记录,客户端读取之后直接使用。
SRV记录存在使用前提,只有客户端主动查询SRV记录才会生效。Minecraft Java版、SIP电话、微软活动目录、XMPP即时通讯,还有部分版本MySQL都支持SRV。但是浏览器访问网站,不会发起SRV查询,无法依靠SRV让http://example.com自动跳转8080端口。腾讯云文档也标注,SVCB和SRV虽然支持指定端口,但浏览器访问不生效,仅支持特定应用程序。配置之前确认目标应用是否支持SRV,不支持的情况下配置没有效果。
配置SRV容易出现几类错误。主机记录下划线不能省略,把_minecraft写成minecraft,客户端无法查询记录。目标主机末尾的点号,腾讯云自动补齐,如果自建DNS或者手动编写zone文件,遗漏点号会造成解析失败。优先级、权重顺序不能颠倒,顺序填错负载均衡逻辑会错乱。TTL建议设置600秒,修改记录等待大约十分钟生效,TTL设置过长,每次修改等待时间会更久。
SRV的优先级和权重搭配,还可以实现故障转移。准备两台Minecraft服务器,一台优先级10,另一台优先级20。正常情况下客户端全部访问优先级10的主机,这台服务故障,客户端自动切换到优先级20的备用主机。相同优先级多台主机依靠权重分配流量,权重5和权重10两台服务器,后者接收请求大约是前者两倍。这套方案适合游戏服务器或者企业内部服务,一次配置完成,后续新增、更换服务器只修改DNS记录,不用通知用户调整客户端。
阿里云、腾讯云解析后台都支持SRV记录,添加记录时类型选择SRV,主机记录填写服务名协议名,记录值按优先级 权重 端口 目标主机填写。Cloudflare DNS同样支持SRV记录,填写格式一致。配置完成验证方法:Windows打开命令行执行nslookup -type=SRV _minecraft._tcp.example.com,Linux系统执行dig SRV _minecraft._tcp.example.com。成功返回填写的记录内容就代表生效;返回NXDOMAIN或者空结果,回去检查主机记录下划线和记录格式。