在使用 Nginx 官方 Docker 镜像时,默认不包含第三方模块。如果我们希望实现 根据国家或城市限制 IP 访问 等功能,就需要手动编译并添加第三方模块。本文以 ngx_http_geoip2_module 为例,详细介绍如何在 Nginx Docker 容器中完成编译和使用。
一、问题背景
-
Nginx 官方 Docker 镜像比较精简,默认删除了编译依赖。
-
一些第三方模块(如 GeoIP2)需要依赖库支持。
-
因此需要修改 Dockerfile,让镜像保留构建工具,再进入容器编译安装模块。
二、基础镜像准备
-
下载官方镜像文件
-
Docker Hub 官方 Nginx 镜像库:https://hub.docker.com/_/nginx
-
GitHub 官方 Nginx Docker 文件:https://github.com/nginxinc/docker-nginx/
-
修改 Dockerfile
-
进入
docker-nginx-master/mainline/debian文件夹。 -
编辑 Dockerfile,将清理安装包的语句替换为安全占位符,例如:
RUN touch 1.txt && rm -rf 1.txt
-
构建镜像
docker build -t nginx-geoip2:1.21.3 .
三、准备依赖与源码
-
Nginx 同版本源码包:http://nginx.org/download/
nginx-1.21.3.tar.gz -
GeoIP2 模块源码包:
https://github.com/TravelEngineers/ngx_http_geoip2_module
ngx_http_geoip2_module-master.zip -
GeoIP2 依赖库(libmaxminddb):
https://github.com/maxmind/libmaxminddb/releases
libmaxminddb-1.6.0.tar.gz -
MaxMind GeoIP2 数据库:
-
GeoLite2-Country_20211005.tar.gz -
GeoLite2-City_20211005.tar.gz
-
四、容器内编译安装
-
启动容器
docker run -d -t --name nginx --restart=always -p 80:80 nginx-geoip2:1.21.3
-
复制文件到容器
docker cp libmaxminddb-1.6.0 nginx:/
docker cp ngx_http_geoip2_module-master nginx:/
docker cp nginx-1.21.3 nginx:/usr/local/
-
安装依赖库 libmaxminddb
apt update && apt install -y build-essential make
cd libmaxminddb-1.6.0/
./configure && make && make check && make install
ldconfig
-
准备模块目录
mkdir -p /usr/lib/nginx/nginx-geoip2
mv /ngx_http_geoip2_module-master /usr/lib/nginx/nginx-geoip2/ngx_http_geoip2_module
-
安装 Nginx 编译依赖
apt-get install -y libpcre3 libpcre3-dev libssl-dev zlib1g-dev
/usr/sbin/nginx -V # 查看原始编译参数
-
重新编译 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
-
验证是否成功
docker restart nginx
docker exec -it nginx /bin/bash
/usr/sbin/nginx -V # 输出应包含 geoip2 模块
ldd /usr/sbin/nginx # 应包含 libmaxminddb.so.0
五、配置 GeoIP2 数据库
-
导入 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/
-
修改 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;
}
}
}
-
验证配置
nginx -t
nginx -s reload


被折叠的 条评论
为什么被折叠?



