Nginx和nginx-http-access模块防盗链配置与使用

此篇文章是关于nginx-http-access模块的延伸内容,就如何安装与配置nginx-accesskey防盗链进行了详细的说明,nginx.conf的配置文件也可做为参考,nginx下载认证的配置与使用供大家研究学习与借鉴。

注意:此文整理于互联网,未经过实际的安装测试,所以难免会有错误,如你在阅读本文并在测试的过程中遇到问题,欢迎至风信网官方以下地址进行反馈(http://www.ithov.com/member/article_add.php),我们将与您一起寻找正确的答案。

安装Nginx和nginx-http-access模块
#tar zxvf nginx-0.7.61.tar.gz
#cd nginx-0.7.61/
#tar xvfz nginx-accesskey-2.0.3.tar.gz
#cd nginx-accesskey-2.0.3
#vi config
#把HTTP_MODULES="$HTTP_MODULES $HTTP_ACCESSKEY_MODULE" 修改成HTTP_MODULES="$HTTP_MODULES ngx_http_accesskey_module" (这是此模块的一个bug)
#./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx-accesskey-2.0.3
#make && make install
#cd ../

修改Nginx日志目录权限
#chmod +w /logs
#chown -R www:www /logs
创建Nginx配置文件
在/usr/local/nginx/conf/目录中创建nginx.conf文件:
#rm -f /usr/local/nginx/conf/nginx.conf
#vi    /usr/local/nginx/conf/nginx.conf

输入以下内容:
user  www www;
worker_processes 8;
error_log  /usr/local/nginx/logs/nginx_error.log  crit;
pid        /usr/local/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
  use epoll;
  worker_connections 51200;
}
http
{
  include       mime.types;
  default_type  application/octet-stream;
  #charset  gb2312;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;
  sendfile on;
  tcp_nopush     on;
  keepalive_timeout 60;
  tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
  #limit_zone  crawler  $binary_remote_addr  10m;
  server
  {
    listen       80;
    server_name  www.ithov.com;
    index index.html index.htm index.php;
    if (-d $request_filename)
      {
            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
      }
    root  /www/htdocs/vmall_shop;
    #limit_conn   crawler  20;
    location ~ .*\.(php|php5)?$
    {
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
      expires      30d;
    }
    location ~ .*\.(js|css)?$
    {
      expires      1h;
    }
    location /shop
    {
   accesskey             on;
   accesskey_hashmethod   md5;
   accesskey_arg         "key";
   accesskey_signature   "ithov.com$remote_addr";
   error_page 403 = http://192.168.1.24/error.php;
    }
    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
    access_log  /logs/access.log  access;
      }
  server
  {
    listen       80;
    server_name  mantis.ithov.com.com;
    index index.html index.htm index.php;
    if (-d $request_filename)
      {
            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
      }
    root  /www/htdocs/mantis;
    location ~ .*\.(php|php5)?$
    {
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }
    log_format  wwwlogs  '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
    access_log  /logs/wwwlogs.log  wwwlogs;
  }
  server
  {
    listen  80;
    server_name  status.ithov.com.com;
    location / {
    stub_status on;
    access_log   off;
    }
  }
}

在/usr/local/nginx/conf/目录中创建fcgi.conf文件:
#vi /usr/local/nginx/conf/fcgi.conf
输入以下内容:
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
启动Nginx
#ulimit -SHn 51200
#/usr/local/nginx/sbin/nginx

配置开机自动启动Nginx + PHP
#vi /etc/rc.local
在末尾增加以下内容:
#php nginx start
ulimit -SHn 51200
/usr/local/php/sbin/php-fpm start
/usr/local/nginx/sbin/nginx

优化nginx配置:(此步骤已经做好,以下做法仅作参考资料存在)
#vi /usr/local/nginx/conf/nginx.conf
nginx默认是不允许列出整个目录的,如需此功能在location server 或 http段中加入
autoindex on;
另外两个参数最好也加上去
autoindex_exact_size off; 
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间。
在以下位置处加入代码解决nginx无法访问二级目录的问题
server
  {
    listen       80;
    server_name  ithov.com;
    index index.html index.htm index.php;
//////// 加入的正则开始/////////
    if (-d $request_filename)
      {
            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
      }
//////// 加入的正则结束////////
    root  /www/htdocs/test;
    #limit_conn   crawler  20;
    location ~ .*\.(php|php5)?$
    {
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
      expires      30d;
    }
    location ~ .*\.(js|css)?$
    {
      expires      1h;
    }
    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
    access_log  /www/logs/access.log  access;
  }
nginx下载认证的配置:
开发者:  OWOX project   http://www.owoxengine.com/
配置方法
 
需要在nginx的配置文件里面添加:
location /data/shop
{
   accesskey               on;
   accesskey_hashmethod   md5;
   accesskey_arg         "key";
   accesskey_signature   "ithov.com$remote_addr";
   error_page 403 = http://www.ithov.com.com/?tips=download_not_permit;
}
语法解释:
accesskey [on|off]
默认是off。
用 on 开启这个功能。
accesskey_arg "key"
默认是 key,就是用于http://example.com/download/file.zip?key=09093abeac094 里面的 key。
如果使用 accesskey_arg "string"
要下载就应该是 http://example.com/download/file.zip?string=09093abeac094
 
accesskey_hashmethod [md5|sha1]
默认是 md5.
这里是选择哈希的类型,随便用哪个都可以,不过在生成下载URL的时候需要使用相应的哈希方法
 
accesskey_signature "string"
默认是accesskey_signature "$remote_addr"
这里是被签名(哈希)的字符串。
$remote_addr 表示用户的 ip。
为了很好的防盗链,这里应该给用户ip加上噪声。让别人无法猜到。
比如accesskey_signature " myPassWord $remote_addr"
生成下载URI 的方法:
Nginx参考配置:
location /data/shop
{
   accesskey               on;
   accesskey_hashmethod   md5;
   accesskey_arg         "key";
   accesskey_signature   "ithov.com$remote_addr";
   error_page 403 = http://www.ithov.com.com/?tips=download_not_permit;
}
PHP参考代码:
function get_download_url($url)
{
   $secret = "ithov.com";
   //注意,需要考虑部署在代理后端的情况,获取的IP如果和下载服务器获取的不一致,那会导致地址失败
   $m = md5($secret.$_SERVER['REMOTE_ADDR']);
   return $url."?key=".$m;
}
按照以上的设置,shop文件夹下所有的压缩包如果用地址直接引用,
比如http://www.ithov.com.com/shop/test.rar,都会提示403错误,
无法访问到资源,这也就是我们说的防盗链功能已经生效。
那么要如何才能让我们的目标用户下载这些文件呢?方法就是我们要给用户一个正确的链接,
形如http://www.ithov.com.com/shop ... 3b5423523952352bg2g
这个key后面的参数是根据前面设定的accesskey_hashmethod和accesskey_signature确定的,
比如我们前面的设定就是对password$remote_addr($remote_addr代表客户端传递过来的IP)的值进行MD5加密运算得到的结果。
我们要把带有key值的地址重新定向给目标用户,这样我们的目标用户才能下载到资源,没有key或者key值错误,
都将被认为是盗链,而无法下载。
下面我们用PHP脚本的header重定向函数举例说明:
<?php
//其他代码省略
//header函数实现重定向
header("location:http://www.ithov.com.com/shop/test.rar?key=".md5("password".$_SERVER['REMOTE_ADDR']));
这样用户就能顺利访问到含有正确key值的资源了。
最后提一句,要实现真正的深度防盗链,需要有冗余备份防盗链措施辅助,比如你可以即使用传统的判断referer的防盗链,
再结合accesskey模块,那么大约能够保证万无一失了.

key加密方法:
给这个字符串md5加密"123443555$remote_addr"    //密钥字符串,变量$remote_addr是客户端ip地址
生成的加密串是32位小写的:7f938c21e8669463a881d4b6509b8c04
关于资源加密和防盗链:
正常的资源真实地址http://www.xxx.com/x/x.rar  这个直接下是非法的会被拒绝
用户要在网站点击下载某个文件的时候程序自动生成一个key,然后给他一个下载链接,他用这个连接就能合法下载了
http://www.xxx.com/x/x.rar?key=7f938c21e8669463a881d4b6509b8c04
每个客户每次下载的时候都要生成一次这个key 
当他下完把这个链接复制给别人或者发布到其它网站的时候 因为ip不同别人就下不了

时间: 2025-01-24 12:17:01

Nginx和nginx-http-access模块防盗链配置与使用的相关文章

nginx rewrite重写规则与防盗链配置方法教程详解_nginx

导读:nginx rewrite重写规则与防盗链配置方法,rewrite规则格式中flag标记的几种形式,盗链时返回403错误,允许的域名直接跟在第二行的域名后面. nginx rewrite重写规则与防盗链配置方法如下所示: nginx rewite 规则,官方文档:http://wiki.nginx.org/NginxHttpRewriteModule nginx rewrite规则格式:rewrite regex replacement flag flag标记有四种格式: last – 相

Nginx和Apache几种防盗链配置方法实例_nginx

要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫 referer,采用URL的格式来表示从哪儿链接到当前的网页或文件.换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源 文件,则可以跟踪到显示它的网页地址.有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返 回指定的页面. Nginx防盗链的配置 1.nginx针对文件类型的防盗链配置

Apache 防盗链配置详解介绍

apache防盗链最常用的配置一种是在服务器中进行配置,另一种是在.htaccess 中进行配置,两种语法与效果完全相同. Apache 防盗链的第一种实现方法,可以用 rewrite 实现.首先要确认 Apache 的 rewrite module 可用:能够控制 Apache httpd.conf 文件的,打开 httpd.conf,确保有这么一行配置:  代码如下 复制代码 LoadModule rewrite_module modules/mod_rewrite.so .htaccess

Apache图片防盗链配置方法介绍(可用.htaccess)

图片防盗链配置规则很简单 RewriteRule .*.(gif|jpg|swf|png) 说明一下其中的R.NC 和 L R 就是转向的意思 NC 指的是不区分大小写 L 的作用是指明本次转向到此结束,后续的转向不受先前判断语句的影响 5.防止 盗链的文件类型 上例中是 gif.jpg.png,而根据须要 ,可修改 或添加其他文件类型,如rar.mov等,不同文件扩展名间运用 ""分割. 使用 rewrite 技术实现 Apache 防盗链 Apache 防盗链的第一种实现方法,可以

Nginx防盗链配置具体方法详解

一:一般的防盗链如下:  代码如下 复制代码 location ~* .(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.111cn.net ; if ($invalid_referer) { rewrite ^/ http://www.111cn.net; #return 404; } } 第一行:gif|jpg|png|swf|flv 表示对gif.jpg.png.swf.flv后缀的文件实行防盗链 第二行: 表示对www.in

Nginx图片防盗链配置实例_nginx

做运维的朋友经常会有一些烦恼,比如网站总是被人抄袭,比如网站总是被人引用上面的图片,虽然一张图两张图,并不耗费很多流量,但一旦引用的人多了,这个还是比较废流量的. 防盗链就是禁止其他网站引用自己网站资源而做的一系列设置,优点就不需要说了,绝多数就是防止资源浪费,特别是有宽带.流量限制的空间如果不做一些 限制可能就光引用自己网站图片.视频等等资源可能会消耗很大一部分流量.本文就简单的说一下在nginx服务器上如何做防盗链设置. nginx防盗链代码 第1步:下载nginx网站配置文件. 有些网友可

服务器防盗链配置方法详解(apache/nginx)

nginx防盗链 1. 修改nginx配置文件,屏蔽指定文件的站外盗链:  代码如下 复制代码 location ~ .*.(gif|jpg|jpeg|png|bmp|swf|mp3)$     {       valid_referers none blocked server_names *.111cn.net;       if ($invalid_referer) {return 403;}       expires      30d;     } 第一行:设置防盗链类型为gif|jp

Apache中.htaccess 防盗链配置方法

先我们apache如果没有开启支持.htaccess , 可如下操作 开httpd.conf文件用文本编辑器打开后,查找  代码如下 复制代码 Options FollowSymLinks AllowOverride None 改为: Options FollowSymLinks AllowOverride All   可是我在我的httpd.conf文件里根本没有发现Options FollowSymLinks 之类的东西.我只好将  代码如下 复制代码   Options FollowSym

apache 防盗链配置方法

修改httpd.conf 找到 <Dirctory "/var/www/html"> 在这个Dirctory容器内添加:  代码如下 复制代码 SetEnvIfNoCase Referer "^http://www.111cn.net/" local_ref=1 <FilesMatch ".(JPG|jpg)">    Order Allow,Deny    Allow from all    Deny from env=