解决 Nginx 更新后模块未同步更新的问题

解决 Nginx 更新后模块未同步更新的问题

问题描述

在操作系统更新后,Nginx 版本升级了,但某些模块并未随之更新,导致 Nginx 无法正常加载模块。例如,在执行 sudo nginx -s reload 时,可能会遇到如下错误:

1
module "/usr/lib/nginx/modules/ngx_http_dav_ext_module.so" version 1025005 instead of 1027000

这表明当前 Nginx 版本与模块版本不匹配。

解决方案

1. 重新安装受影响的模块

使用 yay 重新安装相关的 Nginx 模块,例如:

1
yay -S nginx-mainline-mod-dav-ext

2. 手动调整 PKGBUILD

由于 yay 安装的模块可能仍然使用旧版本,我们需要手动修改 PKGBUILD 文件以确保模块重新编译。

具体步骤:

  1. 进入 yay 缓存目录:
    1
    cd ~/.cache/yay/nginx-mainline-mod-dav-ext/
  2. 编辑 PKGBUILD 文件,将 pkgrel 值加 1(确保 makepkg 认为它是一个新版本,从而强制重新编译)。
    1
    2
    3
    4
    5
    6
    file=~/.cache/yay/nginx-mainline-mod-dav-ext/PKGBUILD
    pkgrel=$(grep 'pkgrel' $file | awk -F '=' '{print $2}')
    echo "修改前: pkgrel=$pkgrel"
    pkgrel=$(($pkgrel+1))
    echo "修改后: pkgrel=$pkgrel"
    sed -i "s/pkgrel=\([0-9]\+\)/pkgrel=$pkgrel/" $file
  3. 重新编译并安装模块:
    1
    makepkg -si

3. 重新加载 Nginx 服务

完成模块安装后,重新启动 Nginx 使其生效:

1
systemctl restart nginx.service

总结

  1. 确认错误信息:检查 journalctl -u nginx.service -f 确认具体报错。
  2. 重新安装模块:使用 yay 重新安装受影响的模块。
  3. **手动调整 PKGBUILD**:修改 pkgrel 以强制重新编译。
  4. 重启 Nginx:确保更改生效。

按照以上步骤操作后,Nginx 应该能正常加载模块,避免版本不匹配的问题。

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file=~/.cache/yay/nginx-mainline-mod-dav-ext/PKGBUILD
pkgrel=`grep 'pkgrel' $file| awk -F '=' '{print $2}'`
echo "Before: 'pkgrel=$pkgrel'"
pkgrel=$(( $pkgrel + 1 ))
echo "After: 'pkgrel=$pkgrel'"
sed -i "s/pkgrel=\([0-9]\+\)/pkgrel=$(($pkgrel))/" $file
echo "Check File content: use grep'"
grep 'pkgrel' $file
echo "sleep 2s"
sleep 2s
cd ~/.cache/yay/nginx-mainline-mod-dav-ext/
makepkg -si

echo "Need reload nginx service."
systemctl restart nginx.service

rm nginx-mainline-mod-dav-ext*tar.zst