笔记---Nginx平滑升级以及遇到问题记录

1 背景

系统为Ubuntu18.08,Nginx的旧版本为1.14.0,升级新版本为1.21.4;服务器上正在运行着服务,因此采用平滑升级的方式进行nginx升级。非root用户

2 平滑升级

(1)在不停掉老进程的情况下,启动新进程。

(2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。

(3)新进程接受新请求。

(4)老进程处理完所有请求,关闭所有连接后,停止。

这样就很方便地实现了平滑升级。一般有两种情况下需要升级Nginx,一种是确实要升级Nginx的版本,另一种是要为Nginx添加新的模块。

3 平滑升级命令

cd /mnt

# 下载nginx升级包
sudo wget http://nginx.org/download/nginx-1.21.4.tar.gz

# 解压升级包
sudo tar zxvf nginx-1.21.4.tar.gz

cd nginx-1.21.4/

# 查看当前版本得到编译参数
sudo /usr/sbin/nginx -V
# 参数:configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-H4cN7P/**nginx-1.14.0**=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

# 用上面编译参数,参数中的版本需要修改
sudo ./configure --prefix=/usr/local/nginx --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-H4cN7P/nginx-1.21.4=. -fstack-protector-strong....... 
# 执行这一步时可能会出现很多module找不到,可以尝试自己添加;找不到的话可以先将add-module及后面的路径地址删除,先执行下去。

# 编译make,千万别make install
sudo make

# make编译完后,在objs目录下就多了个nginx,这个就是新版本的程序了

# 备份原nginx文件
sudo mv /usr/sbin/nginx /usr/sbin/nginx-20211111

# 将新生成nginx执行文件复制到nginx/sbin下
sudo cp objs/nginx /usr/sbin/nginx

# 检测配置文件是否正确
sudo /usr/sbin/nginx -t

# 执行升级(通过拷贝替换的方式可以不执行这一步了)
make upgrade

# 执行完后
sudo /usr/sbin/nginx -V

# 到此就完成平滑升级。

参考文档:https://cloud.tencent.com/developer/article/1139955

4 升级过程中遇到的问题及解决方案

4.1 错误1:error: the HTTP rewrite module requires the PCRE library

错误信息:

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

解决:

# 需要安装pcre包。
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
# 你可能还需要安装
sudo apt-get install openssl libssl-dev

参考链接:
https://blog.csdn.net/pengshengli/article/details/86694967

4.2 错误2:error: the HTTP gzip module requires the zlib library.

错误信息:

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

解决:

# 找一个版本下载,解压、安装(安装前先configure)
http://zlib.net/
# 使用的是1.2.11

参考链接:
https://blog.csdn.net/pengshengli/article/details/86694967
https://www.jb51.net/article/80468.htm

4.3 错误3:error: the HTTP XSLT module requires the libxml2/libxslt libraries.

错误信息:

./configure: error: the HTTP XSLT module requires the libxml2/libxslt libraries. 
You can either do not enable the module or install the libraries.

解决:

# 需要安装libxslt包。
sudo apt-get update
sudo apt-get install libxslt-dev
# 你可能还需要安装
sudo apt-get install libgd-dev # for the "error: the HTTP image filter module requires the GD library." error
sudo apt-get install libgeoip-dev # for the GeoIP package

参考链接:
https://stackoverflow.com/questions/57415360/configure-error-the-http-xslt-module-requires-the-libxml2-libxslt-libraries
https://cloud.tencent.com/developer/article/1401078

4.4 错误4:error: the HTTP image filter module requires the GD library.

错误信息:

./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.

解决:

# 需要安装libxslt包。
sudo apt-get update
sudo apt-get install -y libgd-dev
# 如果在安装libgd-dev时提示找不到
# 在 vim /etc/apt/sources.list 中添加一行ubuntu 的镜像源
deb http://security.ubuntu.com/ubuntu trusty-security main

在升级Nginx1.18.0至1.22.0版本时执行 sudo apt-get install -y libgd-dev 这个命令时遇到了报错,
报错信息:

The following packages have unmet dependencies:
 libgd-dev : Depends: libxpm-dev but it is not going to be installed
             Depends: libx11-dev but it is not going to be installed
             Depends: libxt-dev but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

执行 sudo apt-get install libxpm-dev libx11-dev libxt-dev 以安装缺少包,又遇到了新的报错,报错信息如下:

libx11-dev : Depends: libx11-6 (= 2:1.6.9-2ubuntu1.2) but 2:1.6.9-2ubuntu1.3 is to be installed

通过指定版本来解决

sudo apt-get install libx11-6=2:1.6.9-2ubuntu1.2

# 然后再次执行这个命令
sudo apt-get install  libxpm-dev libx11-dev libxt-dev

参考链接:
https://blog.csdn.net/liuYinXinAll/article/details/88357669
https://stackoverflow.com/questions/57415360/configure-error-the-http-xslt-module-requires-the-libxml2-libxslt-libraries
https://cloud.tencent.com/developer/article/1401078

4.5 错误5:error: the GeoIP module requires the GeoIP library.

错误信息:

./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.

解决:

# 需要安装libxslt包。
sudo apt-get update
sudo apt-get install libgeoip-dev

参考链接:
https://blog.csdn.net/liuYinXinAll/article/details/88357669
https://stackoverflow.com/questions/57415360/configure-error-the-http-xslt-module-requires-the-libxml2-libxslt-libraries
https://cloud.tencent.com/developer/article/1401078

4.6 错误6:[emerg] module “/usr/lib/nginx/modules/ngx_http_passenger_module.so” version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-http-passenger.conf:1

错误信息:执行 sudo /usr/sbin/nginx -t。因为服务器上使用passenger部署着rails的项目,因此遇到这个问题了。

nginx: [emerg] module "/usr/lib/nginx/modules/ngx_http_passenger_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-http-passenger.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

解决:
已安装了passenger相关模块(Installing Passenger + Nginx),需要重新添加ngx_http_passenger_module

passenger-config --nginx-addon-dir

# 添加 --add-module=/your path/passenger/ngx_http_passenger_module
sudo ./configure  --prefix=/usr/local/nginx --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-H4cN7P/nginx-1.21.4=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-module=/usr/share/passenger/ngx_http_passenger_module

# 重新编译
sudo make

sudo cp objs/nginx /usr/sbin/nginx

# 然后再次执行sudo /usr/sbin/nginx -t,可能会出现新的错误
#  [emerg] module "ngx_http_passenger_module" is already loaded in /etc/nginx/modules-enabled/50-mod-http-passenger.conf:1
# 尝试修改50-mod-http-passenger.conf
sudo vim /etc/nginx/modules-enabled/50-mod-http-passenger.conf
# 注释掉 # load_module /usr/lib/nginx/modules/ngx_http_passenger_module.so;

参考链接:
https://stackoverflow.com/questions/10271332/can-i-add-passenger-support-to-a-existed-nginx-instead-of-rebuild-one

4.7 错误7:报其他错误module.so的版本问题

除了ngx_http_passenger_module.so外,其他模块可以从/mnt/nginx-1.21.4/objs/ 中拷贝指定的module 到/usr/share/nginx/modules/中

4.7.1 ngx_http_xslt_filter_module.so

错误信息:

nginx: [emerg] module "/usr/share/nginx/modules/ngx_http_xslt_filter_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

解决:

# 备份旧的module
sudo mv /usr/share/nginx/modules/ngx_http_xslt_filter_module.so /usr/share/nginx/modules/ngx_http_xslt_filter_module.so.old
# 拷贝新的module
sudo cp objs/ngx_http_xslt_filter_module.so  /usr/share/nginx/modules/ngx_http_xslt_filter_module.so
4.7.2 ngx_mail_module.so

错误信息:

nginx: [emerg] dlopen() "/usr/share/nginx/modules/ngx_mail_module.so" failed (/usr/share/nginx/modules/ngx_mail_module.so: undefined symbol: SSL_CTX_set_options) in /etc/nginx/modules-enabled/50-mod-mail.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

解决:

sudo mv /usr/share/nginx/modules/ngx_mail_module.so /usr/share/nginx/modules/ngx_mail_module.so.old
sudo cp objs/ngx_mail_module.so  /usr/share/nginx/modules/ngx_mail_module.so
4.7.3 ngx_stream_module.so

错误信息:

nginx: [emerg] dlopen() "/usr/share/nginx/modules/ngx_stream_module.so" failed (/usr/share/nginx/modules/ngx_stream_module.so: undefined symbol: SSL_CTX_set_options) in /etc/nginx/modules-enabled/50-mod-stream.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

解决:

sudo mv /usr/share/nginx/modules/ngx_stream_module.so /usr/share/nginx/modules/ngx_stream_module.so.old
sudo cp objs/ngx_stream_module.so  /usr/share/nginx/modules/ngx_stream_module.so
4.7.4 ngx_http_geoip_module.so

错误信息:

nginx: [emerg] dlopen() "/usr/share/nginx/modules/ngx_http_geoip_module.so" failed (/usr/share/nginx/modules/ngx_http_geoip_module.so: undefined symbol: SSL_CTX_set_options) in /etc/nginx/modules-enabled/50-mod-stream.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

解决:

sudo mv /usr/share/nginx/modules/ngx_http_geoip_module.so /usr/share/nginx/modules/ngx_http_geoip_module.so.old
sudo cp objs/ngx_http_geoip_module.so  /usr/share/nginx/modules/ngx_http_geoip_module.so

5 最后

# 执行
sudo /usr/sbin/nginx -t
# 输出
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# 重新启动nginx
sudo /etc/init.d/nginx restart

6 补充

在2023/06/12对一台服务器进行nginx升级时(由1.14.0升级至1.21.4),遇到了新的问题,进行以下补充。

6.1

错误信息:

# 错误信息1
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-headers-more-filter
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-headers-more-filter/config was found

# 错误信息2
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-auth-pam
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-auth-pam/config was found

# 错误信息3
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-cache-purge
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-cache-purge/config was found

# 错误信息4
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-dav-ext
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-dav-ext/config was found

# 错误信息5
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-ndk
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-ndk/config was found

# 错误信息6
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-echo
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-echo/config was found

# 错误信息7
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-fancyindex
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-fancyindex/config was found

# 错误信息8
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/nchan
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/nchan/config was found

# 错误信息9
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-lua
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-lua/config was found

# 错误信息10
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/rtmp
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/rtmp/config was found

# 错误信息11
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-uploadprogress
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-uploadprogress/config was found

# 错误信息12
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-upstream-fair
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-upstream-fair/config was found

# 错误信息13
adding module in /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-subs-filter
./configure: error: no /build/nginx-YlUNvj/nginx-1.21.4/debian/modules/http-subs-filter/config was found

解决方案:
以上报错,我都是在执行 sudo ./configure --prefix=/usr/local/nginx --with-cc-opt='-g -O2 -… 时遇到的。先将 --add-module=…及后面的路径地址删除,先执行下去。

6.2

错误信息:

# 错误信息1
nginx: [emerg] module "/usr/share/nginx/modules/ngx_http_geoip_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-http-geoip.conf:1

# 错误信息2
nginx: [emerg] module "/usr/share/nginx/modules/ngx_http_xslt_filter_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:1

# 错误信息3
nginx: [emerg] module "/usr/share/nginx/modules/ngx_mail_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-mail.conf:1

# 错误信息4
nginx: [emerg] module "/usr/share/nginx/modules/ngx_stream_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-stream.conf:1

# 错误信息5
nginx: [emerg] module "/usr/share/nginx/modules/ndk_http_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/10-mod-http-ndk.conf

# 错误信息6
nginx: [emerg] module "/usr/share/nginx/modules/ngx_http_auth_pam_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-http-auth-pam.conf:1

解决方案:
以上的错误信息时在执行 sudo /usr/sbin/nginx -t 时遇到。

错误信息1~4:检查发现 编译之后的目录(/mnt/nginx-1.21.4/objs/)中有新的对应的xxx_module.so,因此将解决方式同4.7中的解决方案,用新的 xxx_module.so 替换原 /usr/share/nginx/modules/xxx_module.so。

错误信息5~6:我将对应的/etc/nginx/modules-enabled/xxxx.conf的引入改模块的地方先注释掉。

# 修改对应的配置文件
sudo vim /etc/nginx/modules-enabled/10-mod-http-ndk.conf
sudo vim /etc/nginx/modules-enabled/50-mod-http-auth-pam.conf
#注释掉引用这些模块的地方

6.3

错误信息:

# 错误信息
nginx: [alert] version 1.21.4 of nginx.pm is required, but 1.14.0 was found

解决:
以上的错误信息时在执行 sudo /usr/sbin/nginx -t 时遇到

在编制的目录objs/下找到新版的 nginx.pm 然后替换

# 找到编译之后的新的nginx.pm
find ./objs/ -name nginx.pm
# 找到其他的nginx.pm
find / -name nginx.pm
# 替换

替换完成再次执行 sudo /usr/sbin/nginx -t 可能会遇到新的报错:

nginx object version 1.14.0 does not match bootstrap parameter 1.21.4 at /usr/share/perl/5.26/XSLoader.pm line 114. Compilation failed in require. BEGIN failed--compilation aborted. nginx: [alert] perl_parse() failed: 2 nginx: configuration file /etc/nginx/nginx.conf test failed

这个报错信息没有找到解决方法,但是这个问题是由ngx_http_perl_module这个模块引起,所以我将引用这个模块的地方给注释掉,跳过了这个问题。需要明确服务器中没有使用该模块

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值