最近在日常运维中突然想起nginx是用apt安装的,版本是已经过时的1.18.0,现目标是将nginx升级到稳定版本1.22.0

主流版本除了更加安全以外,还支持更多的功能特性,比如之前使用老版本时没用到的ssl_reject_handshake等功能

此篇文章旨在帮助使用apt安装nginx的站长通过下载源码编译安装的方式将nginx升级到稳定nginx 1.22.0版本

关键词:ubuntu nginx apt upgrade 升级 编译安装

系统环境:ubuntu 22.04

为了能使用apt无缝升级nginx,我先后尝试了两种方法来添加apt源,但是添加官方源安装升级后不知为什么typecho打不开了,一直报错,最后还是回退了版本

一、非编译源码升级

参考这一篇文章进行操作

Ubuntu 添加Nginx官方deb源

二、编译源码升级

编译源码升级还是比想象中简单的,只需要准备好编译环境,确认好需要编译开启的模块,编译,替换二进制文件即可完成升级,但是在编译阶段和替换二进制文件后容易出现问题

1.获取源码

参考nginx: download

wget https://nginx.org/download/nginx-1.22.0.tar.gz

解压源码

tar -xvf nginx-1.22.0.tar.gz

进入源码目录

cd nginx-1.22.0

2.准备编译环境

  • 安装编译环境
sudo apt install build-essential gcc automake
  • 安装pcre软件包(使nginx支持http rewrite模块)
sudo apt install libpcre3 libpcre3-dev
  • 安装openssl-devel(使nginx支持ssl)
sudo apt install openssl libssl-dev
  • 安装zlib
sudo apt install zlib1g zlib1g-dev

3.准备configure命令

  • 1.先查看已安装的nginx的模块开启状态

#大写V
nginx -V
nginx version: nginx/1.22.0
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --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-compat --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_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-http_image_filter_module --with-http_geoip_module --with-http_xslt_module --with-mail --with-stream --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module --sbin-path=/usr/sbin

这里我们将configure arguments的全部参数都复制下来,需要注意的是这个是我源码安装后的选项,所以末尾是有--sbin-path=/usr/sbin参数的,你可以使用以下命令来查看nginx二进制文件位置,并更换为自己的位置

which nginx

在复制完选项后需要根据你自己的需要向二进制文件中添加你所需要的模块,比如我添加的为代理启用ssl模块等等,完整的可启用模块清单使用以下命令查看

./configure --help

使用with前缀开启模块,使用without关闭模块,直接向之前复制的参数中追加新命令即可

确认完成后进行编译前配置操作,这一步会检查你系统内有没有安装待添加模块的依赖库

./configure --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-compat --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_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-http_image_filter_module --with-http_geoip_module --with-http_xslt_module --with-mail --with-stream --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module --sbin-path=/usr/sbin

当这一步有报错大概率是你添加的模块本地没有安装依赖库,只需要根据错误提示使用apt安装相应的库即可

我这里例举了一些常用模块对应的库

modulelib
the GeoIP module requires the GeoIP librarylibgeoip-dev
the HTTP image filter module requires the GD librarylibgd-dev
the HTTP XSLT module requires the libxml2/libxsltlibxslt-dev
the HTTP gzip module requires the zlib libraryzlib1g-dev

4.编译

一般情况下在解决上一步依赖并且能成功通过配置后这一步一般不会有问题

需要注意的是这一步我们只需要生成二进制文件,并不需要安装,因为我们使用apt安装的已经设置好了变量等,直接替换主文件即可

make

编译完成后可执行文件生成在objs文件夹下

先进入objs文件夹,输入测试语法文件命令,检查配置文件是否正常

cd objs
./nginx -t

这一步会出现module加载失败的问题,大致问题就是新版本使用的模块版本高于本地安装的旧版本

这个问题也很好解决,因为我们编译安装的nginx二进制文件内已经有了相关函数,直接调用本机依赖库,已经不再需要在配置文件中启用相关模块,直接在配置文件中关闭以前所有启用的模块即可

进入nginx module配置文件目录,将以前版本启用的模块都关闭掉

这里将软连接移动到modules_available文件夹相当于关闭模块

mv /etc/nginx/modules-enabled/* /etc/nginx/modules-available/

此时再测试配置文件语法正常

5.替换二进制文件

首先备份低版本文件,复制新文件

mv /usr/sbin/nginx /usr/sbin/nginx-old
cp objs/nginx /usr/sbin

检查nginx版本,并查看期望的module是否启用

nginx -V

再次检查配置文件是否正常

nginx -t

全部正常后就可以重启服务了

6.重启服务完成升级

重启服务完成新旧文件的切换

systemctl restart nginx

2022/9/26更新 编译升级的nginx如何添加新模块

  1. 备份原始二进制文件
  2. 执行nginx -V查看已编译参数
  3. 使用以下./configure命令格式来添加/更改模块
./configure + 已编译参数 + 添加新增模块

参数说明

参数说明
--add-module为添加的第三方模块,如果要使用非官方的模块则需要使用该参数指定第三方模块路径,使其参与编译
--with..._module表示启用的官方nginx模块
示例:例如我想为编译后的nginx添加geoip2模块的支持,则需要手动下载geoip2模块,并在重新编译时原样复制上一次的已编译参数,附加--add-module /path/to/geoip2lib的参数,即可添加此模块
  1. make 只编译不安装,用objs生成文件夹中的nginx二进制文件替换旧的文件,重启nginx即可

三、参考链接

apt安装nginx最新版

ubuntu使用apt安装nginx后,编辑源码nginx添加新模块

Nginx升级从1.18.0 升级1.21.1(nginx升级到1.21.1)

Nginx编译安装

文章作者:四文鱼Max

本文链接:https://blog.awolon.fun/archives/ubuntu-upgrade-nginx.html

许可协议:CC BY-SA 4.0

标签: apt, nginx, ubuntu

添加新评论