镜像
镜像就用 官方镜像 alpine 版本,此示例中 使用 docker pull nginx:1.23.3-alpine
编译环境
首先启动个容器,用于编辑环境,之后把编译好的 nginx 可执行程序拷贝出来。
docker run -it --name nginx-build nginx:1.23.3-alpine sh
apk add --no-cache --virtual .build-deps \
gcc \
libc-dev \
make \
openssl-dev \
pcre-dev \
zlib-dev \
linux-headers \
curl \
gnupg \
libxslt-dev \
gd-dev \
geoip-dev
第三方模块
主动对后端服务器进行状态检查
目前由于 淘宝主动后端检查版本和最新的 1.20.2 版本兼容(2023.01.05)
所有需要下载的 nginx 源码包是 nginx-1.20.2
curl -Lo nginx_upstream_check_module-master.tar.gz
需要进入 nginx-1.20.2 的源码目录打个补丁, 注意这里需要将 nginx-1.20.2 的源码包拷贝到 我们上一不创建的环境中再执行打补丁,因为需要在兼容的环境总大打补丁。
打补丁命令: patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patch
编译的时候增加如下参数--add-module=/path/to/nginx_upstream_check_module-master
内容替换
在响应正文中使用正则表达式和固定字符串进行文本替换。
一个第三方的替换模块:ngx_http_substitutions_filter_module,来实现我们的各种需求。
经过测试,这个模块至少有如下实用功能:
①、支持多次替换
②、支持正则替换
③、支持中文替换
Ps:略有遗憾的是,这个替换不能使用到 if 判断模块内,否则就超神了。。。
配置块: context: http, server, location
如果支持正则,需要在 末尾处添加 r 修饰符。
示例:
location / {
#subs_filter_types *;
subs_filter_types text/html text/css text/xml;
subs_filter st(\d*). $1. ir;
subs_filter a. s.;
subs_filter http://$host https://$host;
}
r
正则i
忽略大小写o
只需替换第一个
curl -Lo substitutions_filter.zip https:///yaoweibin/ngx_http_substitutions_filter_module/archive/refs/heads/master.
zip
编译的时候增加如下参数--add-module=/path/to/ngx_http_substitutions_filter_module-master
解码
对后端返回的 url 进行解码
https:///openresty/set-misc-nginx-module#installation
这个模块是 openresty 的,还有依赖的模块 https://codeload./vision5/ngx_devel_kit/zip/refs/tags/v0.3.2
curl -Lo set-misc-nginx.tar.gz https:///openresty/set-misc-nginx-module/archive/refs/tags/v0.33.tar.gz
curl -Lo ngx_devel_kit.zip https://codeload./vision5/ngx_devel_kit/zip/refs/tags/v0.3.2
编译的时候增加如下参数--add-module=/path/to/ngx_devel_kit-0.3.2 --add-module=/path/to/set-misc-nginx-module-0.33
开始构建
1 将这些需要的第三方模块拷贝到编译环境容器 nginx-build 中的 root 目录下
docker cp 模块目录 nginx-build:/root/
2 将 nginx-12.0.2 的源码也拷贝到编译环境容器 nginx-build 中的 root 目录下
wget http:///download/nginx-1.20.2.tar.gz
tar -xf nginx-1.20.2.tar.gz
docerk cp nginx-1.20.2 nginx-build:/root/
3 打补丁
进入nginx源码包目录执行
patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patch
4 在编译环境容器 nginx-build 中获取到原来的编译参数
nginx -V
5 将获取到的原编译参数和模块的编译参数进行组合
./configure --prefix=/etc/nginx --add-module=../nginx_upstream_check_module-master --add-module=../ngx_http_subst
itutions_filter_module-master --add-module=../ngx_devel_kit-0.3.2 --add-module=../set-misc-nginx-module-0.33 后面跟获取到的原来配置参数
6 执行 makels
7 将编译好的可执行文件 objs/nginx 拷贝出来
8 将拷贝出来的 nginx 文件拷贝到一个新的容器内,并构建新的容器dockerfile
FROM nginx:1.23.3-alpine
LABEL description="根据自己构建的情况,编写描述信息"
COPY ./nginx /usr/sbin/nginx
RUN apk add --no-cache --virtual .build-deps \
openssl-dev \
pcre-dev \
zlib-dev \
linux-headers \
libxslt-dev \
gnupg \
gd-dev geoip-dev
docker build -t nginx:1.20.2-alpine-upstream .