YOLO813

Nginx嵌入GEOIP实战

    云服务器查看nginx安装信息:

/usr/local/nginx/sbin/nginx -V

    我的版本不包含ngx_http_geoip2_module模块,按照之前介绍的方法添加该模块,我将下载的模块解压到了该目录

/opt/ngx_http_geoip2_module-master

配置libmaxminddb

wget https://github.com/maxmind/libmaxminddb/releases/download/1.3.2/libmaxminddb-1.3.2.tar.gz
tar -xzf libmaxminddb-1.3.2.tar.gz
cd libmaxminddb-1.3.2
./configure
make
make check
sudo make install
sudo ldconfig

重新配置、编译nginx

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-dynamic-module=/opt/ngx_http_geoip2_module-master
make

# 备份
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# 停止nginx -cannot create regular file '/usr/local/nginx/sbin/nginx': Text file busy
systemctl stop nginx.service
# 拷贝至nginx的二进制目录下
cp objs/nginx /usr/local/nginx/sbin/
# start
systemctl start nginx.service
# 再次查看安装情况
/usr/local/nginx/sbin/nginx -V


找到so文件

find / -name "ngx_http_geoip2_module.so"
/opt/nginx-1.18.0/objs/ngx_http_geoip2_module.so


创建GeoIP.conf文件,我放在了如下目录

/usr/local/etc

安装geoipupdate

wget https://github.com/maxmind/geoipupdate/releases/download/v4.8.0/geoipupdate_4.8.0_linux_386.tar.gz
tar -zxvf geoipupdate_*
cd geoipupdate_4.8.0_linux_386/

将其安装到/usr/local/bin目录下

cp /opt/geoipupdate_4.8.0_linux_386/geoipupdate /usr/local/bin/
cd /usr/local/share
mkdir GeoIP
geoipupdate -v

刚创建/usr/local/share/GeoIP目录时,里面没有文件的,但是运行geoipupdate之后,文件夹里面多了三个以mmdb结尾的文件

打开nginx的配置文件

vim /usr/local/nginx/conf/nginx.conf


在nginx的配置文件第一行,增加如下代码(加载so文件)

load_module /opt/nginx-1.18.0/objs/ngx_http_geoip2_module.so;

http段添加如下代码,这个mmdb文件填写你自己创建的文件路径:

geoip2 /usr/local/share/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 5m;
    $geoip2_metadata_country_build metadata build_epoch;
    $geoip2_data_country_code default=US  country iso_code;
    $geoip2_data_country_name country names en;
}

server 段添加如下代码,可以通过下方的参考链接查看各国代码

if ($geoip2_data_country_code = "AK") {
    return 403;
}

检查nginx配置文件是否有误

 /usr/local/nginx/sbin/nginx -t

    重启nginx,结果发现被屏蔽无效,排查,原来网站在第一个server段做了http跳转,即用户访问网站的80端口,会被跳转至https(443),我当时把判断写在这个server段下面,肯定是无效的

listen       80;
server_name  www.host.com host.com;
rewrite ^(.*) https://$host$1 permanent;

将其修改添加到监听443端口的server段就可以了。

加入自动更新

crontab -e
0 0 */10 * * /usr/local/bin/geoipupdate

 

参考:

# 关于各国国家代码简写
https://dev.maxmind.com/geoip/legacy/codes