Lan Tian @ Blog

使用 PowerDNS 的 Lua 功能自建分地区解析 GeoDNS

之前,如果要为自己的网站自建权威 DNS 系统,那么(几乎)唯一的选择是 PowerDNS 加上它的 GeoIP 后端。但是 GeoIP 后端使用的是 YAML 格式的配置文件,不能与 MySQL 等数据库一同使用。这意味着必须手动配置一套跨服务器同步文件的系统,而不能使用更为成熟的数据库同步技术。 不过,PowerDNS 在最新的 4.2 版本中加入了 Lua 记录的支持。Lua 是一种专门用于“嵌入其它程序执行功能”的编程语言,你或许曾经在 nginx 上看到过它(作为一个插件)。Lua 记录支持使得 PowerDNS 可以根据用户查询请求的不同来返回不同的回答,分地区解析 GeoDNS 功能也就可以实现了。 更新 PowerDNS 最新的 PowerDNS 4.2 版本没有加入 Debian 10 的软件仓库中,你需要从 Debian Unstable 的软件仓库下载。...

学校网络中自建 VLAN,低价实现高速私有内网

和全国大多数高校一样,我所在的大学以“一人一账号”的方式提供网络。通过有线网络或者 Wi-Fi 联网时,所有请求会被暂时重定向到一个登录界面(即 Captive Portal),输入用户名密码后才可以访问互联网。这个做法也是大多数公共场所(例如机场,咖啡厅)的标配,对于电脑、手机等设备也还算友好。但是一些不带显示屏的设备(例如树莓派,ESP8266 等)就难以访问网络了。 对于树莓派、ESP8266 等可以运行自定义代码的系统,可以模拟提交表单来登录网络,但是一旦模拟提交表单的程序出现问题,你就得手动将设备取下来,连上自己的电脑上传新的登录程序,这一过程非常的麻烦。至于其余只能运行预定程序的智能设备就完全无法联网了。由于我并没有智能台灯等设备,本文暂时只考虑可以运行 Windows、macOS、Linux 三大操作系统之一的智能设备,...

与 Hexo 配合使用 Sass 和 Webpack

为何使用 Sass 和 Webpack Sass 是 CSS 的超集,在 CSS 的基础上扩展了大量的语法,支持规则嵌套、变量定义、include 等功能,也可以进行数学运算。主要功能可以在官方入门教程中查看。Sass 原先的文件格式扩展名是 sass,其结构类似 yaml,似乎不与传统 CSS 兼容;而目前 Sass 的文件格式是 scss,兼容 CSS 文件。 我使用 Sass 的目的,一是更加清晰的 CSS 规则管理。例如,我有一些 CSS 规则希望只对网站顶栏生效,我就可以将它们全部放到一个代码块中方便管理: 123header { h1 { ... }} 二是减少网页加载时的 CSS 代码量。虽然我的网站使用了 Bootstrap,但是我只使用了一小部分功能,即 Bootstrap 的栅格系统,导航栏和下拉菜单,...

开始使用 Hexo 静态网站生成器

什么是静态网站生成器 我们常用的 WordPress、Typecho 等 CMS(内容管理系统)都是动态网站。当用户访问网页时,服务端运行使用 PHP、Python、Node.js 等语言的程序,根据用户的请求实时产生网页,将其返回给用户。 而 Jekyll、Hexo、Hugo 等静态网站生成器采取的是另一种方法:提前预测用户的请求,一次性产生对应的 HTML 文件。 这两种方式的主要优缺点如下: 谁更占优 动态网站 静态网站 动 可以实现复杂的交互,根据用户的输入随时改变内容 只能响应预定的输入,灵活性差 动 大多数 CMS 都会提供易用的管理后台,方便用户随时更新内容 没有在线后台,需要在本地安装额外软件更新网站内容 静 安装脚本运行环境需要较复杂的配置 服务端无需脚本运行环境,...

(自建 NTP)在 Tinker Board 上使用 PPS

在前一篇文章中,我使用 Tinker Board 和 ATGM336H GPS/北斗模块自建了 NTP 服务器,以 GPS 作为时间基准。GPS 模块除了提供传统的串口输出 NMEA 语句之外,还额外提供了一个 PPS 信号,这个信号会每秒变化一次。原本 gpsd 需要不断解析 GPS 模块传来的 NMEA 语句,需要耗费不短的时间,并且容易被其它程序抢占运行时间,产生 delay(延迟)和 jitter(波动)。而 PPS 信号可以直接触发 CPU 的中断,运行一个简单的处理程序,让操作系统以高优先级处理,不会被其它程序影响。 一般而言,在 Linux 中,PPS 由内核直接提供驱动支持。但是在前文中,由于 Tinker Board 的 Armbian Linux 内核没有提供 PPS 支持,所以我们没法直接开启。 解决方法 1:重新编译内核 如果内核没有对应支持,那就重新编译内核,...

自建基于 GPS 的 NTP 服务端

NTP 是什么 NTP(Network Time Protocol)是目前使用最广泛的互联网时间同步协议。我们常用的 Windows、macOS、Linux 等都自带了 NTP 客户端,可以连接远程服务器获取当前的时间。例如,Windows 的 Internet 时间同步功能就是基于 NTP: (图片来自网络) Windows 默认会连接到 time.windows.com 这台由微软维护的 NTP 服务器同步时间。但是,默认的这台服务器在国内并不好用。这台服务器位于美国,到国内的延迟很大并且容易波动,因此 NTP 客户端也很难得出准确的时间。 那么中国大陆有没有 NTP 服务器呢?有,但是不多: cn.pool.ntp.org 由 www.pool.ntp.org 维护的 NTP 服务器池项目,所有服务器由志愿者提供,在各个地区通过 DNS 负载均衡到不同的服务器上。...

使用 GPP 预处理 Dockerfile,实现 #include、#if 等功能

由于我有多种架构的设备运行 Docker(包括 x86_64 的电脑和服务器,ARM32v7 的 Tinker Board 和 ARM64v8 的树莓派 3B),我的每个 Docker 镜像都要构建多种版本。最初我给每个架构单独写一份 Dockerfile,但是很明显这样难以统一管理,在软件更新修改 Dockerfile 时经常漏改文件。之后,我用的是 Docker 的构建参数功能,即 --build-arg 参数,根据参数来调用不同的基础镜像、下载不同文件。 但是这样还是有很大的局限性。首先,不同项目对不同架构的称呼是不一样的。例如,我们平时说的 x86 32 位架构,i386,就被 Go 以及众多使用 Go 的项目叫做 386。类似的,ARM32v7 也可以叫做 ARMHF,而 ARM64v8 有三种写法(ARM64v8,ARM64,AARCH64)。之前,...

在 DN42 中使用 Docker 建立 Anycast DNS 服务

什么是 Anycast? 互联网上常用的路由协议 BGP 是这样工作的:我在 DN42 拥有 IP 段 172.22.76.104/29,我通过 BIRD 等 BGP 软件,“宣告”这台服务器上可以访问到 172.22.76.104/29 这个 IP 段。与我有 Peering 的其它服务器记录下这一条消息:“通过某条路径,走 1 格可以访问到 172.22.76.104/29”,并且向与它们有 Peering 的服务器继续宣告:“这台服务器距离 172.22.76.104/29 只有 1 格距离”。以此类推,其余服务器也通过类似的流程,宣布自己与 172.22.76.104/29 有 2 格,3 格,4 格距离……所有服务器也都通过距离最短的路径,将数据发送到我的服务器。在这种情况中,只有一台服务器宣布自己是 172.22.76.104/29 的“源头”。这就是单播(Unicast)。...

Typecho 主题性能优化和缓存

为了实现 Lightbox、代码高亮等功能,我在我的博客主题中写了一些后处理代码,对 Typecho Markdown 输出后的 HTML 代码再进行一层处理。但是因为我的博客历史文章较多,我在不同时期也用了不同的编辑器(WordPress 编辑器,百度 UEditor 等等),为了尽可能保证历史文章也能正常显示,我的处理逻辑比较复杂。再加上我用的廉价 VPS 性能本就不怎么样,相应的网页加载时间也较长。 我在 nginx 配置中添加了这样一行,以在 HTTP 头中输出网页在服务器端处理的用时: 1add_header LT-Latency $request_time; 最初,这个值是 0.25 左右,代表着每个网页需要在服务器端处理 250ms 之久。于是,我在大概一年前(2018 年 3 月 11 日,《大幅优化了博客主题性能》)大改了一轮后处理逻辑,修改点大致如下: 原先,...

Go 语言实现的 Bird-lg(Bird Looking Glass)

什么是 BIRD?什么是 Bird-lg? BIRD 是 Linux 上常用的一款 BGP 路由软件。我主要在 DN42 网络内使用 Bird,与其它用户建立连接。 Bird-lg 是 GitHub 用户 sileht 开发的一款基于 Python 2 的程序。它提供了一个网页面板,可以显示各个服务器上的 BIRD 路由软件的状态,以及查询到指定 IP 的路由。 为什么我要用 Go 语言重写? Bird-lg 基于 Python 2 以及 Flask,因此占用内存较大(20-30 MB)。 Bird-lgproxy 内存占用量也差不多 20 MB,并且每台服务器上都要运行一个。本站所在的 512 MB 内存的 VPS 已经出现过多次由于内存耗尽外加 SWAP 所在硬盘读写缓慢,导致 Docker、nginx、MySQL、PHP 轮流崩的情况,只能重启解决。...