Nginx之旅-secure_link模块作用原理

作用:

  1. 指定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问
  2. 限制链接生效周期(资源有有效期)

配置语法

1
2
3
Syntax:	secure_link expression;
Default: —
Context: http, server, location
1
2
3
Syntax:	secure_link_md5 expression;
Default: —
Context: http, server, location

我们看下secure_link_md5的验证:

DotKCd.png

当用户点击下载按钮之后,发送一个请求到服务端,服务端生成一个具有一串密钥和过期时间的地址返回给客户端。客户端重新发起请求后会校验md5和过期时间。然后做出一系列操作。

DotHaD.png

对于md5的加密我们可以指定和远程IP或请求路径等以及我们准备好的一个密钥进行加密。服务端保存这个密钥。验证的时候会在Nginx进行验证。

secure_link模块实现请求资源验证

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 80;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
root /opt/app/code;

location / {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri imooc";

# 当匹配成功的时候 secure_link 是非空非0的

# 没有匹配到返回 ""
if ($secure_link = "") {
return 403;
}

# 没有匹配到返回0
if ($secure_link = "0") {
return 410;
}
}
}

secure_link $arg_md5,$arg_expires;这一行表示获取到请求链接的md5expires这两个参数的值。

secure_link_md5 "$secure_link_expires$uri imooc"; 表示使用secure_link_expires uriimooc(这个imooc就是密钥)进行加密和上面获取到的的数据比较。

具体生成链接请参考老师的脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh
#
#Auth:Jeson@imoocc.com
servername="jeson.t.imooc.io"
download_file="/download/file.img"
time_num=$(date -d "2019-1-18 00:00:00" +%s)
secret_num="imooc" # 进行加密的密钥 和 Nginx的保持一致

res=$(echo -n "${time_num}${download_file} ${secret_num}"|openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =)

echo "http://${servername}${download_file}?md5=${res}&expires=${time_num}"

这样我们就可以对资源进行更安全的权限控制。

Geoip读取地域信息

基于IP地址匹配MaxMind GeoIP二进制文件,读取IP所在地域信息。

场景:

一、区别国内外做HTTP访问规则:如果有两台服务器国内,和国外一台,国内用户访问国内服务器,国外用户访问国外服务器,访问不同的资源。

二、区别国内城市地域做HTTP访问规则。(因为有城市对应的编码信息)

我们要安装对应的库

1
[root@hongshaorou nginx]# yum install nginx-module-geoip -y

安装模块存在/etc/nginx/modules

1
2
3
4
5
6
7
[root@xiaoyang modules]# pwd
/etc/nginx/modules
[root@xiaoyang modules]# ls | grep geo
ngx_http_geoip_module-debug.so
ngx_http_geoip_module.so
ngx_stream_geoip_module-debug.so
ngx_stream_geoip_module.so
1
2
3
# 编辑nginx.conf文件,加载该模块,加入配置 因为不是默认编辑进去的 所以要主动load进来
load_module "modules/ngx_http_geoip_module.so";
load_module "modules/ngx_stream_geoip_module.so";

下载maxmind文件库

1
2
3
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

解压

1
gunzip GeoIP.dat.gz GeoLiteCity.dat.gz

conf.d目录下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 上面解压的目录
geoip_country /etc/nginx/geoip/GeoIP.dat;
geoip_city /etc/nginx/geoip/GeoLiteCity.dat;

server {
listen 80;
server_name localhost;

# 只允许国内用户访问
location / {
if ($geoip_country_code != CN) {
return 403;
}
root /usr/share/nginx/html;
index index.html index.htm;
}

# 显示出自己的公网IP 国家名字 代码 城市
location /myip {
default_type text/plain;
return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
}

}

我们浏览器访问获取到自己的IP国家信息
Dowmp4.png

期待以后工作能用到 😊

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!