ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Dokku DNS 配置指南:使用 A 记录与通配符域名将应用路由到你的 PaaS 服务器

Dokku DNS 配置指南:使用 A 记录与通配符域名将应用路由到你的 PaaS 服务器 Dokku DNS 配置指南使用 A 记录与通配符域名将应用路由到你的 PaaS 服务器【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku导读DNS域名系统是 Dokku 实现一服务器多应用路由的核心基础设施Dokku 依赖 DNS 把形如node-js-app.example.tld的域名解析到服务器 IP再结合内置的 nginx 等代理vhost机制将不同子域名的流量分发到对应应用。本篇指南以 Dokku 仓库中的 docs/networking/dns.md 为主体讲解子域名app.myserver.example.tld与根域app.example.tld两种接入方案并配合 BIND 格式的 zone 文件示例与host/dig/nslookup验证命令帮助你在完成 安装文档 之前先打好域名解析的地基。读完本文你将能独立完成 Dokku 服务器的域名接入配置并理解 vhost 域名在 Dokku 内部是如何被存储与生成路由 URL 的。DNS 在 Dokku 路由中的角色Dokku 是一个运行在单台服务器上的开源 PaaSPlatform as a Service应用通过git push推送后即可自动构建并运行。当一台 Dokku 服务器上同时运行多个应用时Dokku 使用**域名vhost**来区分它们如果你持有域名example.tld并部署了node-js-app1和node-js-app2两个应用Dokku 会分别让它们通过node-js-app1.example.tld和node-js-app2.example.tld对外提供服务。因此DNS 配置的正确与否直接决定了应用能否被外部访问。安装文档对此有明确说明官方建议为服务器至少绑定一个域名。这不是必须的但使用域名会让应用访问更加容易见 docs/getting-started/installation/index.md。绑定的方式有两种通配符域名*.domain.tld的 A 记录应用可通过$APP.domain.tld访问即每个应用自动获得形如应用名.域名的子域名。单一域名domain.tld的 A 或 CNAME 记录应用将通过domain.tld:$RANDOM_PORT域名加随机端口的形式访问。DNS 服务器的多样性为何以 BIND 格式为示例DNS 生态中存在大量实现野生环境里常见的 DNS 服务器包括 BIND、dnsmasq 和 PowerDNSpdns等Windows 自带的 DNS 服务器之外还有 Unbound、Posadis 等选择此外还有数以万计的托管 DNS 服务商Managed DNS Providers各自提供不同的配置界面。维基百科上维护着 DNS 服务器软件对比和托管 DNS 提供商清单可以按需查阅。正因为可选项如此之多本文档聚焦于 DNS 本身的通用概念并统一采用BIND 格式编写示例以便读者将这些概念适配到自己使用的 DNS 服务器软件或托管 DNS 服务商。前置假设在开始之前本文档假定你已经具备以下条件对 DNS 有基本的了解——知道 DNS 的作用是把名称如example.tld转换为地址如127.0.0.1即可。若完全陌生建议先阅读一篇面向开发者的 DNS 入门文章。已注册一个域名并将其指向你偏好的托管 DNS 服务商或运行着自建的 BIND DNS 服务器。已拥有一台互联网上的服务器正打算按照 README 中的指引安装 Dokku——但先不要执行安装因为 DNS 应该先配置好。谨记DNS 依赖缓存DNS 高度依赖缓存。你对 DNS 所做的修改可能需要几秒到几天的时间才能在全球传播生效。如果曾经访问过example.tld之后又修改了它的 IP 记录你的电脑可能在一段时间内仍使用旧的解析结果。因此在配置过程中验证结果看起来不对时先考虑缓存因素。开始前的准备获取服务器 IP为便于说明全文示例统一使用域名example.tld和 IP 地址127.0.0.1实际使用时请替换为你的真实域名与服务器公网 IP。首先登录你的服务器运行ifconfig或ip addr命令查看服务器的 IP 地址ip addr # 或 ifconfig记下这个 IP接下来所有 DNS 记录都要指向它。做出决策子域名还是根域名拿到 IP 之后你需要对域名策略做一个决定希望example.tld下所有名称都指向 Dokku 服务器还是只用一个子域来承载 Dokku换句话说你的应用最终通过node-js-app.example.tld访问还是通过node-js-app.myserver.example.tld访问子域名方案的优点是干净隔离不会影响example.tld根域上可能存在的其他服务根域名方案则能让应用拥有最短、最直观的访问地址。方案一使用子域名node-js-app.myserver.example.tld子域名方案最简单配置步骤分为三步。1. 创建子域名的 A 记录在配置服务器时你多半已经给它起了一个名字例如myserver.example.tld。进入你的托管 DNS 服务商控制台创建一个名为myserver的A 记录值填入刚才从服务器上查到的 IP 地址。2. 创建通配符 A 记录仅有一个 A 记录还不够Dokku 会为每个应用生成独立的子域名node-js-app.myserver.example.tld、python-app.myserver.example.tld等。为所有应用自动生效你还需要一条通配符记录创建一个名为*.myserver的 A 记录值同样填入服务器 IP。通配符记录会匹配myserver.example.tld下的任意三级子域名。如果你的托管 DNS 服务商不支持通配符记录则需要为每个应用手动添加一条 A 记录应用名对应主机名这会增加后续部署新应用的维护成本。3. BIND zone 文件示例如果你使用 BIND对应的 zone 文件大致如下$ORIGIN example.tld $TTL 5m myserver IN A 127.0.0.1 *.myserver IN A 127.0.0.1其中$ORIGIN example.tld声明该 zone 的根域名$TTL 5m将记录的默认 TTL生存时间设为 5 分钟控制解析结果被缓存的时间长度两条 A 记录分别将myserver.example.tld及其下的任意子域指向127.0.0.1示例 IP请替换为真实地址。4. 验证 DNS 解析在 Linux 上可以通过以下任一命令验证配置是否生效host myserver.example.tld dig -t A myserver.example.tld nslookup myserver.example.tld再次提醒返回的结果可能是被缓存的若与预期不符请耐心等待或使用不同的公共 DNS 递归服务器复查。如果一切正常你还应该能查询myserver.example.tld下的任意其他名称并得到同样的服务器 IPhost test.myserver.example.tld host xyzzy.myserver.example.tld5. 验证 SSH 访问DNS 生效后你应该能够直接通过主机名访问服务器ssh rootmyserver.example.tld如果 SSH 连接成功说明 DNS 已为 Dokku 正确配置。之后即可继续执行 安装文档 中的安装步骤。方案二使用根域名node-js-app.example.tld根域名方案与子域名方案几乎相同区别在于主机名位于example.tld之下仍然需要一条A 记录如example.tld本身或按需添加通配符*应用访问地址不再是app.myserver.example.tld而是app.example.tld。原文档指出这一节仍在完善中。结合仓库中的 docs/configuration/domains.md根域名方案的关键在于后续的全局域名配置安装完成后通过domains:set-global将根域名设置为所有应用的默认 TLD。Dokku 会按scheme://subdomain.domain.tld的结构为应用生成主机名其中subdomain来自推送的应用名domain.tld则来自全局配置。安装后配置全局域名安装并配置好 SSH 密钥后用dokku domains:set-global设置你的全局域名# 使用你拥有的任意域名该域名应有一条 A 记录或 CNAME 指向服务器 IP dokku domains:set-global dokku.me # 也可以直接使用服务器 IP dokku domains:set-global 10.0.0.2 # 还可以借助 sslip.io 获得子域名支持将 .sslip.io 追加到 IP 后面 dokku domains:set-global 10.0.0.2.sslip.io这来自 docs/getting-started/installation/index.mdsslip.io这类通配 DNS 服务可以把10.0.0.2.sslip.io解析为10.0.0.2从而在没有自有域名时也获得子域名能力与真实域名效果一致。设置全局域名后部署应用即可自动获得app.你的域名的访问地址。域名管理的完整命令如domains:add、domains:remove、domains:report等可参阅 docs/configuration/domains.md。源码级原理Dokku 如何利用 DNS 区分应用理解了操作步骤之后从源码层面看看 Dokku 是如何把域名体系落地的能帮助你更好地排查问题。vhost 的存储位置Dokku 的 domains 插件把域名vhost以纯文本文件形式存储全局 vhost$DOKKU_ROOT/VHOST默认即/home/dokku/VHOST由domains:set-global写入见 plugins/domains/functions 中的domains_set_global应用级 vhost$DOKKU_ROOT/$APP/VHOST如/home/dokku/node-js-app/VHOST由domains:add等命令维护见 plugins/domains/functions 中的get_app_domains。应用主机名的生成逻辑当应用没有配置自己的 vhost 时Dokku 会基于全局 vhost 推导主机名核心逻辑在get_default_vhostsplugins/domains/functions若全局 vhost 是 IP 地址IPv4/IPv6则直接跳过、不生成域名否则把应用名与 vhost 拼接应用名不含点号时得到应用名.全局域名如node-js-app.example.tld应用名本身就是 FQDN含点号如dokku.org时直接以应用名作为主机名忽略全局 vhost——这与 docs/configuration/domains.md 的描述一致拼接前还会调用nginx-hostname插件触发器允许插件覆盖默认主机名算法。也就是说只要你的通配符 DNS 能把*.example.tld解析到服务器 IPDokku 就能把每个应用自动映射到对应子域名这正是方案一中通配符 A 记录起作用的原理。路由 URL 的生成部署完成后domains-urls等命令会生成应用的访问 URL逻辑见 plugins/domains/internal-functions 的fn-domains-generate-url监听端口为 80 时输出http://域名443 且存在证书时输出https://域名其他情况输出scheme://域名:端口。vhost 开关NO_VHOST每个应用都可以通过NO_VHOST环境变量控制是否启用 vhostis_app_vhost_enabled读取该变量值为1时 vhost 功能关闭见 plugins/domains/functions。对应地dokku domains:disable app与dokku domains:enable app会设置/清除该变量。关闭 vhost 后nginx 不再为应用生成虚拟主机但应用仍会绑定在某个随机高位端口上供内部访问——这类内部服务不需要 DNS 记录。代理层对未知域名的兜底即便 DNS 配置无误也可能有流量访问到未匹配任何应用的域名。对于默认的 nginx 代理Dokku 在安装时会配置一个 catch-all 默认站点/etc/nginx/conf.d/00-default-vhost.conf对没有匹配任何应用的 HTTP 请求返回444直接关闭连接HTTPS 则使用ssl_reject_handshake拒绝握手。详细行为参见 docs/networking/proxies/nginx.md。常见问题与排查提示解析迟迟不生效优先怀疑 DNS 缓存。检查dig结果中的 TTL并用dig 8.8.8.8 你的域名之类的命令绕过本地缓存直接查询权威服务器。通配符记录被拒绝部分托管 DNS 服务商对通配符有特殊限制可改用为每个应用逐一添加 A 记录的方式或联系服务商确认支持情况。访问返回 444 / 连接被重置说明请求到达了 nginx 但未匹配到任何应用 vhost检查dokku domains:report app确认应用的 vhost 是否已正确生成且 DNS 记录指向的确实是 Dokku 服务器 IP。应用显示为域名:随机端口说明你的域名策略是单一域名非通配符。若希望按子域名访问需要配置通配符 A 记录并通过dokku domains:set-global设置全局域名详见 docs/configuration/domains.md。小结DNS 是 Dokku 多应用路由体系的地基一条指向服务器 IP 的 A 记录让 Dokku 主机本身可达一条通配符 A 记录则让每个新部署的应用自动获得独立子域名。本文以 BIND 格式给出了可直接套用的 zone 文件示例并提供了host、dig、nslookup等验证手段同时从 plugins/domains/functions 的源码出发解释了 vhost 的存储位置、主机名生成逻辑与 URL 拼接规则。在完成 安装文档 后记得用dokku domains:set-global写入全局域名你的 Dokku 服务器即可按子域名对外提供应用服务了。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表