善意提醒

如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。
显示标签为“Nginx”的博文。显示所有博文
显示标签为“Nginx”的博文。显示所有博文

2025-08-16

Debian 升级 trixie 踩坑记

图片来自网络

Debian 前不久刚刚发布了 Debian 13,也就是代号为 trixie 的版本。本周一上班后,从 Repo 的变更看到了这个消息,我就进行了升级。

之前已经把我的所有 Debian 环境统一到 bookworm 了,也是不久前的事情。当时 Stretch 和 Buster 已经停止维护了,Bulleyes 还是 oldstable 状态。我只有两个环境是 bookworm,于是一咬牙把所有的环境都升级到了 bookworm,也踩了一些坑,下面合在一起说。这次确实没想到来 trixie 得这么快,也这么巧,趁上次坑里的屎还是热乎的,也就再咬一回牙了,反正我的牙也不是自己的。

简化的正常升级流程

首先强调一点,升级不要跳版本,从低往高一级一级地升。每次升级解决这一次的问题,然后再往下走。我这次是从 bookworm 往 trixie 升,只需要升级一次。如果是 jessie,那么就要 stretch -> buster -> bulleyes -> bookworm -> trixie,以此类推。
历史版本代码参见官方说法,最好是看 英文版,更新最及时。

升级过程完整的指引,最好参见 Debian官方文档(有 中文版,但翻译得很不好,很多没翻。还是看英文版吧,Google 翻译或喂 AI 都行。拜托了,都 2025 年了)。但如果要简单说的话,要点只有以下这些:

  1. 先把当前版本升级到没法再升。
  2. apt update
    apt upgrade
    
  3. 去 /etc/apt/sources.list 里面,把版本代号改掉。去 /etc/apt/sources.list.d 下面,把文件里面的版本代号都改掉。
    这一步原则上可以用 shell 命令来做,但其实还有 non-free-firmware 之类的小点,依赖别人的脚本并不是好事情,所以我也就不贴了。我觉得还是讲个原则,手动操作吧。必要的时候去参考已有的新版 OS。
  4. 正式开始升级:
  5. apt update
    apt full-upgrade
    
  6. 对选项作出反应:
    1. 升级过程中要不要重启服务,可以选 yes。
    2. 要不要覆盖旧版配置文件,自己看吧。如果不记得以前改了哪些就建议选N了(特别是针对 sshd),建议还是自己「合并」看看。
  7. 如果升级顺利,重启。
  8. reboot
    
  9. 清掉不再需要的包。
  10. apt autoremove
    

坑一:升级过程中 ssh 连接中断了

是我自己的锅。正在升级的时候,来了同事问我问题,作了一番长篇演说以后,忘记了这事,去忙别的了。回头想起来时,发现 ssh 已经断了。

ssh 断之前应该是在 apt full-upgrade 的过程中,等我回答某个配置文件如何处置。赶紧再连上,apt full-upgrade 继续,发现被锁。
遵照提示:

dpkg --configure -a

得以继续。
随后提醒自己下次记得集中注意力。

坑二:sysctl

升级完后发现有些不对,检查了一下,发现 /etc/sysctl.conf 配置文件被 dpkg 给备份起来了,后缀是 dpkg-bak。

改名回来后 sysctl -p,以为解决问题。重启之后发现 BBR 还是没能启用。翻找资料,发现是 机制改了。现在得把这些配置写到 /etc/sysctl.d/ 下面去,自己建 conf 文件。

当然,这样也有好处。现在可以把不同的内容分别写在不同的配置文件里面,不用像以前那样全部放在 sysctl.conf 里面,找起来比较麻烦了。

另外,记得用 sysctl --system 而不是 sysctl -p 来进行参数的临时加载。机制不一样了。

坑三:haproxy 启动不起来

算是一个小坑,因为报错信息在日志中写明白了。
我的 haproxy 是早期版本安装的,需要在 haproxy.cfg 中把 ulimit-n 设为 524288。

global
        ulimit-n  524288

坑四:其它软件还没提供 trixie 源

我周一把 Debian 升级到 trixie 的时候,顺手把 Nginx / PHP / Redis 在 /etc/apt/sources.list.d 下面的 Repo 也给改了。然后就发现 PHP 已经有了 trixie 源,但 Nginx 还是 404,Redis 是 403。

截止本文首次刊发的时候,Nginx 已经 OK 了 ,Redis 还没好。后来直到过完十一长假,我发现redis 有更新,再去看,才发现也提供 trixie 源了。

还有一个问题是 simple-obfs 在 trixie 官方源中没有提供,而 bookworm 是提供的。git 然后源代码编译是一个解决方法。如果还是想从 apt 直接安装省些事情,请在 bookworm 的时期先完成 simple-obfs 的安装,或者临时改成 bookworm 的源。

坑五:GFW 捣什么乱

这个就坑我大发了,几乎可以专门写一篇。不过我还没完全弄明白,以后搞清楚了再说吧。

我家里的网络访问 Debian 官方源不算快(应该说很慢),我又不想改源,于是用了 SS 代理来「加速」。
apt update 的时候发现,Debian 源没问题,但 Nginx 和 PHP 一直连接超时。区别就在于,Debian 源是 http,后二者是 https。
用 curl -x -I 简单试了一下,https 还真是走不了 SS 代理。http 就可以。

如果答案是「GFW 检测并干扰了 TLS over SS」,那我没话说。我知道它有这能力,TLS 的确特征明显,尤其是握手时。这可能也是最合理的一种解释了。
但我 HTPC 上有一台 VM 使用自己的 ss-local 是 OK 的。如何解释?同样的 OS 版本,同样的 SS 版本,同样的网络环境、节点、线路、协议、密钥、插件,同样的 payload 和访问特征,连 TTL 和 MTU 我都看了,实在是想不明白。

有问题的 VM 只是说 TLS 握手出问题的概率很高,但并非 100%。我开了 Verbose 猫在两端看了一下,发现有问题的时候貌似有 replay attack。我拿不准,但看起来像。两端的节点都换过,没有什么差别,该 replay 还 replay。

在公司没问题,在家里有两台都有问题,可见应该跟家里接入的上海电信宽带有关。然而家里 HTPC 上从 Windows 去用那两台上的 ss-local / privoxy 作代理都没有问题,在我遇到问题的时候,儿子还在欢看 YouTube 呢,线路没被封。SS 是 AEAD 版本,cipher 不对时的反应是 No Data Transfer,GFW 肯定拿不准。

那台没问题的 VM 就是不会引发,100% 地 OK,让我始终想不通的终归还是这一点。在 SS 上面再叠一层 tor,也是 OK 的。最后不得已,我让 apt 走了 tor。没去试 SS over FRP 的方式。先这样吧,也没慢多少就是了。

2024-06-20

Nginx 更新遇到 GPG 签名变更

图片来自网络

这些天对自己的 Debian 系统进行 apt update 的时候,总是遇到报错:

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://nginx.org/packages/mainline/debian buster InRelease: The following signatures were invalid: EXPKEYSIG ABF5BD827BD9BF62 nginx signing key <signing-key@nginx.com>

W: Failed to fetch http://nginx.org/packages/mainline/debian/dists/buster/InRelease The following signatures were invalid: EXPKEYSIG ABF5BD827BD9BF62 nginx signing key <signing-key@nginx.com>
W: Some index files failed to download. They have been ignored, or old ones used instead.

我的 Nginx 是按照 官方指引 从来源安装的 mainline 版本,不是直接用的 Debian 的 apt 源内置的 Nginx。Debian 的 Nginx 我嫌它版本低了。

当时瞄了一眼,知道是说 GPG 的签名出了问题。这种问题可大可小,如果是之前的版本被人植入了恶意代码,就像之前的 XZ/liblzma后门事件,那么一整个源可能会被撤销。
但我也看到了「EXP」字样,所以似乎只是简单的 Key 过期而已。并且同期并没有大的信息安全新闻爆出,不像是安全事故。鉴于我当时的时间紧张,并没有当场去处理它,反正 Nginx 更新得并不是很频繁。

今天花了点时间来仔细看了一下,果然是 Nginx 的 PGP Key 在 6 月 14 日过期了。Nginx的官方Blog 登载了 这一则通知,同时也提供了更新的方法。
按照官方的指引,只需要执行下列命令即可:

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

如果你是像我一样在 root 下面操作,并且没有安装 sudo,那么去掉 sudo 就好:

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

更新完 Key 以后,可以用下列命令来验证新 Key 的过期时间:

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

据 Nginx 这篇 Blog 中称,今后将以大概每两年一次的频率对他们的 PGP Key 进行更新。果然这次得到的新 Key 的到期时间就是 2027-05-24。