Nginx使用geoip模块识别客户端地区

前言

想根据IP获取用户所在地点有各种方案, 今天来介绍一下比较简单和无侵入性的一种: 通过nginx插件自动识别IP地区

Dockerfile

现在的nginx镜像里已经都自带了ngx_http_geoip_module.so模块, 位于/etc/nginx/modules/目录下, 所以我们只需要参考文档, 将需要的GeoIP.dat数据包打入镜像, 并配置好参数即可

1
2
3
4
5
6
7
8
FROM nginx:stable

RUN apt-get update && apt-get install -y vim less curl

COPY ./conf/ip.mmdb /home/var/data/ip.mmdb

COPY ./conf/nginx.conf /etc/nginx/nginx.conf
COPY ./conf/default.conf /etc/nginx/conf.d/default.conf

nginx 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# nginx.conf

# 加载geoip模块

load_module "modules/ngx_http_geoip_module.so";

http {
# ...
}

# default.conf

geoip_country /home/var/data/ip.mmdb;

location /api/v1 {
proxy_set_header x-country-code $geoip_country_code;
# ...
}

配置完成之后启动nginx镜像, 就可以在后端转发的服务header中获取到用户地区了

结论

这种方案是对后端比较友好的一种方式, 由于nginx一般在负载均衡的最前端, 所以可以拿到最准确的用户IP, 对后端也没有侵入性修改, 而且由于是nginx本地数据提供的解析, 非常方便扩容, 数据的更新和维护也比较方便, 是一种比较轻量的解决方案

参考文档: http://nginx.org/en/docs/http/ngx_http_geoip_module.html

Nginx使用geoip模块识别客户端地区

https://mosby-zhou.github.io/2019/01-14-nginx-geoip/

作者

Mosby

发布于

2019-01-14

许可协议

评论