# 新版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源码编译的操作手册及脚本。
Nginx部署环境要求:Linux或信创系统。
如项目需要进行协同集群部署,采用Nginx做Web负载均衡服务,需要用到nginx-sticky-module模块的会话粘滞能力,此模块目前仅支持Linux系统,本手册也是基于此Nginx+Sticky方案进行部署。
# 2. 手动操作步骤
# 2.1 更新软件源,安装依赖
# Debian及其衍生发行版(如Ubuntu)运行如下命令
sudo apt update -y
sudo apt install wget gcc build-essential -y
# RedHat体系(如CentOS)使用yum或dnf作为包管理工具
sudo yum update -y
sudo yum install -y wget gcc make gcc-c++ kernel-devel
如果是RedHat体系(如CentOS),openssl-3.3.1编译依赖Perl模块IPC::Cmd,可以使用以下命令通过CPAN安装:
yum install perl-CPAN -y
# 首次使用,会提示初始化配置,默认推荐选择即可,也可以进入CPAN的shell模式安装,perl -MCPAN -e shell 进入shell模式,执行 install IPC/Cmd.pm 安装
cpan IPC::Cmd
# 2.2 下载源码包
# (可选)源码包及依赖下载方式:
# 由于下载部分包需要访问github.com,现提供nginx源码包、依赖包support网站下载地址:
https://support.seeyon.com/cbo_cptjxx.html?id=1927201430008102914
# 如果本地网络可以正常访问github.com等地址,也可以直接通过官方渠道下载
# 将所有源码包下载到 /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
wget 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
wget 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
wget 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
wget https://zlib.net/zlib-1.3.1.tar.gz -O zlib-1.3.1.tar.gz
如客户环境无法直接通过wget下载依赖包,可手动逐个下载所需依赖,将其放置到/opt/nginx_src
目录:
- Nginx,下载stable version,1.20.2或者以上版本(建议选择较高版本,以减少安全漏洞):https://nginx.org/en/download.html
- nginx-sticky-module,下载链接:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/downloads/
- pcre,下载链接:https://sourceforge.net/projects/pcre/files/pcre/
- openssl,下载链接:https://www.openssl.org/source/
- zlib,下载链接:https://zlib.net/
# 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
# 重命名sticky依赖(简短些方便后面写路径)
mv nginx-sticky-module-ng-1.2.6 nginx-sticky-1.2.6
# 2.4 (必做)修改nginx-sticky模块源码 (解决编译过程报错问题)
在编译安装前,先执行如下命令修改nginx-sticky模块源码,避免编译过程报错:
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
如未修改源码,会遇到如下报错: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)
# 2.5 编译安装nginx-1.26.2
cd /opt/nginx_src/nginx-1.26.2
# 配置编译环境
# 编译参数 --prefix=/opt/nginx-1.26.2 指定把nginx安装到 /opt/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
# 上一步./configure命令完成没有报错后,再依次执行如下命令
# 编译源码
make
# 安装
make install
安装完成
# 3. 自动化脚本(ubuntu环境)
注意:使用脚本安装必须保证服务器可以访问互联网,如:github.com,否则无法正常下载源码包和依赖包
这里使用的编译环境是 Ubuntu:22.04 lts
(适用最小化安装或容器镜像)。
新建一个sh脚本文件,将如下代码拷贝进sh脚本,一键运行安装。
修改脚本开头可设置安装目录: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 --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
# 4.Nginx维护
# 4.1Nginx启停
启动:
# 切换到ng程序目录sbin
cd /opt/nginx-1.26.2/sbin
# 启动
./nginx
重启:
# 切换到ng程序目录sbin
cd /opt/nginx-1.26.2/sbin
# 重启
./nginx -s reload
停止:
# 切换到ng程序目录sbin
cd /opt/nginx-1.26.2/sbin
# 停止
./nginx -s stop
指定配置文件重启,一般用于nginx异常停止后的启动:
# 切换到ng程序目录sbin
cd /opt/nginx-1.26.2/sbin
# 指定配置文件重启,一般用于nginx异常停止后的启动
./nginx -c /home/nginx/conf/nginx.conf
# 4.2Nginx配置
cat /opt/nginx-1.26.2/conf/nginx.conf
# 4.3卸载重装Nginx
如Nginx需要升级,则先保存配置文件,卸载Nginx,再重新安装:
1、备份Nginx程序目录conf/nginx.conf文件
2、停止Nginx服务
3、删除Nginx程序目录全部文件
4、重新安装行版本Nginx
5、将备份的Nginx程序目录conf/nginx.conf文件放置到新版本Nginx
快速跳转
