四十九、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代理
# 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这个论坛