距离微软正式发布.NET 8.0已经有一段时间,这也是新的LTS(长期技术支持)版本,这个版本更新了多个新的特性,并且提升了性能,似乎每一代框架发布总是能比上一代提升不少性能。近期抽空将本网站平台适配到了.NET 8.0,暂时没有发现什么Breaking Changes,一切很平滑,除了升级到.NET 8.0外,还对以下特性进行了修改: 1. 软件层面 1.1 验证码模块 验证码(CAPTCHA)又称全自动区分计算机和人类的图灵测试,之前本站验证码使用了两套:一套是Edi Wang开发的图形化验证码,主要用在评论发布页面;另一套是Google的reCAPTCHA,主要用在联系表单。但是这两套验证码都存在问题,其中Edi Wang的图形验证码使用了传统的数字字母图片,为了避免OCR还加了变形扭曲,在Web 2.0兴起的年代,这种方法足够抗击机器人和爬虫的不法攻击,随着人工打码平台和 …

博客一直使用谷歌分析(Google Analytics)作为流量统计分析平台,随着大家对隐私的重视,尤其是欧洲通用数据保护条例(GDPR)的颁布,谷歌分析的使用就有必要征求用户的同意,本博客自改版之后在隐私条款处已经说明使用了谷歌分析,并且在Cookie设置处也将允许谷歌分析的权限交给用户,经过一年多的运行发现存在相应的问题,最主要的是如果本博客访问的用户不设置Cookie,这也是大多数情况,一般博客右下角的Cookie提醒是可以忽略的,那么统计必然不准确,那么谷歌分析就失去了参考价值,好在由于全站套用了Cloudflare CDN,其中Cloudflare基础版(Free Plan)提供了一个简单的流量分析模块,让自己也大概能够窥探自己博客的流量情况。 为了能够更好的得到博客热门文章、访问者设备类型、设备分辨率这些信息以供以后改进博客内容和用户体验,同时兼顾用户隐私,决定尝试使用 …

早期电信家用宽带支持IPv6的时候,我就尝试通过PPPoE拨号获取原生(Native)IPv6,一直使用正常,唯一遗憾就是由于当时IPv6刚刚起步,所以大部分支持IPv6的网站延迟都比较高,相应的访问速度比较慢,经过这几年发展国内IPv6业务日趋成熟,延迟和速度都有了较大提高,新的计算机、移动设备等都能较好的支持IPv4和IPv6双栈(Dual-Stack)访问。 近两年开始出现部分网站访问卡顿、应用无法加载的情况,经过调查发现这些网站和应用使用了IPv6的访问方式,极大影响了浏览体验,于是我决定先暂停IPv6的解析(DNS仅返回A记录)以缓解卡顿的问题,不过后来搜索网络我终于找到了问题的根源,彻底解决了,在这里把解决的过程记录下来以备忘用,如果读者想快速解决问题的话建议直接跳转到第2节 配置路由器TCP MSS。 1 配置返回IPv4 Only DNS服务器 可能有人说配置返回IPv4 …

很长时间没有更新网站内容,不过还是抽出时间对网站架构进行了升级。 主要升级点 将网站平台由.NET 6.0迁移至.NET 7.0,这次迁移是平滑的,没有Break changes。 数据库也升级至PostgreSQL 15。 之前网站是基于Docker容器部署的,后来了解到Podman这个最佳替代,于是将Docker部署迁移至Podman部署。 编写了网站引导脚本(Boot Script),在启动网站程序前执行自动化测试检测外部环境设施(数据库、消息队列、邮件系统、传输代理等)是否正常,测试通过后拉起网站程序。 全站迁移至Cloudflare CDN。 需要特别提出的 使用Podman部署,其好处是去中心化,Podman不像Docker一样有个守护进程,守护进程崩溃了所有Docker容器也会崩溃,Podman是Rootless的相比较而言会更加安全(Docker也有Rootless部署方 …

备份是运维避不开的一个话题,架构再精巧的服务器环境或者关键业务数据总会遇到不可控的事件而在顷刻之间遭到摧毁。勒索病毒、黑客入侵、主机商跑路、员工删库等等,这些不可控因素仿佛是悬在运维头顶的达摩克利斯之剑,一旦发生就要靠最后时刻的备份救场了,正所谓后方有粮,心中不慌。 手动的脱机备份也是正常运维的一部分,一般情况下我在每次大的修改配置或者升级系统前会将数据脱机备份一份,以备在发生问题时可以迅速恢复。对于云主机可以设置快照(Snapshots),或者直接cp一份,但这种简单的手动备份不仅耗时耗力而且容易遗忘,大部分情况下我们可能就仅仅是本地备份,无法做到异地灾备,所以我们就不得不考虑软件远程备份作为兜底。 本文就介绍了我在实际运维中所采用的几种远程备份方式供读者参考,最后介绍的restic是我比较推荐的一种备份方式。 1 常见的备份途径 工作室里有一台24小时运行的网络存储器(NAS),数据存 …

由于平常开发主要是在Windows下进行,对于Linux的使用仅局限于服务器端虚拟机,所以初始分区这块一直使用的是默认配置,随着目前Windows Only开发收窄以及考虑今后跨平台开发,后期主力开发系统将逐渐迁移到Linux下,当然发行版肯定是基于Debian的,毕竟这个发行版较熟悉一些。如果主力开发系统迁移到Linux下那么分区又是一个绕不开的话题,所以我又将目前主流的LVM分区管理方式进行了学习,记录本文以备忘。 1 LVM 介绍 LVM 全称是逻辑卷管理(Logical Volume Manager),既然是逻辑卷就需要和传统的物理卷作出区分,传统物理卷一般在安装操作系统的时候进行分区划分,分区多少空间以后就是多少空间,空间不够怎么办?对不起,这个就麻烦了,就好比Windows下经常有人问C盘空间不够怎么办?能不能从其他分区划出一部分空间给C盘?以前我一般建议使用压缩卷或者一些第三 …

我的网站老访客可能会有印象,之前的联系表单是支持PGP/GPG加密正文的,后来使用ASP.NET重构后这一部分实现始终存在问题,判断可能是第三方库的BUG,一直没有再加上这个功能,最近该第三方库进行了升级,发现这个BUG已经修复了,于是在联系表单启用了PGP/GPG加密特性。 1 什么是PGP/GPG PGP/GPG虽然是两种写法,但实际上是一种东西,首先我们要介绍PGP(Pretty Good Privacy),这是一套消息加密、验证的技术,由一系列散列、数据压缩、对称密钥加密,以及公钥加密的算法组合而成,最早由菲利普·齐默曼(Philip R. Zimmermann)发明并应用于电子邮件安全隐私保障,可以这么说在没有PGP和TLS加密的时代电子邮件或多或少的在互联网上明文裸奔,而且被篡改的几率很大。PGP最初由Philip免费在互联网上发布,但其本人也因此违反了美国政府关于加密软件出口 …

29日下午正好有时间例行网站应用代码升级维护,正好发现nginx HTTP3模块进行了更新,一直关注HTTP3的发展,网站一开始使用的是Cloudflare开发的HTTP3扩展,等nginx官方有了HTTP3支持后也是第一时间升级了,由于本站架构运行在Docker之上,所以这次升级也就改一下nginx代码库commit id,然后重新编译Docker镜像,一直都是这么升级,结果今天翻车了。 由于编译一次Docker镜像需要耗费较长时间,所以我会习惯性把一些该升级的组件进行一次升级:例如更新频率比较高的BoringSSL。这次还发现了ngx_brotli这个很长时间没有更新的扩展也有了更新记录,顺带也升级到最新commit。 完成编译后便直接将这个最新版本的nginx镜像推送至registry,然后服务器同步拉取(pull)完成更新容器更新,由于没有测试直接更新容器,结果炸了。受问题镜像同步 …

看门狗(Watchdog)应该是计算机世界中较为形象的一个动物化的特性,就好像光猫和鼠标一样,在那个混沌初开的计算机时代,技术专家和极客们总会给冷冰冰的机器赋予身边活物的灵性。看门狗的功能简要的来说就是侦测到设备异常并恢复设备状态,这里的恢复一般是重启,就好像公司IT部门在接到设备报障电话总是会问一句:“您尝试重启设备了吗?”,确实,重启能解决绝大部分故障,重启后的设备也能工作在较好的状态,随着时间的推移,待故障再次发生的时候怎么办?再重启一下呗。如果无法确认故障的原因或者无法解决故障,那么重启确实很好,但是这仍然需要有人值守,手动重启。看门狗的出现就是为了解决这个痛点,看门狗每间隔一段时间(Interval)会检测设备状态,检测的方式就是一系列测试(Test),如果测试不通过则自动重启。 第一次接触到看门狗(Watchdog)功能还是在树莓派(Raspberry Pi),当时硬件清单说明 …

经过一段时间的实践,目前我的IT基础设施基本上完成了向Docker容器化的迁移,通过容器的隔离大大减轻了运维的负担,尤其对于我个人来说,可以专注于业务代码的实现,在容器化的具体实践中也遇到一些问题,本文介绍的就是其中容器内进程管理和僵尸进程(Zombie Process)的消除。 1 Linux init进程 使用过Linux系统的同学可能对init这个进程并不陌生,此进程也是内核启动的第一个进程,PID为1,此进程包含多个任务,其中重要的任务之一:接管孤儿进程和消除僵尸进程。 孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程,而僵尸进程是指子进程先于父进程结束,而父进程没有调用wait或者waitpid等待,这样结束的子进程将会变成僵尸进程,系统会自动将孤儿进程和僵尸进程过继给PID为1的init进程,这样init进程重新成为孤儿进程的父进程并给僵尸进程收尸(消除),避免大 …


Some archived posts that were written in Simplified Chinese before the year 2021 were moved to and it may never update.