1 nginx 配置防盗链

防盗链的原理我们在lamp中已经有介绍,这里不再重复,直接看配置过程。 核心语句为

valid_referers none blocked server_names  *.test.com ;
  if ($invalid_referer) {
      return 403;
  }

当然我们要将其放在location里面,结合之前的缓存有效期配置,就形成如下结构

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
     {
          expires      7d;    //针对上面匹配的文件,设置缓存时间为7天
          valid_referers none blocked server_names  *.test.com ;   //指定有效的referer 
          if ($invalid_referer) {
                 return 403;        //  如果是无效的referer,则禁止访问,返回403
          }     
          access_log off;     //针对以上location匹配的文件不记录访问日志
    }     

/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload curl -x127.0.0.1:80 -I -e "http://www.baidu.com/1.txt" test.com/2.jpg curl -x127.0.0.1:80 -I -e "http://test.com/1.txt" test.com/2.jpg

2 访问控制

需求一,针对admin目录做一个访问限制,只允许本机127.0.0.1访问,拒绝其他所有ip。配置如下

location /admin/
{ allow 127.0.0.1;
 deny all;
}

我们先来看下他的逻辑,在apache中,有一个 order ,会定义deny和allow的一个先后执行顺序,而且每条规则都会去匹配。比如针对当前这个需求配置时这样的

 <Directory /data/wwwroot/www.123.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Directory>

若果将上面改为Order allow,deny 则会deny 所有,allow 语句失效。在nginx 里面从上往下只要匹配到规则就结束。第一条规则匹配到就不会去匹配第二条规则。

curl -x127.0.0.1:80 test.com/admin/index.html
curl -x192.168.226.130:80 test.com/admin/index.html

其中 192.168.226.130 是本机ens33 网卡ip 如果只限制个别ip 访问则可以写成

location /admin/
{  
 	deny 192.168.226.130;
 }

默认是允许所有的。不需要写allow all 了 也可以匹配正则限制

location ~ .*(upload|image)/.*\.php$
{
        deny all;
}

这样就拒绝请求了upload或者image目录下的php文件 备注:该段配置要加在解析php的配置前面,否则不能限制解析php 限制指定use_agent的域名访问,匹配符~后面的*可以忽略大小写匹配

if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')
{
      return 403;
}
curl -x127.0.0.1:80 test.com -A "spider/3.0"

意思是限制一些爬虫,或者有道机器人,或者tomato相关的访问。就是可以有针对性的限制某些访问。

3 解析php 配置

location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
    }

fastcgi_pass unix:/tmp/php-fcgi.sock; 该行指定监听php-fpm的socket,可以是ip加端口的形式,写法要和php-fpm配置文件保持一致。对应行为 listen = /tmp/php-fcgi.sock。配置文件为 /usr/local/php-fpm/etc/php-fpm.conf,我们安装php时有指定配置文件路径。 fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;该行中的 /data/wwwroot/test.com 要跟虚拟主机保持一致 vim /data/wwwroot/test.com/2.php 写入一下内容

<?php
echo "a really php script";
?>

执行-s reload 后curl 测试 curl -x127.0.0.1:80 test.com/2.php

4 nginx 代理

代理服务器: 通常说的代理就是正向代理,正向代理的过程隐藏了真实的客户端,服务端不知道真实的客户端是谁。反向代理代理的是服务端,隐藏了真实的服务端。 正向代理中,proxy和client同属一个LAN 反向代理中,proxy和server同属一个LAN 编辑一个新的虚拟主机

vim /usr/local/nginx/conf/vhost/proxy.conf
 server
{
    listen 80;
    server_name proxybaidu.com; //本地代理服务器器域名

    location /
    {
        proxy_pass      http://61.135.169.125/;  //被代理的服务器ip
        proxy_set_header Host www.baidu.com; //指定被代理的服务器域名
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
curl -x127.0.0.1:80 proxybaidu.com

我们发现通过本地内网访问到了百度首页。为了理解代理,特意将代理服务器域名重命名了下,通常代理服务器域名会写的和提供网站资源的服务器域名一样,这样对于客户端来说就不会去区分,省去很多麻烦。百度这个ip 我们通过ping www.baidu.com 来获取。 总结:上面实验就是一个反向代理。怎么理解反响代理隐藏服务端,代理服务器和真实服务端处于同一子网呢?该实验我将proxybaidu.com更改为baidu.com,然后在windos 主机上设置本地dns ,再去访问百度,完全看不出来是从我的虚拟机web中取的数据,因此隐藏了服务端。那么为什么说我的虚拟机web 和百度处于同一子网呢,回答这个问题之前,我先说下很关键的一点,就是我们所说的服务器和客户端,局域网和公网,或者同一子网都是相对意义上的概念,单独讨论没有意义。-x127.0.0.1:80 就是指定本地私网,对于该回环地址来说,因为我们的虚拟机 nat 到了主机所处的公网里,所以从整体上看来我们的虚拟机web 和百度是处于同一子网的。