四十九、Nginx防盗链、Nginx访问控制、Nginx解析PHP相关配置、Nginx代理

一、Nginx防盗链

       必须和“不记录日志和过期时间”结合在一起,因为它们同时用到了location。

# vim /usr/local/nginx/conf/vhost/test.com.conf

location ~* ^.+\.(gif|jpg|png|bmp|swf|jpeg|flv|rar|zip|doc|pdf|gz|bz2|xls)$

{

          expires 7d;    过期时间

          valid_referers none blocked server_names *.test.com;

//定义白名单的referer。

          if ($invalid_referer) {

//如果访问的不是白名单的,就会反馈403。

              return 403;

          }

          access_log off;   访问日志不记录

}

# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload

测试:

# curl -x 127.0.0.1:80 test.com/1.gif -I

HTTP/1.1 200 OK

# curl -x 127.0.0.1:80 test.com/1.jpg -I

HTTP/1.1 200 OK

# curl -e "http://www.baidu.com/1.txt" -x 127.0.0.1:80 test.com/1.jpg -I

HTTP/1.1 403 Forbidden

# curl -e "http://www.test.com/1.txt" -x 127.0.0.1:80 test.com/1.jpg -I

HTTP/1.1 200 OK


referer是test.com时就不会拒绝访问,说明防盗链配置成功了。

核心配置就这三行:

valid_referers none blocked server_names *.test.com;

if ($invalid_referer) {

return 403;       //这里也可以写deny all。


二、Nginx访问控制

需求:访问/admin/目录的请求,只允许某几个IP访问,配置如下:

# vim /usr/local/nginx/conf/vhost/test.com.conf

location /admin/

{

  allow 192.168.93.130;

  allow 127.0.0.1;

  deny all;

}

没有像Apache那样的先allow,再deny这个顺序一说。

Nginx的是只要匹配到这个IP这条规则,就停止了,就不再继续匹配其他规则了,也就不会被deny,所以最终的结果是allow。

所以三条规则中,来源IP只有一条会生效。


针对正则进行匹配:

# vim /usr/local/nginx/conf/vhost/test.com.conf

location ~.*(upload|image)/.*\.php$

{

   deny all;

}

# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload

测试:

# mkdir /data/wwwroot/test.com/upload

# echo "11111" > /data/wwwroot/test.com/upload/1.php

#  echo "11111" > /data/wwwroot/test.com/upload/1.txt

# curl -x 127.0.0.1:80 test.com/upload/1.php -I

HTTP/1.1 403 Forbidden            //直接被拒绝了

# curl -x 127.0.0.1:80 test.com/upload/1.txt -I

HTTP/1.1 200 OK

# cat /tmp/test.com.log

127.0.0.1 - [27/Apr/2018:04:59:16 +0800] test.com "/upload/1.php" 403 "-" "curl/7.29.0"

127.0.0.1 - [27/Apr/2018:05:03:43 +0800] test.com "/upload/1.txt" 200 "-" "curl/7.29.0"

txt可以访问,php禁止了。


根据user_agent限制:

# vim /usr/local/nginx/conf/vhost/test.com.conf

if ($http_user_agent ~* 'Spider/3.0|Youdaobot|Tomato')

{

    return 403;        //deny all和return 403效果一样

}

# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload

$http_user_agent ~*:匹配符后面加个*号就可以忽略大小写。

# curl -A "tomato" -x 127.0.0.1:80 test.com/upload/1.txt -I

HTTP/1.1 403 Forbidden

# curl -A "Tomato" -x 127.0.0.1:80 test.com/upload/1.txt -I

HTTP/1.1 403 Forbidden


三、Nginx解析PHP相关配置

# vim /usr/local/nginx/conf/vhost/test.com.conf

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/php-fcgi.sock;

//当这里写的另外的路径,就会显示502,因为找不到socket。

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;

}

# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload

# vim /data/wwwroot/test.com/2.php

phpinfo();

# curl -x 127.0.0.1:80 test.com/2.php

没有重新加载配置文件之前访问出来的是源代码,加载之后才能解析出来,访问看到的是内容。


   当出现状态码502的时候:要检查这个地方,Nginx和php-fpm所配置的地址是否对应;fastcgi_pass unix:/tmp/php-fcgi.sock;

(一)首先,看一下错误日志,先看这个文件有没有(/tmp/php-cgi.sock),如果没有,然后查看php-fpm.conf文件查看sock是什么,再对应Nginx这边的fastcgi_pass,要对应,不然就会502。

(二)要监听端口

知道监听的是IP和端口,在配置文件中就要做更改

将fastcgi_pass unix:/tmp/php-fcgi.sock;改为:

fastcgi_pass 127.0.0.1:9000;

不然就会502。

# vim /usr/local/php-fpm/etc/php-fpm.conf

listen.mode = 666    读写的权限:666


四、Nginx代理

1.png

# cd /usr/local/nginx/conf/vhost/

[root@MRX vhost]# vim proxy.conf

server

{

   listen 80;

   server_name ask.apelearn.com;

   location /

   {

       proxy_pass      http://121.201.9.155/;   //web服务器地址

       proxy_set_header Host   $host;   //$Host就是server_name

       proxy_set_header X-Real-IP      $remote_addr;

       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   }

}

# /usr/local/nginx/sbin/nginx -t

# /usr/local/nginx/sbin/nginx -s reload

# curl -x 127.0.0.1:80 ask.apelearn.com/robots.txt

此时代理服务器就是我的虚拟机,web服务器就是ask.apelearn.com这个论坛