CentOS7升级Nginx至1.22.0后模块升级失败如何解决
问题背景
将Nginx从1.16版本升级至1.22.0版本后,升级关联Nginx模块的全部操作执行失败,当前运行环境为CentOS 7。
待升级的Nginx模块列表如下:
nginx-mod-http-image-filter.x86_64 1:1.16.1-1.el7 @epel nginx-mod-http-perl.x86_64 1:1.16.1-1.el7 @epel nginx-mod-http-xslt-filter.x86_64 1:1.16.1-1.el7 @epel nginx-mod-stream.x86_64 1:1.16.1-1.el7 @epel nginx-mod-mail.x86_64 1:1.16.1-1.el7 @epel
查询nginx-mod-stream源信息返回如下:
# yum info nginx-mod-stream Installed Packages Name : nginx-mod-stream Arch : x86_64 Epoch : 1 Version : 1.16.1 Release : 1.el7 Size : 171 k Repo : installed From repo : epel Summary : Nginx stream modules URL : http://nginx.org/ License : BSD Description : Nginx stream modules. Available Packages Name : nginx-mod-stream Arch : x86_64 Epoch : 1 Version : 1.20.1 Release : 9.el7 Size : 89 k Repo : epel/x86_64 Summary : Nginx stream modules URL : https://nginx.org License : BSD Description : Nginx stream modules.
执行模块升级命令yum update nginx-mod-stream时报错,核心错误信息如下:
Package nginx-mod-stream.x86_64 1:1.20.1-9.el7 will be an update --> Processing Dependency: nginx(abi) = 1.20.1 for package: 1:nginx-mod-stream-1.20.1-9.el7.x86_64 --> Finished Dependency Resolution Error: Package: 1:nginx-mod-stream-1.20.1-9.el7.x86_64 (epel) Requires: nginx(abi) = 1.20.1 Available: 1:nginx-1.20.1-9.el7.x86_64 (epel) nginx(abi) = 1.20.1 Installed: 1:nginx-1.22.0-1.el7.ngx.x86_64 (@nginx-stable) Not found Available: 1:nginx-1.8.0-1.el7.ngx.x86_64 (nginx-stable) Not found Available: 1:nginx-1.8.1-1.el7.ngx.x86_64 (nginx-stable) Not found Available: 1:nginx-1.9.0-1.el7.ngx.x86_64 (nginx-mainline) ... ...
报错提示EPEL源提供的最高版本模块为1.20.1,依赖nginx(abi) = 1.20.1,和当前已安装的nginx-stable源1.22.0版本Nginx的ABI版本不匹配,导致依赖解析失败。
故障原因
出现这个问题的核心是Nginx主程序和模块的软件源不一致:当前安装的1.22.0版本Nginx来自官方nginx-stable源,而旧模块来自EPEL源,两个源打包的Nginx ABI(应用二进制接口)版本不互通,EPEL源的模块最高只适配到EPEL提供的1.20.1版本Nginx,无法匹配官方源的1.22.0版本Nginx,最终导致依赖校验失败。
解决步骤
方案一:替换为官方源对应模块(推荐,和现有Nginx版本完全匹配)
- 先卸载当前从EPEL安装的旧版本模块,卸载时不要连带删除Nginx主程序:
yum remove -y nginx-mod-http-image-filter nginx-mod-http-perl nginx-mod-http-xslt-filter nginx-mod-stream nginx-mod-mail --noautoremove - 安装官方源提供的对应1.22.0版本模块,官方源的动态模块包统一以
nginx-module-为前缀(和EPEL的nginx-mod-前缀不同):yum install -y nginx-module-image-filter nginx-module-perl nginx-module-xslt nginx-module-stream nginx-module-mail - 安装完成后检查Nginx配置是否正常,重载服务生效:
nginx -t systemctl reload nginx
方案二:统一使用EPEL源的Nginx版本
如果不需要使用1.22.0版本的特性,可以将现有Nginx降级到EPEL源提供的1.20.1版本,和EPEL模块版本匹配:
- 移除当前nginx-stable源的Nginx包,保留配置文件:
rpm -e --nodeps nginx - 安装EPEL源的Nginx和对应模块:
yum install -y nginx nginx-mod-http-image-filter nginx-mod-http-perl nginx-mod-http-xslt-filter nginx-mod-stream nginx-mod-mail - 验证配置后重启服务:
nginx -t systemctl restart nginx
注意事项
- 不要混合使用不同源的Nginx主程序和模块,二进制接口不兼容会直接导致Nginx无法启动
- 操作前建议先备份
/etc/nginx目录下的所有配置文件,避免配置丢失 - 安装完模块后记得在
nginx.conf顶部加载对应模块的配置文件(官方源模块默认会在/etc/nginx/modules下生成.conf加载配置,若没有需要手动添加load_module指令)
内容的提问来源于stack exchange,提问作者Hassan Yousefzadeh
相关产品推荐
相关产品推荐

