
简介迅风DNS Pro二级域名分发系统是一套以PHP编写的完整源码面向需要自建域名管理平台的站长、IDC服务商及开发者。系统聚合阿里、腾讯、Cloudflare等主流DNS服务商接口采用插件驱动实现解析记录批量增删改查、API调用内置用户权限、第三方登录、支付余额、卡密VIP、工单回复、文章公告、日志审计、实名认证与违规检测等模块并支持多主题切换、安装与数据库迁移。资源包共2000个文件以1256个PHP文件为后端核心辅以269个JavaScript与116个CSS前端文件另有JSON、SQL、环境配置等辅助文件整体压缩包仅11.09MB。目前已有117人学习/下载。通过这份源码读者可完整了解域名分发系统的业务闭环、插件扩展机制、数据库表设计以及后台界面交互逻辑并可直接部署用于生产环境方便二次开发或商用。1. 迅风DNS Pro这套源码把二级域名分发从手工台账变成自助服务如果你手头管着几十个域名每天的工作离不开“帮客户开个子域名”“在云解析平台上手动加一条A记录”这类重复操作那迅风DNS Pro二级域名分发V3.1.2系统源码就是一个值得花一下午研究的方向。它本质上是一套PHP写的DNS分发管理面板挂在Swift框架上以扩展应用形式运行把子域名开通、记录类型选择、套餐配额、到期停用这些动作从命令行和云平台控制台里捞出来做成一条可视化的自助链路。适合IDC服务商、建站公司、做站群或子域名出租的团队也适合想把自己域名体系管理权下放给内部同事的运维组。下面从架构判断讲到部署细节再落到分发链路的配置和常见翻车点照着做基本能跑通。2. 部署前先看架构Swift框架扩展应用到底怎么理解2.1 为什么是Swift框架而不是独立PHP程序拿到迅风DNS Pro V3.1.2源码压缩包第一件事不是急着上传解压而是先看清它的运行底座。这套系统不是独立PHP项目而是基于Swift框架的扩展应用。Swift是ThinkPHP同期的老牌PHP开发框架在国内开源圈有不少活跃衍生产品常见的Discuz应用中心里就有大量基于它二开的扩展。迅风DNS Pro以应用扩展的方式挂接在框架上意味着它复用框架自带的用户体系、权限控制、数据库连接、缓存机制不需要单独再写一套后台登录和RBAC权限模块。这个选型的直接好处是如果你已经有Swift框架环境部署就是拷目录、建数据库、填配置三步坏处是不能像ThinkPHP项目那样随便改入口文件路径目录结构和URL规则要顺着框架的路由来。我一般建议新手不要试图拆了框架单跑就按原样挂在框架下使用省掉大量兼容性排查时间。2.2 环境准备PHP版本、扩展组件、数据库三件事部署前先核对运行环境。迅风DNS Pro V3.1.2需要PHP 7.0以上版本推荐7.2或7.3兼容性最稳妥PHP 8.0以上也能跑但部分老扩展类库会报deprecated警告不影响主流程但日志会刷得很难看。数据库用MySQL 5.6以上MariaDB 10.x同样兼容。两个PHP扩展必须确认已启用pdo_mysql和curl。前者负责数据库操作后者用于和DNS服务商API通信时发起HTTP请求。提示登录服务器后先用php -m | grep -E pdo_mysql|curl查一下扩展是否已加载缺哪个补哪个别等到安装向导报错才回头查环境。2.3 源码目录结构哪些文件要动哪些不能动框架应用的标准目录布局一般是application、addons、public三个核心目录。迅风DNS Pro作为扩展应用主要代码放在addons目录下公共入口和静态资源在public目录里。你需要关注的文件只有三个数据库配置文件一般是data/conf/db.php或类似路径、应用配置config.php、以及安装锁文件install.lock。其余文件不建议手工编辑尤其是涉及路由和权限的类文件改错一个方法会让整个扩展白屏。这里有一个容易误操作的点V3.1.2版本在安装向导完成后会生成install.lock文件防止重复安装。如果中途数据库连接信息填错安装失败后想重来记得先把install.lock删除否则每次打开安装页面都会提示“已安装”让你误以为程序出问题。3. 部署全过程从压缩包到后台可登录的四个步骤3.1 上传解压与目录权限设置先在服务器上创建站点目录上传源码压缩包后解压。注意整个应用要放在站点根目录下且入口文件index.php必须在public目录内。很多用户踩坑是因为把public目录当成了二级目录导致URL访问时样式丢失、路由404。解压后立即给runtime目录和addons目录设置写权限这两个目录一个存缓存日志、一个可能要写入配置文件权限不足会在安装阶段直接报错。# 假设站点根目录是 /var/www/html cd /var/www/html unzip xunfeng_dns_pro_v3.1.2.zip -d . # 给运行期需要写入的目录设置权限 chmod -R 755 /var/www/html chmod -R 777 /var/www/html/runtime chmod -R 777 /var/www/html/addons # 确认PHP扩展 php -m | grep -E pdo_mysql|curl上面的chmod 755给了整个站点目录统一读权限runtime和addons单独放开写权限。生产环境更稳的做法是调整站点配置把PHP进程用户设置为目录属主再用775替代777但新手按777先跑通流程没有问题。grep命令里的两个扩展名同时匹配任缺一个就装不上。3.2 数据库初始化与配置文件写入打开浏览器访问域名进入安装向导填写数据库主机、库名、账号、密码前缀建议保持默认。迅风DNS Pro V3.1.2会执行一组建表SQL自动创建用户表、域名表、记录表、套餐表等核心数据表。安装向导本质是把预先写好的SQL文件逐条执行如果服务器MySQL开了严格模式部分SQL可能因为字段默认值不兼容而中断遇到这种情况可以临时关闭STRICT_TRANS_TABLES再装。// data/conf/db.php 配置文件核心参数 return [ DB_TYPE mysql, DB_HOST 127.0.0.1, DB_NAME dnspro, DB_USER dnspro_user, DB_PWD 此处填强密码, DB_PORT 3306, DB_PREFIX xfd_, DB_CHARSET utf8mb4, ];如果你提前手动建好了数据库一定要在配置里填utf8mb4字符集否则后续写入子域名记录时带特殊符号的TXT记录会出现乱码。DB_PREFIX默认xfd_不建议修改V3.1.2的SQL语句里已经写死前缀关联逻辑中途改前缀会导致安装时报表不存在错误。3.3 登录后台与初始管理员配置安装完成后访问后台入口用安装时设置的管理员账号登录。首次登录会有初始化引导要求填写主域名和默认DNS服务商API密钥。这里的主域名填写格式很关键不要带协议头和www直接写example.com。系统会用它作为后续二级域名分发的根域。默认DNS服务商目前支持常见的阿里云解析、腾讯云DNSPod以及标准NS接管模式选哪个取决于你的域名托管在哪儿。注意如果你没有API密钥可以先选“手工同步模式”V3.1.2允许在后台手工添加记录只是少了自动推送到云解析的环节。等密钥申请好再切换成API模式不需要重装系统。4. 核心链路配置二级域名分发与客户自助开通4.1 根域名泛解析整个分发逻辑的入口二级域名分发的底层原理其实不复杂客户申请一个子域名系统在DNS上生成一条对应记录。但要让客户能“自助开通”根域名必须先做好泛解析。泛解析的作用是让所有未单独解析的二级域名都指向你的服务器IP然后由服务器根据HTTP请求头里的Host字段决定响应内容。迅风DNS Pro V3.1.2在创建主域名时会引导你配置一条*.example.com的A记录指向你预留的服务器IP。这里有一个非常关键的网络拓扑判断如果这台服务器本身就是DNS权威服务器那么泛解析直接写进本机zone文件即可如果用的是云解析泛解析记录要添加在云控制台。两种方式的灰度时间不一样云解析生效通常几分钟到十几分钟本机zone可能需要reload后立刻生效。V3.1.2的分发模块不关心记录在哪配置只负责生成记录内容所以你可以灵活选择。4.2 分发套餐与用户组权限绑定进入后台的套餐管理创建“基础版”和“高级版”两个套餐。基础版限制子域名数量5个、只支持A记录和TXT记录高级版放开数量到50个额外支持CNAME和MX记录。每个套餐绑定一个用户组用户在申请子域名时系统会检查它所属用户组已使用的配额超过套餐上限就直接拒绝。这样设计比在每条子域名上单独做权限判断要方便后台只需维护套餐配额一个维度。参数项基础版高级版说明子域名数量上限550达到上限后申请按钮置灰支持记录类型A、TXTA、CNAME、MX、TXTCNAME仅允许指向白名单域名生效方式自动自动提交后立即写入解析库到期处理停用停用并通知到期前3天发送提醒套餐参数保存后立即生效不需要重启服务。需要强调的是CNAME的白名单机制放开CNAME意味着客户能把子域名指向任意第三方域名容易被滥用来做违规跳转。V3.1.2高级版默认开放CNAME但保留白名单过滤接口建议在后台把白名单域名加上限制。4.3 客户发起申请到记录生效的完整链路客户通过前台页面提交子域名申请选择记录类型并填写目标值比如申请blog.example.com、类型A、指向1.2.3.4。提交后系统走三条分支检查域名是否已被占用检查当前用户配额是否足够检查目标IP格式合法性。三条都通过记录写入数据库并在同步队列里标记为待推送后台计划任务每分钟拉取一次队列调用DNS服务商API完成解析记录添加。整个过程客户看到的反馈是“提交成功正在生效”实际同步用不到一分钟。// 同步队列消费逻辑简化示意 public function syncPendingRecords() { $pending Db::name(dns_records) -where(status, 0) -limit(100) -select(); foreach ($pending as $record) { $api DnsProvider::factory($record[provider]); $result $api-createRecord([ domain $record[root_domain], sub $record[sub_domain], type $record[record_type], value $record[record_value], ]); if ($result[code] 0) { Db::name(dns_records) -where(id, $record[id]) -update([status 1, sync_time time()]); } else { // 记录失败原因进入重试队列最多重试3次 Db::name(dns_records) -where(id, $record[id]) -setInc(retry_count); } } }这段代码的逻辑核心是状态机的流转status为0表示待同步同步成功变为1失败则重试计数加一。setInc是Swift框架里的自增方法相比先读出再加一的方式少了两次数据库交互。实际项目里我还见过有人把status定义成“0-待同步、1-同步成功、2-同步失败、3-手动停用”四种状态方便排查历史问题这个思路值得参考。4.4 API同步失败时的降级方案计划任务调用云解析API失败是常态网络抖动、密钥过期、域名被服务商锁定都会触发。V3.1.2的重试队列在连续3次失败后会发送站内信通知管理员。这里需要特别关注的是失败后的人工兜底管理员在后台先看失败原因如果是密钥过期就重新授权如果是域名状态异常就要去服务商后台处理。为了不让客户干等我一般会在部署时加一个调整项同步失败超过3次的记录自动标记为“异常”同时给客户展示“请稍后查看”而不是永久卡在“处理中”。5. 上线前后必查的5个坑二级域名分发最常见的翻车现场5.1 域名NS没接管分发记录全失效现象后台正常添加记录API返回成功但用dig查询子域名始终解析不到或者全球各地结果不一致。原因域名NS还在原来买域名的注册商那里没有转到云解析平台。迅风DNS Pro调用的是云解析API但域名的权威NS没有被接管新添加的记录就只在解析平台内部存在实际的DNS查询链路不会走到这套系统。解决在域名注册商处修改NS为云解析平台的NS地址等待48小时内全球生效。更换NS前先用whois 域名确认当前NS指向避免误判是程序问题。这属于DNS体系里最常见的“黑匣子”区域值得先把这条查清楚再排查其他问题。5.2 泛解析记录把API探测请求也吞了现象子域名能访问但后台的健康检测全部失败或者服务器上跑的监控脚本接到大量异常请求。原因泛解析会把所有未单独匹配的子域名请求都引流到同一台服务器包括监控系统随机生成探测域名、API回环测试域名、甚至恶意扫描工具生成的随机子域名。这些请求全部落在同一入口造成误判和负载虚高。解决在Nginx入口层对没有对应站点配置的Host统一返回444让请求在HTTP层直接断掉同时给泛解析记录单独设置一条TTL为600秒的ns记录避免被扫描工具抓到规律。后台侧把健康检测的探针域名换成随机生成的、不公开的子域名段。5.3 TTL设太短解析压力被放大了十倍现象客户反馈页面时好时坏DNS查询日志显示特定记录每分钟被请求上千次。原因为了追求“配置秒生效”很多人把TTL设为60秒所有递归DNS都会频繁回源请求流量一大就把源站DNS出口带宽耗尽正常的解析反而变慢。V3.1.2默认TTL是600秒不要轻易改低。解决把默认TTL改回600秒对需要秒级生效的变更场景单独建一批短TTL记录用完后再改回长期值。实际上对绝大多数二级分发场景10分钟TTL完全够用客户感知不到差异。5.4 多条记录并发写入时唯一索引冲突现象两个客户几乎同时申请同一个子域名系统给两个人都提示“申请成功”但实际只有一条记录生效后台还报了Duplicate entry错误。原因判断域名是否被占用用的是查询Redis缓存但写入数据库时没有用唯一索引做兜底。并发场景下两条请求都通过了缓存检查然后同时往数据库插记录。解决在dns_records表的domain字段上建唯一索引并把写入操作包在事务里。底层数据库兜住了并发冲突上层即使提示了两个成功最终也只有一条能真正落库管理员可以看到另一条因索引冲突被回滚的记录。这是我踩过的真实坑光靠应用层判断永远不够。5.5 Linux系统修改DNS后重启网络配置还原现象在Linux服务器上按系统提示修改了/etc/resolv.conf里的DNS地址网络重启后配置被还原子域名分发系统的本机解析全部走错DNS。原因systemd-resolved服务会接管resolv.conf的写入权限手工修改的文件在服务重启后会被覆盖。这个问题在Ubuntu 18.04及以上特别常见。解决不要直接改resolv.conf改用systemd-resolve的API配置systemd-resolve --set-dns1.1.1.1 --set-domainexample.com或者改/etc/systemd/resolved.conf里的DNS字段后重启systemd-resolved服务。这两个做法都能保证DNS设置在重启后保留度盘、开箱即用。6. 一个实用技巧用CLI命令验证域名分发是否真的生效跑完整个部署和配置流程后别急着交付先花十分钟做一轮解析验证。我的习惯是准备一台干净的机器用dig命令逐一检查三类记录根域名的NS记录、泛解析记录、具体的客户子域名记录。# 检查NS记录是否已指向目标解析平台 dig NS example.com short # 检查泛解析记录 dig A blog.notexist.example.com short # 检查具体子域名记录 dig A blog.example.com short # 检查CNAME链路是否完整 dig CNAME shop.example.com short四条命令的输出依次对照NS输出应该包含解析平台分配的NS地址泛解析记录在不存在的子域名上应该返回服务器IP具体子域名返回客户设定的目标值CNAME链路的输出末尾应该有一个点表示记录终止。如果泛解析有值但特定子域名优先级不对大概率是后台记录的排序逻辑没生效检查一下记录列表里的权重值。另外在交付给客户前做个批量导入测试。V3.1.2后台支持CSV格式导入子域名记录每行一条字段顺序是子域名、记录类型、记录值、TTL。我习惯先导5条测试数据确认状态为1后等2分钟再删掉用这5条记录把整个同步队列的热度跑起来确认没有报错再让客户上线。这套验证习惯帮我少接了很多半夜的故障电话也希望帮到你。本文还有配套的精品资源点击获取