如何部署具有CDN功能的Nginx模块?

CDN技术

1 Nginx的geoip模块

1.1 模块名称

ngx_http_geoip_module

1.2 模块指令

– geoip_country
– geoip_city
– geoip_proxy
– geoip_proxy_recursive

1.2.1 geoip_country指令

1.2.1.1 指令的使用

语 法:geoip_country file;
默认值:-
上下文:http
注:该指令会根据客户端IP地址确认国家

1.2.1.2 改指令支持的变量

$geoip_country_code
以上变量值是根据客户端IP地址计算出国家的代码(双字母)
例如,”CN”,”RU”,”US”

$geoip_country_code3
以上变量值是根据客户端IP地址计算出国家的代码(三字母)
例如,”CHN”,”RUS”,”USA”

$geoip_country_name
以上变量值是根据客户端IP地址计算出国名
例如,”China”,”Russian Federation”,”United States”

1.2.2 geoip_city指令

1.2.2.1 指令的使用

语 法:geoip_city file;
默认值:-
上下文:http
注:该指令会是根据客户端IP地址确认国家,地区和城市

1.2.2.2 改指令支持的变量

$geoip_area_code
以上变量值是根据客户端IP地址计算出电话区号(仅限美国)
注:已经过期,不建议使用

$geoip_city_continent_code
以上变量值是根据客户端IP地址计算出大陆代码(continent code)
例如,”AS”,”EU”,”NA”

$geoip_city_country_code
以上变量值是根据客户端IP地址计算出国家的代码(双字母)
例如,”CN”,”RU”,”US”

$geoip_city_country_code3
以上变量值是根据客户端IP地址计算出国家的代码(三字母)
例如,”CHN”,”RUS”,”USA”

$geoip_city_country_name
以上变量值是根据客户端IP地址计算出国名
例如,”China”,”Russian Federation”,”United States”

$geoip_dma_code
以上变量值是根据客户端IP地址计算出Google AdWords API中的地理位置(DMA地区代码,也称城市代码)
例如,”Dongguan”

$geoip_latitude
以上变量值是根据客户端IP地址计算出纬度

$geoip_longitude
以上变量值是根据客户端IP地址计算出经度

$geoip_region
以上变量值是根据客户端IP地址计算出国家地区代码(两个符号)
例如,”48″,”DC”

$geoip_region_name
以上变量值是根据客户端IP地址计算出国家地区名称
例如,”Moscow City”,”District of Columbia”

$geoip_city
以上变量值是根据客户端IP地址计算出城市名称
例如,”Dongguan”,”Moscow”,”Washington”

$geoip_postal_code
以上变量值是根据客户端IP地址计算出邮政编码

1.2.3 geoip_org指令

1.2.3.1 指令的使用

语 法:geoip_org file;
默认值:-
上下文:http
支持版:1.0.3版
注:该指令会是根据客户端IP地址确认组织

1.2.3.2 改指令支持的变量

$geoip_org
以上变量值是根据客户端IP地址计算出组织名称
例如,“The University of Melbourne”

1.2.4 geoip_proxy指令

1.2.4.1 指令的使用

语 法:geoip_proxy address | CIDR;
默认值:-
上下文:http
支持版:1.3.0和1.2.1版
– 适合使用代理的环境
– 当请求的客户端来自一台可信的代理服务器IP地址时
– 地址重”X-Forwarded-For”取得真实的客户端IP地址

1.2.5 geoip_proxy_recursive指令

1.2.5.1 指令的使用

语 法:geoip_proxy_recursive on | off;
默认值:-
上下文:http
支持版:1.3.0和1.2.1版
– 禁用递归,则使用”X-Forwarded-For”发送的最后地址
– 启用递归,则使用”X-Forwarded-For”发送的不可信最后地址

2 安装配置Nginx

2.1 基础配置

2.1.1 环境信息

IP Address=10.168.0.51
HostName=geoip.cmdschool.org
OS=CentOS 7.3

配置geoip自动更新服务
https://www.cmdschool.org/archives/1034

2.1.2 yum源配置

yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2.1.3 安装相关包

yum install -y nginx-module-geoip

2.1.4 启动并配置自启用

systemctl start nginx
systemctl enable nginx

2.2 启用模块

2.2.1 配置文件加载模块

vim /etc/nginx/nginx.conf

加入load_module行:

[...]
load_module /usr/lib64/nginx/modules/ngx_http_geoip_module.so;
[...]
http {
     [...]
}

2.2.2 测试配置

nginx -t

2.2.3 重启使模块生效

systemctl restart nginx

2.3 加载GeoIP库

2.3.1 修改配置文件

vim /etc/nginx/conf.d/www.cmdschool.org.conf

加入如下配置:

geoip_country /data/geoip/GeoLiteCountry.dat;
geoip_city /data/geoip/GeoLiteCity.dat;

server {
    listen       80;
    server_name  www.cmdschool.org;

    location / {
        root   /var/www/www.cmdschool.org;
        index  index.html index.htm  index.php;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    if ( $geoip_city_country_code ~* HK ){
        return 301 http://hk.cmdschool.org$request_uri;
        break;
    }

    if ( $geoip_country_code ~* CN ){
        return 301 http://cn.cmdschool.org$request_uri;
        break;
    }

    if ( $geoip_country_code ~* US ){
        return 301 http://us.cmdschool.org$request_uri;
        break;
    }
}

注:如果没有适配的跳转,则默认访问到,
http://www.cmdschool.org

2.3.1 重启使配置生效

systemctl restart nginx

注:请根据实际需求选取合适的变量做判断,此处不再累述。

2.3.2 测试访问

使用不同地区的浏览器访问,
http://www.cmdschool.org

如果你的客户端的IP地址是中国的IP,页面会跳转到,
http://cn.cmdschool.org

参阅文档:
===============================
官方模块文档
———–
http://nginx.org/en/docs/http/ngx_http_geoip_module.html#example

使用范例参考
———–
http://blog.51cto.com/laoxu/1414561

国家名称或地区参考
—————-
https://developers.google.com/adwords/api/docs/appendix/geotargeting#dma

没有评论

发表回复

Nginx
如何使用Nginx发布维护公告?

1 前言 一个问题,一篇文章,一出故事。 最近由于需要发布维护公告,想着这种东西以后用得着,于是总结 …

Nginx
如何实现Nginx第一次访问跳转?

1 前言 一个问题,一篇文章,一出故事。 笔者在NextCloud生产环境中需要实现首次登录显示公告 …

Nginx
如何实现Nginx首次访问跳转?

1 前言 一个问题,一篇文章,一出故事。 笔者在NextCloud生产环境中需要实现首次登录显示公告 …