本文介绍使用ngx_http_accesskey_module模块实现(图片等)防盗链的方法,以及如何在Windows系统下编译ngx_http_accesskey_module模块。

在Windows系统下使用ngx_http_accesskey_module模块的前提是你已经会在Windows系统下编译nginx。你可以在本博客中搜索找到nginx的编译方法。

编译需求

  • ngx_http_accesskey_module模块源码,可以在这里这里下载,目前已知的版本是2.0.3
  • openssl源码,其实只使用其中的md5.hsha.h两个头文件,库文件不需引用。
  • nginx源码。

编译方法

  • 下载ngx_http_accesskey_module模块源码,将源码解压到$nginx_source_dir/objs/lib目录下。
  • 解压此文件后,找到ngx_http_accesskey_module下的config文件。编辑此文件,将其中 的$HTTP_ACCESSKEY_MODULE替换为ngx_http_accesskey_module,替换后的文件如下:

    USE_MD5=YES
    USE_SHA1=YES
    ngx_addon_name=ngx_http_accesskey_module
    HTTP_MODULES="$HTTP_MODULES ngx_http_accesskey_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_accesskey_module.c"
  • 因为我使用的是openssl库提供的哈希方法(md5.hsha.h两个头文件),所以需要找到ngx_http_accesskey_module.c文件,将其中的三处NGX_OPENSSL_MD5NGX_HAVE_OPENSSL_SHA1_HNGX_HAVE_OPENSSL_MD5_H注释掉,只需注释对应的#if (xxx)#endif这两行即可。
  • 运行configure脚本(需根据实际情况适当修改):

    $ auto/configure --with-cc=cl --builddir=objs --prefix= --conf-path=conf/nginx.conf --pid-path=logs/nginx.pid --http-log-path=logs/access.log --error-log-path=logs/error.log --sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp --http-proxy-temp-path=temp/proxy_temp --http-fastcgi-temp-path=temp/fastcgi_temp --with-cc-opt="-DFD_SETSIZE=1024 -Ie:/thirdparty_source/libgd-2.2.4/src -IE:/thirdparty_source/nginx/objs/lib/openssl-1.1.0d/include" --with-pcre=objs/lib/pcre-8.40 --with-zlib=objs/lib/zlib-1.2.11 --with-openssl=objs/lib/openssl-1.1.0d --with-select_module --with-http_ssl_module --with-http_image_filter_module --with-ld-opt="E:/thirdparty_source/gdbuild/libgd.lib" --add-module=objs/lib/nginx-accesskey-master
  • 在Visual 2015命令行工具中执行nmake -f objs/Makefile命令完成编译,编译成功后生成nginx.exe文件。

应用

修改$(nginx-dir)/conf/nginx.conf文件,在适当的位置添加如下代码进行测试:

location /imgs {
    root       H:/www;
            
    # 访问链接 http://localhost/imgs/20170214152753.jpg?key=652317989583dd1d61f72901664757a2
    accesskey             on;            # 模块开关 on | off
    accesskey_hashmethod  md5;               # 加密方式 md5 | sha1
    accesskey_arg         "key";        # url中的关键字参数
    accesskey_signature   "mypass$remote_addr";  # pass为干扰码,可自定义修改。此处为mypass和访问IP构成的字符串
}

根据本机IP,使用http://localhost/imgs/20170214152753.jpg?key=652317989583dd1d61f72901664757a2测试,其中key=MD5(mypass+本机真实ip)

但是在实际使用中遇到了一个问题:服务器知道客户端的真实IP,客户端本身不知道服务器获取到客户端的真实IP是什么(有点绕,简单理解就是客户端可能有多个IP,或服务器和客户端之间含有网关或防火墙等)。看来只能通过接口先获取到本机的真实IP,再去请求图片了。

参考教程:
完美的nginx图片防盗链设置详解
Nginx安装配置防盗链模块nginx-accesskey

标签: Windows, nginx, 防盗链

添加新评论