# 新版Nginx-1.26.2+OpenSSL-3.3.1+Nginx-Sticky源码编译方法
# 1. 背景
由于原手册提供的nginx-1.20.2存在安全漏洞,且原手册编译方法不适用于高版本nginx编译sticky模块,这里重新整理了Nginx-1.26.2+OpenSSL-3.3.1+Nginx-Sticky源码编译的操作手册及脚本
这里使用的编译环境是 Ubuntu:22.04 lts (适用最小化安装或容器镜像)。 由于Centos7在2024年6月30日已结束支持,后续官方将不再维护包括安全更新和重要的错误修复,这里只在文末对centos7下编译做简单介绍。
# 2. 操作步骤
提示:低版本Nginx可以直接通过删除Nginx目录实现
# 2.1 更新软件源,安装依赖
sudo apt update -y
sudo apt install wget gcc build-essential -y
# 2.2 下载源码包
# 将所有源码包下载到 /opt/nginx_src
mkdir -p /opt/nginx_src
cd /opt/nginx_src
# nginx: 1.26.2
wget https://nginx.org/download/nginx-1.26.2.tar.gz -O nginx-1.26.2.tar.gz
# nginx_sticky_module: 1.2.6
https://github.com/Refinitiv/nginx-sticky-module-ng/archive/refs/tags/1.2.6.tar.gz -O nginx-sticky-1.2.6.tar.gz
# pcre: 8.45
https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz/download -O pcre-8.45.tar.gz
# openssl: 3.3.1
https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gz -O openssl-3.3.1.tar.gz
# zlib: 1.3.1
https://zlib.net/zlib-1.3.1.tar.gz -O zlib-1.3.1.tar.gz
# 2.3 解压
cd /opt/nginx_src
tar -zvxf nginx-1.26.2.tar.gz
tar -zvxf nginx-sticky-1.2.6.tar.gz
tar -zvxf pcre-8.45.tar.gz
tar -zvxf openssl-3.3.1.tar.gz
tar -zvxf zlib-1.3.1.tar.gz
mv nginx-sticky-module-ng-1.26.2 nginx-sticky-1.26.2
# 2.4 修改nginx-sticky模块源码 (解决编译过程报错问题)
报错: ngx_http_sticky_module.c: error: 'ngx_http_headers_in_t' has no member named 'cookies'
ngx_http_sticky_misc.c:152:15: error: ‘MD5_DIGEST_LENGTH’ undeclared (first use in this function)
解决方法:
sed -i "s/ngx_http_parse_multi_header_lines.*/ngx_http_parse_multi_header_lines(r, r->headers_in.cookie, \&iphp->sticky_conf->cookie_name, \&route) != NULL){/g" /opt/nginx_src/nginx-sticky-1.2.6/ngx_http_sticky_module.c
sed -i '12a #include <openssl/sha.h>' /opt/nginx_src/nginx-sticky-1.2.6/ngx_http_sticky_misc.c
sed -i '12a #include <openssl/md5.h>' /opt/nginx_src/nginx-sticky-1.2.6/ngx_http_sticky_misc.c
# 2.5 编译安装nginx-1.26.2
cd /opt/nginx_src/nginx-1.26.2
./configure --prefix=/opt/nginx-1.26.2 --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_auth_request_module --with-http_random_index_module --with-http_gzip_static_module --with-pcre=/opt/nginx_src/pcre-8.45 --add-module=/opt/nginx_src/nginx-sticky-1.2.6 --with-openssl=/opt/nginx_src/openssl-3.3.1 --with-zlib=/opt/nginx_src/zlib-1.3.1 --with-stream
make
make install
安装完成
# 3. Centos7下编译介绍
# 3.1 安装依赖
yum update -y
yum install gcc gcc-c++ kernel-devel -y
注意:openssl-3.3.1 编译依赖 Perl模块IPC::Cmd, 可以使用以下命令通过CPAN安装
yum install perl-CPAN -y
cpan IPC::Cmd # 首次使用,会提示初始化配置,默认推荐选择即可,也可以进入CPAN的shell模式安装,perl -MCPAN -e shell 进入shell模式,执行 install IPC/Cmd.pm 安装
其他步骤参照ubuntu下编译即可,完成后如图
# 4. 编译脚本(ubuntu)
安装目录:ins_dir="/opt/nginx-1.26.2"
#!/bin/bash
ins_dir="/opt/nginx-1.26.2"
src_dir=$ins_dir/src
sudo apt update -y
sudo apt install wget gcc build-essential -y
nginx_src="https://nginx.org/download/nginx-1.26.2.tar.gz"
nginx_sticky="https://github.com/Refinitiv/nginx-sticky-module-ng/archive/refs/tags/1.2.6.tar.gz"
pcre="https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz/download"
openssl="https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gz"
zlib="https://zlib.net/zlib-1.3.1.tar.gz"
nginx_ver=1.26.2
nginx_sticky_ver=1.2.6
pcre_ver=8.45
openssl_ver=3.3.1
zlib_ver=1.3.1
if [ ! -d $src_dir ];then
mkdir -p $src_dir
fi
cd $src_dir
wget $nginx_src -O "nginx-"$nginx_ver".tar.gz"
wget $nginx_sticky -O "nginx-sticky-"$nginx_sticky_ver".tar.gz"
wget $pcre -O "pcre-"$pcre_ver".tar.gz"
wget $openssl -O "openssl-"$openssl_ver".tar.gz"
wget $zlib -O "zlib-"$zlib_ver".tar.gz"
tar -zvxf "nginx-"$nginx_ver".tar.gz"
tar -zvxf "nginx-sticky-"$nginx_sticky_ver".tar.gz"
tar -zvxf "pcre-"$pcre_ver".tar.gz"
tar -zvxf "openssl-"$openssl_ver".tar.gz"
tar -zvxf "zlib-"$zlib_ver".tar.gz"
mv "nginx-sticky-module-ng-"$nginx_sticky_ver "nginx-sticky-"$nginx_sticky_ver
sed -i "s/ngx_http_parse_multi_header_lines.*/ngx_http_parse_multi_header_lines(r, r->headers_in.cookie, \&iphp->sticky_conf->cookie_name, \&route) != NULL){/g" $src_dir/nginx-sticky-$nginx_sticky_ver/ngx_http_sticky_module.c
sed -i '12a #include <openssl/sha.h>' $src_dir/nginx-sticky-$nginx_sticky_ver/ngx_http_sticky_misc.c
sed -i '12a #include <openssl/md5.h>' $src_dir/nginx-sticky-$nginx_sticky_ver/ngx_http_sticky_misc.c
cd nginx-$nginx_ver
./configure --prefix=$ins_dir/nginx-$nginx_ver --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_auth_request_module --with-http_random_index_module --with-http_gzip_static_module --with-pcre=$src_dir/pcre-$pcre_ver --add-module=$src_dir/nginx-sticky-$nginx_sticky_ver --with-openssl=$src_dir/openssl-$openssl_ver --with-zlib=$src_dir/zlib-$zlib_ver --with-stream
make
make install
创建人:wangyxyf
修改人:wangyxyf