xixixi.lol
ops

把 nginx 从 1.18 升到 1.24 踩的两个坑

一台跑了三年的机器要从 Ubuntu 20.04 升到 24.04,nginx 顺带从 1.18 跳到 1.24。 配置是当年照着一篇教程抄的,一直没动过。升级之后 nginx -t 直接过不了, 后来又踩了一个,记一下。

坑一:ssl_protocols 里写了 TLSv1

老配置长这样:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

在 Ubuntu 24.04 上这条过不了。原因是系统换到了 OpenSSL 3.0,默认安全级别是 2, TLS 1.0 和 1.1 在这个级别下被认为不安全,直接禁用。 nginx 启动的时候会说没有可用协议:

nginx: [emerg] no "ssl_ciphers" available for SSL_CTX

或者更隐蔽一点,nginx -t 能过,但客户端连上来握手失败。 反正只要配置里还留着 TLSv1,就得改。现在没什么理由再开:

ssl_protocols TLSv1.2 TLSv1.3;

顺带把 ssl_ciphers 也删了,让 OpenSSL 用默认的。 除非有很特殊的兼容需求,手写 cipher 列表基本是在帮倒忙。

坑二:listen ... http2 的写法

老写法是把 http2 挂在 listen 后面:

listen 443 ssl http2;
listen [::]:443 ssl http2;

这个写法在 1.24 上还能用,但是 1.25.1 起就被标记为废弃了,往后会删掉。 新写法是把 http2 提出来单独一行,放在 server 块里:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    ...
}

反正要改一次配置,索性改成新的,省得下次升级再来一遍。 我是两个都改了,nginx -t 一行 warning 都没有才收工。

顺手做的几件事

  • server_tokens off; —— 别在响应头里报版本号。
  • 删掉默认站点 sites-enabled/default。它带着 default_server,很容易和后来的配置打架。
  • ssl_session_cache shared:SSL:10m; —— 1.18 那会儿是每个 worker 一个会话缓存,现在共享。

另外新签的证书里已经看不到 OCSP 响应地址了,ssl_stapling on 那几行留着也不会报错, 就是没实际作用。我注释掉了,看着清爽点。

小结

跨大版本升级最容易出问题的永远不是新增功能,是那些"当年能用、现在不能"的老配置。 升级前先把 nginx -T 的输出存一份,出事了好对照。

← 返回笔记