利用 docker 构建nginx动态模块

This commit is contained in:
fa1seu 2024-08-11 04:52:15 +08:00
parent 89e20ab7b6
commit 1e18537597
2 changed files with 63 additions and 2 deletions

37
binding/nginx/Dockerfile Normal file
View File

@ -0,0 +1,37 @@
ARG NGINX_VERSION=1.27.0
FROM nginx:${NGINX_VERSION} AS build
# 嫌更新慢,可以试试这个镜像站地址
# sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list.d/debian.sources && \
RUN apt-get update && \
apt-get install -y build-essential libpcre3-dev zlib1g-dev libssl-dev git
WORKDIR /usr/src
RUN curl -O http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
git clone --depth=1 https://github.com/lionsoul2014/ip2region.git && \
# 生成configure参数, 最好与nginx原始配置参数一致, 不然模块会出现兼容问题 \
nginx -V 2>&1 | grep 'configure arguments' | sed 's/ --/ \\\n --/g' | sed "s/pie'/pie' \\\/g" | grep -v 'configure arguments' >> /tmp/conf_arg && \
echo \
' --add-dynamic-module=$(pwd)/../ip2region/binding/nginx \\\n' \
' --with-cc-opt="-I $(pwd)/../ip2region/binding/c/build/include" \\\n' \
' --with-ld-opt="-L $(pwd)/../ip2region/binding/c/build/lib"' >> /tmp/conf_arg
WORKDIR /usr/src/ip2region/binding/c
RUN make xdb_searcher_lib
WORKDIR /usr/src/nginx-${NGINX_VERSION}
RUN cat /tmp/conf_arg && \
bash -c 'eval "./configure $(cat /tmp/conf_arg)"' && \
make modules && \
cp /usr/src/nginx-${NGINX_VERSION}/objs/ngx_http_ip2region_module.so /
# 用于builx导出
FROM scratch AS export_so
COPY --from=build /ngx_http_ip2region_module.so /
# 第三阶段,只把编译出来兼容版本的模块添加进自定义 nginx 镜像,节省空间
FROM nginx:${NGINX_VERSION}
COPY --from=build /usr/src/nginx-${NGINX_VERSION}/objs/ngx_http_ip2region_module.so /etc/nginx/modules/
CMD ["nginx", "-g", "daemon off;"]

View File

@ -19,6 +19,25 @@ $ make
$ make install
```
## 利用 docker 构建动态模块
```shell
# 启用 BuildKit
export DOCKER_BUILDKIT=1
# 构建一个包含ip2region的动态模块自定义镜像, 默认版本由参数 `ARG NGINX_VERSION=1.27.0` 控制
docker build -t custom-nginx .
# 构建一个包含ip2region的动态模块自定义镜像, 且指定nginx版本
docker build -t custom-nginx:1.26.1 --build-arg NGINX_VERSION=1.26.1 .
# 导出动态模块到当前目录, target表示目标阶段, o是output 输出类型和位置
docker build --target export_so -o type=tar,dest=./so.tar .
# 解压即可看到 `ngx_http_ip2region_module.so`, 可将此模块放置到nginx的模块目录,比如 /etc/nginx/modules/
tar xf so.tar
```
## nginx conf
> Syntax: `ip2region_db xdb_file_path [cache_policy Optional]`;
@ -29,7 +48,12 @@ cache_policy: `file` or `vectorIndex` or `content`, default: `content`
Edit `nginx.conf` add `ip2region_db` directive
```nginx
...
...
# 如果是动态模块需要使用 load_module 的方式来加载它
# load_module /etc/nginx/modules/ngx_http_ip2region_module.so;
http {
log_format main escape=json '{'
@ -59,7 +83,7 @@ http {
```
Copy `ip2region.xdb` to `nginx/config` folder, then restart nginx, the `region` data stored in `ip2region` variable
Copy `ip2region.xdb` to `nginx/config` (e.g. nginx/conf.d) folder, then restart nginx, the `region` data stored in `ip2region` variable
nginx access log sample