前言

本文中系统环境:ubuntu 22.04、apt安装nginx 1.18.0

编译源码升级

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

1、获取源码

参考nginx: download

#以1.24.0版本为例
wget https://nginx.org/download/nginx-1.24.0.tar.gz
#解压源码
tar -xvf nginx-1.24.0.tar.gz
#进入源码目录
cd nginx-1.24.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.24.0
built by gcc 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' \
--with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -fPIC' \
--prefix=/usr/share/nginx \
--user=www-data \
--group=www-data \
--sbin-path=/usr/sbin/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

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

which nginx

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

./configure --help

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

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

./configure --with-cc-opt='-g -O2 -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' \
--with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -fPIC' \
--prefix=/usr/share/nginx \
--user=www-data \
--group=www-data \
--sbin-path=/usr/sbin/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

当这一步有报错大概率是你添加的模块本地没有安装依赖库,只需要根据错误提示使用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

编译升级的nginx如何添加新模块

1.备份原始二进制文件

2.执行nginx -V查看已编译参数

3.使用以下./configure命令格式来添加/更改模块

./configure + 已编译参数 + 添加新增模块

参数说明

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

4.make 只编译不安装,用objs生成文件夹中的nginx二进制文件替换旧的文件,重启nginx即可

分类: 教程 标签: 教程

评论

暂无评论数据

暂无评论数据

目录