12.13 Nginx防盗链

Nginx防盗链

思路与httpd一样,配置也不难,但要与过期时间、不记录日志配置结合起来

 

1.配置文件内容

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

增加如下配置: location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {     expires 7d;     valid_referers none blocked server_names  *.test.com ;  //定义白名单     if ($invalid_referer) {         return 403;     }                                       //如果不是白名单里就返回403     access_log off; }

最终配置如下图:

6月11日_6月11日 

2.测试语法及重新加载配置

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

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

6月11日_6月11日_02 

3.使用curl测试

测试防盗链,需要增加referer才能正常访问,添加referer-e 需要使用http://

curl -e "http://www.baidu.com/1.txt" -x127.0.0.1:80 -I test.com/1.gif

curl -e "http://www.test.com/1.txt" -x127.0.0.1:80 -I test.com/1.gif

6月11日_linux_03 


http://www.baidu.com/1.txt 不匹配 test.com,所以报403

http://www.test.com/1.txt   匹配 test.com ,所以显示200正常


12.14 Nginx访问控制

Nginx访问控制

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

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

增加如下配置:

location /admin/

{

    allow 172.16.215.130;

    allow 127.0.0.1;

    deny all;

}

最终配置如下图:

6月11日_6月11日_04 

2.测试语法及重新加载配置

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

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

3.使用curl测试

  解释说明:

在配置httpd的时候,还有一个order,来定义先allow还是先deny,在Nginx里并没有,只要匹配规则就结束了,假如来源IP172.16.215.130,它就会从上到下逐一去匹配,第一个IP127.0.0.1)不匹配,第二IP172.16.111.100)不匹配,直到第三行(all)的时候才匹配到,匹配的这条规则为deny(也就是拒绝访问),所以最终会返回一个403的状态码,测试如下:

 curl -e "http://www.baidu.com/1.txt" -x127.0.0.1:80 -I test.com/admin/

 curl -x172.16.215.130:80 -I test.com/admin/    //都规则内的IP

6月11日_linux_05 

 curl -x47.97.163.117:80 -I test.com/admin/     //使用规则外的IP返回403,这个阿里的外网IP

6月11日_6月11日_06 

4.可以匹配正则,限制目录

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

增加如下内容:

location ~ .*(upload|image)/.*\.php$    //匹配upload或者image目录下的.php文件

{

        deny all;                       //匹配upload或者image目录下的.php文件,都不允许访问

}

最终配置如下:

6月11日_6月11日_07 

4.1.测试语法及重新加载配置

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

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

4.2 使用curl测试

upload目录下的.php文件不能访问,但是除了.php的其他后缀文件就能访问。

mkdir /data/wwwroot/test.com/upload

vim /data/wwwroot/test.com/upload/1.php

vim /data/wwwroot/test.com/upload/1.txt

 

curl -x127.0.0.1:80 test.com/upload/1.php //测试访问upload目录返回403

6月11日_linux_08 

curl -x127.0.0.1:80 test.com/upload/1.txt    //访问upload目录下的.txt文件正常

6月11日_6月11日_09 

 cat /tmp/test.com.log    //查看访问日志

6月11日_6月11日_10 

5.根据user_agent限制

如果你的网站不想被人搜到不会被爬虫,就把那些蜘蛛网封掉,像百度,谷歌等把他们封掉,没有任何网站可以爬到你的数据,相当于网站隐藏一样,除非你告诉它网址。

配置文件如下:

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

增加如下配置: if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato') {       return 403; } //deny allreturn 403效果一样

最终保存配置如下图:

6月11日_linux_11 

5.1.测试语法及重新加载配置

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

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

5.2 使用curl测试,-A 模拟user_agent

Tomato是在限制的user_agent名单里,所以不能访问,这里是没有忽略大小,如果要忽略大小写,可在if语句的 ~ 后面加上 *,如:if ($http_user_agent ~*  ‘Spider/3.0|YoudaoBot|Tomato’)

curl -A "Tomatoalsdkflsd" -x127.0.0.1:80 test.com/upload/1.txt -I   //大写开头的user-agent

 curl -A "tomatoalsdkflsd" -x127.0.0.1:80 test.com/upload/1.txt -I   //小写开头的user-agent

6月11日_linux_12 

结果是大写开头的Tonmatoxxx  被限制了,但是小写的没有被限制,这个是严格匹配的

5.3不区分大小写,可在if语句的 ~ 后面加上 *

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

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

{

      return 403;

}

配置如下:

6月11日_6月11日_13 

测试如下:

curl -A "tomatoalsdkflsd" -x127.0.0.1:80 test.com/upload/1.txt -I

6月11日_linux_14 

 12.15 Nginx解析php相关配置


Nginx解析php相关配置

LAMP中,PHP是作为httpd的一个模块出现的,只要PHP模块被加载,那么就能解析PHP脚本了,而在LNMP中,PHP是以一个服务(php-fpm)的形式存在的,首先要启动php-fpm服务,然后Nginx再和php-fpm通信。也就是说,处理PHP脚本解析的工作是由php-fpm处理完成后把结果传递给NginxNginx再把结果返回给用户

1.测试解析,还没增加php解析时先编辑一个php文件,测试是否可以解析php

 vi /data/wwwroot/test.com/3.php    //添加发下内容

<?php phpinfo(); ?>

curl -x127.0.0.1:80 test.com/3.php

6月11日_6月11日_15 

2.修改配置文件

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

增加配置如下: 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;     }

最终配置如下图:

6月11日_linux_16 

3.测试语法及重新加载配置

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

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

4. curl 测试解析是否正常

curl -x127.0.0.1:80 test.com/3.php    //解析成功

6月11日_linux_17 

5.如果我们在虚拟主机配置文件中的sock文件出错则解析时会出现502报错

6月11日_linux_18 

5.1 php-fpm的配置文件中定义.sock文件,及其路径

cat /usr/local/php-fpm/etc/php-fpm.conf

6月11日_linux_19 

如果出现了502报错,先检查一下虚拟主机中添加解析php 配置内容与php-fpm配置两者的sock文件路径是不是一致的

5.2 如果我们的 /usr/local/php-fpm/etc/php-fpm.conf 配置文件中监听的:

不是: listen = /tmp/php-fcgi.sock

而是 listen = 127.0.0.19000 是这种ip+端口

6月11日_6月11日_20 

那么我们在虚拟主机配置文件中解析php配置内容也相应的修改:

6月11日_6月11日_21 

12.16 Nginx代理

Nginx代理

一家公司有很多台服务器,为了节省成本,不能为所有服务器都分配公网IP,而如果一个没有公网IP的服务器提供web服务,就可以通过代理来实现

6月11日_6月11日_22 

1.进入目录新建一个新的配置文件

cd /usr/local/nginx/conf/vhost

vim proxy.conf

增加如下内容:

server {     listen 80;     server_name ask.apelearn.com;     location /     {         proxy_pass      http://121.201.9.155/; //指定要代理的域名所在的服务器IP,即Web服务器的地址         proxy_set_header Host   $host;         proxy_set_header X-Real-IP      $remote_addr;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     } } //这里没有root,因为它是代理服务器,不需要访问本地服务器上的任何文件

最终配置如下图:(通过ping显示最新ask.apelearn.comip地址)

6月11日_6月11日_23 

2.测试语法及重新加载配置

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

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

3.测试 针对蜘蛛的索引的列表,一般网站都会有这个

curl ask.apelearn.com/robots.txt

6月11日_linux_24 

3.1通过本地的IP访问了远程的站点,代理服务器就是我们的虚拟机Web服务器就是我们访问的ask.apelearn.com

curl -x127.0.0.1:80 ask.apelearn.com/robots.txt

6月11日_6月11日_25