基于docker 镜像的 nginx 编译添加第三方模块

Posted shark_西瓜甜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于docker 镜像的 nginx 编译添加第三方模块相关的知识,希望对你有一定的参考价值。

镜像

镜像就用 官方镜像 alpine 版本,
https://hub.docker.com/_/nginx/tags

此示例中 使用 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

wget http://nginx.org/download/nginx-1.20.2.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

配置指南: http://tengine.taobao.org/document_cn/http_upstream_check_cn.html

内容替换

在响应正文中使用正则表达式和固定字符串进行文本替换。

一个第三方的替换模块:ngx_http_substitutions_filter_module,来实现我们的各种需求。

经过测试,这个模块至少有如下实用功能:
①、支持多次替换
②、支持正则替换
③、支持中文替换
Ps:略有遗憾的是,这个替换不能使用到 if 判断模块内,否则就超神了。。。

github 手动下载地址:https://github.com/yaoweibin/ngx_http_substitutions_filter_module/

编译的时候增加如下参数
--add-module=/path/to/ngx_http_substitutions_filter_module-master

解码

对后端返回的 url 进行解码
https://github.com/openresty/set-misc-nginx-module#installation
这个模块是 openresty 的,下载地址: https://github.com/openresty/set-misc-nginx-module/tags
还有依赖的模块 https://codeload.github.com/vision5/ngx_devel_kit/zip/refs/tags/v0.3.2

wget https://github.com/openresty/set-misc-nginx-module/releases/tag/v0.33

编译的时候增加如下参数
--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 目录下

docerk cp nginx-1.20.2 nginx-build:/root/

3 在编译环境容器 nginx-build 中获取到原来的编译参数

nginx  -V

4 将获取到的原编译参数和模块的编译参数进行组合

5 执行 make
6 将编译好的可执行文件 objs/nginx 拷贝出来
7 将拷贝出来的 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 .

使用 openresty 替代nginx

https://hub.docker.com/r/openresty/openresty

下载镜像

https://hub.docker.com/_/nginx/tags

docker run -v /my/custom/conf.d:/etc/nginx/conf.d openresty/openresty:alpine

docker pull openresty/openresty:1.21.4.1-4-alpine-amd64
docker pull openresty/openresty:1.21.4.1-alpine-aarch64

以上是关于基于docker 镜像的 nginx 编译添加第三方模块的主要内容,如果未能解决你的问题,请参考以下文章

docker制作nginx+nginx-module-vts镜像基于alpine镜像

Docker 基于Dockerfile创建镜像实践

基于docker容器创建镜像image

基于docker容器创建镜像image

使用Dockerfile创建带编译安装znginx服务的Centos Docker镜像

基于docker镜像centos:7 镜像制作自定义的centos及tomcat/php/nginx镜像