尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

搭建二级域名分发系统:迅风DNS Pro V3.1.2部署与DNS API对接详解

搭建二级域名分发系统:迅风DNS Pro V3.1.2部署与DNS API对接详解 简介这是一套面向域名服务商、DNS代理运营者及Web系统开发者的一站式二级域名分发管理系统源码解决多平台DNS解析统一纳管、订单工单闭环与合规审计难题。资源包含V3.1.2完整可部署版本集成阿里云、Cloudflare、腾讯云等11家主流DNS服务商插件支持解析管理、支付体系、用户权限、违规检测与多主题界面切换。压缩包共2000个文件主体为1257个PHP后端逻辑文件、269个JS交互脚本、116个CSS样式文件及85份Markdown文档含搭建教程与配置说明另有SQL数据库结构、YML环境配置及多套主题CSS资源总大小11.26MB。目前已有198人学习下载提供开箱即用的目录结构、清晰的模块划分如tree-select、el-table-column等组件化样式已预编译、完整日志审计链路与实名认证等合规功能实现适合中高级PHP开发者快速二次开发或私有化部署。 玩域名管理这几年最烦的一件事就是给用户或者项目逐个分配二级域名。主域名只有一个但下面动辄几十上百个子域名要开每次登录域名控制台手动加解析不仅效率低而且人工操作容易出错今天漏一个明天加错一个IP。后来我找到了迅风DNS Pro这套二级域名分发系统V3.1.2版本算是目前比较完整的一个版本源码自带安装向导和搭建教程装完之后用户可以在前台自助申请子域名系统自动调用DNS API完成解析绑定整个流程基本不用管理员干预。这篇文章我就把这个系统从部署到配置到上线的完整过程都拆开讲一遍包括环境准备、源码安装、DNS对接和常见问题排查想自建解析分发平台或者给项目做子域名自助入口的朋友可以参考。这套系统的本质就是把申请二级域名这件事从人工操作变成自动化流程。用户注册登录后在前台提交想要的前缀和服务器IP系统校验通过后自动调用DNS服务商API添加一条解析记录整个过程秒级完成。管理员在后台只需要维护域名池、分配权限、管理用户和处置违规域名就行。核心价值非常明确省钱、省人力、响应快。1. 系统功能拆解二级域名分发到底在解决什么问题1.1 核心模块全景我拿到这套V3.1.2源码后先从目录结构梳理了一遍整体架构不算复杂是典型的PHP MVC结构用户前台和管理员后台分离数据库层面大概有二三十张表。它的核心功能模块可以划分为四块第一块是用户前台。用户注册登录以后可以在前台提交域名申请系统会校验前缀是否可用、IP格式是否正确、当前用户是否达到每日申请上限校验通过后自动写入解析记录。用户还能在列表中看到自己名下所有子域名的解析状态、创建时间、到期时间对不需要的域名可以自助删除。第二块是管理员后台。管理员负责上传主域名到域名池配置每个域名是否允许用户申请、是否需要审核、单用户最大申请数量是多少同时可以查看全站的解析记录一键停用、启用或删除某个子域名。日志功能也值得一提系统会把每次API调用、用户操作都记录下来出问题的时候方便溯源。第三块是DNS对接层。这是整个系统的命脉具体拆解见本文第4部分。V3.1.2版本支持两种对接方式一种是通过API接入阿里云DNS或腾讯云DNSPod这类第三方解析服务另一种是直连自建的PowerDNS数据库写入记录。两种方式各有优劣后面详细说。第四块是定时任务。系统内置了域名到期检查和记录状态同步的任务需要配合计划任务来运行。如果不对接这个任务域名到期后系统不会自动停用解析这个细节很多人搭建的时候会漏掉。1.2 用户申请域名时后端发生了什么从用户视角看申请一个二级域名就是填个表单点个按钮。但从后端逻辑看这里有一连串的动作。我梳理一下正常的处理链路系统先检查用户是否已登录并校验权限。然后检查所申请的主域名是否在域名池中且状态为开放。接着校验前缀是否合法一般只允许数字、字母和短横线。这里有一个容易踩的坑如果开启了泛解析某些特殊前缀如www、mail等可能会和你的业务系统冲突最好在后台把这些保留前缀拉黑。然后系统检查解析记录表中是否已有同名记录避免冲突。最后调用DNS服务商API创建记录并把结果写回数据库。这个链路听着简单但我在实际部署中发现一个很关键的点API调用失败时系统的处理方式。V3.1.2版本如果API返回异常记录状态会标记为创建失败并记录错误信息但用户提交的申请单不会自动回滚。也就是说用户那边看到的是申请失败但表单数据还在重新提交一次即可问题不大。但要注意的是API偶尔会超时这时候要检查服务商那边记录到底建了没有避免用户以为失败了又提交一次导致出现两条相同记录。2. 部署环境准备服务器配置与LNMP初始化2.1 服务器配置要求和选型建议这套源码属于轻量级PHP应用对性能要求并不高但也不能说随便找个最低配的小机器就能跑得很舒服。我根据实际运行经验给出的建议是如果只是个人使用、注册用户几十人以内1核2G的云服务器勉强能跑但MySQL和PHP同时跑会有内存压力建议不要装额外的面板插件精简运行环境。如果是要对外提供服务、预计用户量几百人以上建议2核4G起步带宽按实际请求量配一般5Mbps就够用。系统虽然是PHP写的但DNS记录的增删改查走的是API调用真正的查询压力在DNS服务商那一边你自己的服务器压力其实不大。操作系统方面CentOS 7.9和Ubuntu 20.04我实测都能顺利装不过这里有一个版本兼容性问题PHP 7.2到7.4是这套源码的最佳运行区间。我在PHP 7.4环境下跑得很稳但升级到PHP 8.0后后台部分页面出现了函数调用报错主要是源码里用了PHP 8中废弃的某些方法。如果你用的是宝塔面板装环境的时候把PHP版本锁在7.3或7.4不要手贱去选PHP 8.x。MySQL 5.7和8.0都可以但导入数据库文件时注意编码要选utf8mb4否则中文内容会乱码。2.2 宝塔面板安装与基础配置我这次部署还是用的宝塔面板省时省力而且这套源码的搭建教程默认也是基于宝塔写的。国内服务器安装宝塔直接用官方脚本# CentOS yum install -y wget wget -O install.sh http://download.bt.cn/install/install_panel.sh sh install.sh # Ubuntu wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh sudo bash install.sh安装完成后面板地址、账号和密码会显示在终端。首次登录后宝塔会强制要求绑定手机号和修改默认入口这一步不要跳过我见过不少人跳过安全入口设置结果面板暴露在公网被暴力破解的。修改完以后建议把默认的8888端口也换掉再加一个访问IP白名单能关掉的风险口都关掉。LNMP环境我用的是宝塔软件商店里的一键安装。这里有一个细节PHP安装完成后要去设置-配置文件里查看disable_functions把putenv、proc_open、pcntl_signal等函数从禁用列表里移除。这套源码虽然不依赖这些函数做核心操作但部分扩展功能比如发送邮件、执行异步任务会用到不取消这些限制后面会出现一些诡异的报错。另外建议把upload_max_filesize和post_max_size调到50M防止后续上传备份文件或者批量导入数据时被拦。2.3 创建站点并配置PHP运行环境在宝塔面板中点击网站-添加站点填入你准备作为系统入口的域名。这里我建议用独立域名作为系统访问地址比如dns.example.com而不是直接用主域名。因为后面DNS解析要用主域名作为根域两者分开管理会比较清爽。站点创建成功后还需要做两件关键的事情。第一设置运行目录。如果是ThinkPHP框架的源码运行目录要指向/public否则访问会404。第二配置伪静态规则。在站点设置里找到伪静态选项选择ThinkPHP规则或者手动填入location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; break; } }如果不配置伪静态访问后台的URL会带一串长长的参数虽然系统能用但不太美观而且部分路由处理依赖伪静态规则不配好的话登录后跳转会异常。PHP版本的选择在创建站点时就要注意宝塔默认可能给站点分配PHP 8.0或更高版本需要手动切回7.4。我这次部署就是先装好PHP 7.4再在站点设置里指定使用7.4整套流程没出什么兼容性问题。3. 系统源码安装与配置3.1 上传源码与目录权限设置源码包解压后结构一般是这样的├── app ├── config ├── public ├── runtime ├── think └── install把整个源码上传到网站根目录后先不要急着访问做三件事。第一检查install目录是否存在这套系统的安装向导就在这个目录下。第二设置目录权限。我用宝塔的文件管理器把整个站点目录的所有者改为www权限设为755然后runtime和upload这两个目录设为777因为PHP进程需要往里写缓存和上传文件。第三确认public目录是运行目录并且在站点配置中已正确指向。注意不要用root运行PHP也不要给整个目录777权限。宝塔默认用的www用户就够了过宽的权限会给服务器带来不必要的安全隐患。3.2 数据库创建与安装向导在宝塔的数据库管理功能中创建数据库数据库名我用的是dnspro用户名和数据库名保持一致密码设置一个强密码。字符集选择utf8mb4。这套源码默认支持utf8mb4别选错了。然后在浏览器中访问你的站点域名正常情况下会自动跳转到安装向导页面。安装向导里需要填写的信息包括数据库主机127.0.0.1端口3306数据库用户名、密码、数据库名管理员初始账号和密码建议管理员账号不要用admin用一个不容易被猜到的用户名站点URL这里要填你绑定的完整域名带不带http前缀要根据源码要求来提交之后向导会自动导入install目录下的SQL文件创建数据库表结构并在配置文件中写入数据库连接信息。安装完成后系统会提示你删除或重命名install目录。这一步要严格执行否则系统的安装向导可以被任何人重新执行等于把你整个数据库暴露给了别人。安装完成后登录后台。第一件事是在系统设置里修改站点名称、平台名称配置邮件SMTP发信参数。SMTP如果不配置系统的找回密码、邮件通知功能会失效。我这里用的是网易邮箱的SMTP配置完成后记得发一封测试邮件确认邮件通道通到。3.3 后台基础配置域名池与用户权限后台基础配置里最核心的是上传主域名到域名池。在后台找到域名管理或域名池菜单添加你要分发的根域名比如example.com。添加时需要设置几个关键参数第一个是是否开放申请。如果不开放则只有管理员能创建二级域名适合内部使用场景。第二个是审核模式可以选择自动通过、手动审核、或者不需要审核。第三个是单用户最大申请数量比如限制每个用户最多申请5个二级域名防止被恶意刷量。第四个是解析记录默认TTL我建议设置600秒。这里我补充一个经验在正式开放用户申请之前建议先让系统调用一次API测试接口连通性。具体做法是管理员手动创建一个测试二级域名如果创建成功且能在DNS服务商后台看到对应记录说明API对接没问题再放量。4. DNS解析对接让自动分发真正跑起来4.1 方案一对接阿里云DNS API这套源码默认支持阿里云DNS和腾讯云DNSPod我这次用的阿里云。要对接阿里云必须先创建一个RAM子用户不建议直接用主账号的AccessKey安全性太差了。登录阿里云RAM控制台创建子用户时勾选OpenAPI调用访问拿到AccessKey ID和AccessKey Secret。然后为这个子用户添加权限策略推荐使用系统给的最小权限策略AliyunDNSFullAccess只授权DNS相关的接口权限不要给太多别的权限。把密钥填到系统后台的DNS服务商配置页面。配置保存后系统会自动调用阿里云的域名查询接口校验你填的密钥是否有效。校验通过后系统会拉取你账号下的域名列表你在域名池中添加主域名时可以直接从列表中选取也可以手动输入域名名称然后系统自动验证归属权。阿里云API添加解析记录的核心请求逻辑正常情况下源码里已经封装好了我也贴一下我测试时用到的核心调用示意use AlibabaCloud\Client\AlibabaCloud; AlibabaCloud::accessKeyClient($accessKeyId, $accessSecret) -regionId(cn-hangzhou) -asDefaultClient(); try { $result AlibabaCloud::rpc() -product(Alidns) -version(2015-01-09) -action(AddDomainRecord) -method(POST) -options([ query [ DomainName example.com, RR user1, Type A, Value 1.2.3.4, TTL 600, ], ]) -request(); } catch (Exception $e) { // 记录错误日志 // 用户申请时如果这里报错系统会标记记录状态为失败 }这一段的要点是RR就是二级域名前缀Type类型除了A记录源码也支持CNAME。但如果你的系统是给用户分发服务器IP的一般只用A记录。CNAME更多是用于域名指向比如指向某个CDN域名或者内网穿透服务商的域名。4.2 方案二自建PowerDNS数据库直连如果你不想依赖第三方DNS服务商的API或者你拥有自己的权威DNS服务器可以使用V3.1.2版本内置的PowerDNS对接模式。这个方案的原理是PowerDNS使用MySQL作为后端存储系统直接往PowerDNS的数据库里写解析记录PowerDNS会自动加载并生效。PowerDNS的安装相对麻烦一些需要安装pdns-server和pdns-backend-mysql两个包然后创建独立的PowerDNS数据库和专用用户用PowerDNS官方提供表结构SQL初始化数据库。具体SQL在官方文档里有这里不贴全量了只说关键建表语句CREATE TABLE domains ( id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, master VARCHAR(128) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(6) NOT NULL, notified_serial INT DEFAULT NULL, account VARCHAR(40) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB;在系统后台选择自建DNS模式填入PowerDNS数据库的连接信息系统就会直接读写其中的records表。这个方案的优势是解析记录实时生效不需要像调用第三方API那样还要等待接口响应但前提是你的域名必须使用这台PowerDNS服务器作为NS服务器也就是要去域名注册商处把主域名的NS记录改成你自建DNS服务器的地址。这里我要提醒一下自建DNS对服务器网络环境要求比较高需要公网IP且UDP/TCP的53端口需要开放且不被上游屏蔽。国内很多云服务器的53端口默认是封的即使你改了防火墙规则也可能无法对外提供服务所以这个方案更适合有海外服务器且网络条件允许的情况。4.3 泛解析的配置与优先级问题系统对接DNS后还有一个容易被忽略的问题泛解析。很多人在配置主域名的时候会顺手给*.example.com加一条泛解析指到自己的服务器这样所有未单独创建的二级域名都会统一访问到这台服务器。泛解析和系统自动创建的精确解析记录之间是存在优先级的DNS解析查询时精确匹配始终优先于泛匹配。也就是说即使你已经配置了*.example.com指向服务器A如果用户在迅风DNS Pro里申请了user1.example.com并绑定了服务器B的IP那么user1.example.com的解析结果仍然是B与其他域名的泛解析结果不冲突。这条规则在DNS协议层面是强制的不需要额外处理。但泛解析会带来一个实际问题用户随便输入一个未申请的前缀比如fsafsa.example.com也会被解析到泛解析的目标服务器上。如果这台服务器是内网穿透网关意味着任何前缀都会连接到你网关的默认处理程序。所以如果你启用了泛解析建议把泛解析的目标设为一个空页面或者默认拒绝网站而不是你的核心业务系统避免误解析后被滥用。5. 常见问题与排查技巧实录5.1 用户申请域名后解析一直不生效这个问题在我调试时遇到得最多大部分时候不是系统代码问题而是DNS服务商或者缓存层面的问题。排查思路从三个方向走。先检查API调用是否成功。在后台日志中查看用户的申请记录如果状态是创建成功说明解析记录已经写入了DNS服务商。接着去DNS服务商的控制台看看这条记录是否真的存在。如果服务商控制台能看到记录但解析不生效那就用dig命令排查分布式缓存的情况dig user1.example.com 8.8.8.8 dig user1.example.com 1.1.1.1如果公共DNS服务器返回的还是旧记录或者NODOMAIN再检查主域名的NS记录是否正确dig example.com NS 8.8.8.8这一条命令能确认你的主域名当前使用的权威DNS服务器到底是哪个。如果NS记录还没变过或者CDN层面有缓存解析链路就需要等待TTL过期。我之前调试的时候用阿里云控制台看到记录已经添加成功但dig还是查不到最后发现是本地ISP的DNS缓存导致的。这种情况只需要等TTL过期就自动恢复。5.2 API提交成功但系统显示失败这是一种比较隐蔽的情况。我在测试时遇到一次系统日志显示调用API异常但登录阿里云控制台发现记录居然创建成功了。原因有两个。第一个是API请求超时服务端实际上处理完成了但响应返回时网络抖动导致客户端超时。第二个是源码里API响应的解析逻辑对某些返回格式的处理不完善。遇到这种情况最稳妥的做法是去系统后台的解析记录列表里点击某个记录的同步状态或刷新按钮看是否有手动同步功能。V3.1.2版本里管理员在解析记录列表中可以选择单条记录或批量记录执行重新同步操作系统会调用API查询该记录的实际状态并更新数据库。如果用户那边显示申请失败但服务商那边实际已经有记录了手动同步一下状态就正常了。5.3 后台登录白屏或数据加载异常后台登录后白屏优先怀疑PHP版本和运行目录配置。我见过很多次这种情况是站点运行目录没指到public导致ThinkPHP框架的路由直接崩了。先去站点设置确认运行目录再去伪静态配置确认规则是否正确。如果这两项都没问题打开PHP错误日志看看有没有具体的报错信息。日志位置一般在/www/wwwroot/你的站点目录/runtime/log/下面。如果是PHP 8.0编译兼容性错误直接切回PHP 7.4。如果是某个函数不存在或扩展缺失去宝塔PHP设置里把对应的扩展装上。我自己遇到过一次redis扩展没装导致后台登录验证码无法正常显示装了扩展之后立即恢复正常。5.4 定时任务不执行域名到期不停用这个问题要在部署完成后就要提前做好不要等到域名到期不自动停用了才想起来。V3.1.2版本依赖于一个每分钟执行一次的计划任务来做到期检查和状态同步。在宝塔面板的计划任务中添加一个Shell脚本#!/bin/bash cd /www/wwwroot/dns.example.com php think cron /dev/null 21执行周期设为每分钟一次。添加时注意php命令要对应你站点使用的PHP版本路径。宝塔环境里不同PHP版本的路径不同例如/usr/bin/php # 系统默认版本 /www/server/php/74/bin/php # PHP 7.4如果直接写php调用的可能是系统默认PHP版本可能和你站点用的版本不一致。建议在计划任务里写全路径避免因版本不一致导致代码执行报错。配置完以后手动执行一次脚本确认没有报错。如果一切正常去后台查看定时任务日志确认任务在按时执行。一个细节计划的执行时间要和服务器时区一致。如果你的服务器时区不是Asia/Shanghai任务的触发时间可能和预期差了几个小时需要先修正系统时区。写在最后的一点经验整个搭建过程走下来最大的感受是这套V3.1.2源码在功能设计上确实比较完整开箱即用的程度很高安装向导、后台配置、DNS API对接这些关键路径都做得很顺基本上按照教程一步步走新手上手不会太吃力。我自己在实际运维中的心得是先小范围测试再全面开放。如果你准备把系统作为公共服务提供给外部用户建议先邀请几个信任的朋友当种子用户让他们实际申请几个域名把整个流程跑几遍确认申请、解析、续期、停用这条链路的每一个环节都符合预期再正式对外放开。这样能尽量避免上线后用户积累到一定量级才发现某个边界情况没有处理好最后自己一边被用户的反馈轰炸一边紧赶慢赶补漏洞的狼狈局面。另外后续如果想扩展可以研究一下这套源码的接口设计。V3.1.2版本对外预留了API接口能力可以对接你自己的发卡系统或者用户中心。我曾经尝试把域名申请接口接到一个简单的用户充值系统里实现用户充值后自动开通子域名名额效果还不错。这套系统的可塑性比想象中要大关键看你怎么用好它的域名池和记录管理模块。本文还有配套的精品资源点击获取
返回列表