12.13 Nginx防盗链
•配置如下,可以和不记录日志和过期时间配置结合起来
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 ;
#这里定义.test.com为白名单
if ($invalid_referer) {
return 403;
#这里表示如果不在白名单内直接回馈403
}
access_log off;
}
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -I -e "http://www.baidu.com/1.txt" -x127.0.0.1:80 test.com/1.gif 显示403
curl -I -e "http://www.test.com/1.txt" -x127.0.0.1:80 test.com/1.gif 显示200
说明配置成功
12.14 Nginx访问控制
限制某些ip不能访问,或者只允许一部分访问
需要制作白名单,先allow写ip地址,再把其他ip全部限制deny all
配置如下:
location /admin/
{
allow 192.168.153.130;
allow 127.0.0.1;
deny all;
}
创建location指定的目录
• mkdir /data/wwwroot/test.com/admin/ (已经有了这个文件夹不用再建了)
• echo “test,test”>/data/wwwroot/test.com/admin/1.html
• -t && -s reload
• curl -x127.0.0.1:80 test.com/admin/1.html -I
• curl -x192.168.204.131:80 test.com/admin/1.html -I 这两个ip都可以访问到
上面配置ip也可以是ip段,就可以写成allow 192.168.153.0/24
如果只拒绝几个ip的访问就是
location /admin/
{
deny 192.168.188.1;
deny 192.168.8.8;
}
• 可以匹配正则来限制
网站被黑,数据库被盗窃,没有禁止上传图片的php解析
这样可以把访问的URL中带有abc或者image的字符串,并且为php请求的拒绝访问
location ~ .*(abc|image)/.*.php$
{
deny all;
}
测试:
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
mkdir /data/wwwroot/test.com/abc
echo "111" > /data/wwwroot/test.com/abc/1.php
curl -x127.0.0.1:80 test.com/abc/1.php -I
结果为403拒绝访问
echo "111" > /data/wwwroot/test.com/abc/1.txt
curl -x127.0.0.1:80 test.com/abc/1.php -I
结果200可以访问,实验成功,禁止了abc的php解析
•根据user_agent限制,用的很多
需求:受到cc攻击,要禁掉百度蜘蛛,想做被隐藏的网站
if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
return 403;
}
这里~指匹配符号,只要有Spider/3.0或YoudaoBot或Tomato字符串的直接被拒绝,返回403
• deny all和return 403效果一样
实验:
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
模拟user_agent的方法:
-A 随意指定自己这次访问所宣称的自己的浏览器信息
curl -A “Tomatoabcabcabc”-x127.0.0.1:80 test.com/abc/1.txt
显示为403拒绝访问
如果关键词大小写有改动就恢复200,需要忽略大小写就~*(~后面加*)
12.15 Nginx解析php相关配置
•vim /usr/local/nginx/conf/vhost/test.com.conf配置如下:
location ~ .php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock; (此处错误出现502,找不到sock)
#fastcgi_pass 127.0.0.1:9000
#fastcgi_pass 两种监听格式,但是要保证Nginx和php-fpm中格式一致
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
#这里的地址和最上面的root保持一致
}
• fastcgi_pass 用来指定php-fpm监听的地址或者socket
• php文件目录usr/local/php-fpm/var/php-fpm.log中sock地址要写到虚拟主机配置文件fastcgi_pass中
不监听sock换成监听ip和端口,两个配置文件修改后保持一致否则502,需要重启
netstart -lntp 查看监听端口
测试:
vim /data/wwwroot/test.com/3.php
写入<?php phpinfo();
curl -x127.0.0.1:80 test.com/3.php 出现不能解析
配置后再次curl可以解析
502报错问题:
检查虚拟主机配置文件sock和php文件目录定义的sock是否一致
修改fastcgi_pass后报错502
nginx错误日志:cat /usr/local/nginx/logs/nginx_error.log
vim /usr/local/php-fpm/etc/php-fpm.conf 查看php文件目录定义的sock
修改为监听ip端口
查看端口是否监听
然后去修改虚拟主机配置文件
两边配置文件修改完成,这时curl -x127.0.0.1:80 test.com/3.php解析成功
此外502还有一种可能,php-fpm资源耗尽,查询很慢,解决为优化
12.16 Nginx代理
用户需要访问web服务器,需要找一个中间者,中间者与两面都互通,就能做一个代理者
中国到美国很慢,到香港快,香港到美国快,就可以通过香港代理访问美国服务器
创建新的配置文件
该虚拟主机只用作代理服务器,不需要访问本地文件,所以不需要设置站点根目录
• 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/;
#这里是告诉Nginx代理服务器,真正要被访问的web服务器ip是多少
proxy_set_header Host $host;
#Host指的是要访问的域名servername,就是代理服务器真正访问的域名ask.apelearn.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 ask.apelearn.com/robots.tx
显示为404
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 ask.apelearn.com/robots.txt
显示成功
这里测试是指通过本地ip访问到远程站点,这里设置的代理服务器是虚拟机,web服务器是阿铭论坛
出现代理需求就定义远程服务端,就是web服务器的ip
扩展
http://ask.apelearn.com/question/9109502问题汇总
http://blog.lishiming.net/?p=100location优先级