把 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 的输出存一份,出事了好对照。