在 Nginx Docker 官方镜像中编译并加入第三方模块

        在使用 Nginx 官方 Docker 镜像时,默认不包含第三方模块。如果我们希望实现 根据国家或城市限制 IP 访问 等功能,就需要手动编译并添加第三方模块。本文以 ngx_http_geoip2_module 为例,详细介绍如何在 Nginx Docker 容器中完成编译和使用。​​​​​​

一、问题背景

  • Nginx 官方 Docker 镜像比较精简,默认删除了编译依赖。

  • 一些第三方模块(如 GeoIP2)需要依赖库支持。

  • 因此需要修改 Dockerfile,让镜像保留构建工具,再进入容器编译安装模块。


二、基础镜像准备

  1. 下载官方镜像文件

  1. 修改 Dockerfile

  • 进入 docker-nginx-master/mainline/debian 文件夹。

  • 编辑 Dockerfile,将清理安装包的语句替换为安全占位符,例如:

    RUN touch 1.txt && rm -rf 1.txt

  1. 构建镜像

docker build -t nginx-geoip2:1.21.3 .


三、准备依赖与源码


四、容器内编译安装

  1. 启动容器

docker run -d -t --name nginx --restart=always -p 80:80 nginx-geoip2:1.21.3

  1. 复制文件到容器

docker cp libmaxminddb-1.6.0 nginx:/

docker cp ngx_http_geoip2_module-master nginx:/

docker cp nginx-1.21.3 nginx:/usr/local/

  1. 安装依赖库 libmaxminddb

apt update && apt install -y build-essential make

cd libmaxminddb-1.6.0/

./configure && make && make check && make install

ldconfig

  1. 准备模块目录

mkdir -p /usr/lib/nginx/nginx-geoip2

mv /ngx_http_geoip2_module-master /usr/lib/nginx/nginx-geoip2/ngx_http_geoip2_module

  1. 安装 Nginx 编译依赖

apt-get install -y libpcre3 libpcre3-dev libssl-dev zlib1g-dev

/usr/sbin/nginx -V # 查看原始编译参数

  1. 重新编译 Nginx,添加模块

cd /usr/local/nginx-1.21.3

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx \

...原有参数... \

--add-module=/usr/lib/nginx/nginx-geoip2/ngx_http_geoip2_module

make

cp /usr/sbin/nginx /usr/sbin/nginx-no-geoip2

cp /usr/local/nginx-1.21.3/objs/nginx /usr/sbin/nginx

  1. 验证是否成功

docker restart nginx

docker exec -it nginx /bin/bash

/usr/sbin/nginx -V # 输出应包含 geoip2 模块

ldd /usr/sbin/nginx # 应包含 libmaxminddb.so.0


五、配置 GeoIP2 数据库

  1. 导入 MaxMind 数据库

tar -zxvf GeoLite2-Country_20211005.tar.gz

tar -zxvf GeoLite2-City_20211005.tar.gz

docker cp GeoLite2-City_20211005/GeoLite2-City.mmdb nginx:/usr/share/nginx/

docker cp GeoLite2-Country_20211005/GeoLite2-Country.mmdb nginx:/usr/share/nginx/

  1. 修改 Nginx 配置文件
    nginx.conf 中添加:

load_module modules/ngx_http_geoip2_module.so;

http {
    geoip2 /usr/share/nginx/GeoLite2-Country.mmdb {
        $geoip2_country_code default=US source=$remote_addr country iso_code;
    }

    server {
        listen 80;

        location / {
            if ($geoip2_country_code ~ (US|NL|GB)) {
                return 403;
            }
            root /usr/share/nginx/html;
        }
    }
}

  1. 验证配置

nginx -t

nginx -s reload

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值