前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx防盗链,Nginx访问控制,,Nginx解析php相关配置,Nginx代理

Nginx防盗链,Nginx访问控制,,Nginx解析php相关配置,Nginx代理

作者头像
端碗吹水
发布2020-09-23 10:55:41
1.8K0
发布2020-09-23 10:55:41
举报

笔记内容:

  • 12.13 Nginx防盗链
  • 12.14 Nginx访问控制
  • 12.15 Nginx解析php相关配置
  • 12.16 Nginx代理

笔记日期:2017-10-23

12.13 Nginx防盗链

2641
2641

编辑虚拟主机配置文件:

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;

   }

   access_log off;

}

2642
2642

保存退出后,重新加载配置文件:

2643
2643

使用curl命令测试一下防盗链,状态码为403代表成功:

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

2644
2644

然后测试一下白名单内的域名是否能够进行访问,状态码为200代表成功:

2645
2645

12.14 Nginx访问控制

2646
2646

编辑虚拟主机配置文件:

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

增加以下内容:

location /admin/

{

   allow 192.168.133.1;

   allow 127.0.0.1;

   deny all;

}

2647
2647

和Apache不一样,Nginx没有order来定义顺序,也就是说在Nginx是直接进行匹配的,匹配到相应的规则就会结束,后面的就不再进行匹配了,没有顺序之说。

接下来测试一下,先创建admin目录:

mkdir /data/wwwroot/test.com/admin/

然后进行访问:

curl -x127.0.0.1:80 test.com/admin/ -I

curl -x192.168.77.130:80 test.com/admin/ -I

状态码为200,则代表成功了。

2648
2648

还可以使用正则进行匹配,把能上传的目录都进行限制:

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

{

       deny all;

}

2649
2649

创建upload目录:

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

创建一个php文件:

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

访问upload下的1.php,状态码为403代表成功:

curl -x127.0.0.1:80 -I test.com/upload/1.php

2650
2650

再创建一个txt文件:

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

访问upload下的1.txt,状态码为200代表成功:

2652
2652

因为txt不在匹配范围内。

还可以根据user_agent来进行限制,可以让网站不被搜索引擎搜索到,能做到隐藏网站的效果:

编辑配置文件,增加以下内容:

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

{

     return 403;

}

deny all和return 403效果是一样的。

配置完后测试一下,-A 选项可以自定义user_agent,状态码为403代表成功:

2653
2653

使用没有被配置内容匹配的user_agent才能进行访问,只要被匹配的一概被拒绝掉:

2654
2654

想要不区分大小写匹配的话,在~后面加个*就可以了:

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

{

     return 403;

}

12.15 Nginx解析php相关配置

2655
2655

现在test.com还不可能够解析php,我们可以测试一下:

  1. 创建一个php文件:

vim /data/wwwroot/test.com/3.php

  1. 文件内容如下:

<?php

phpinfo();

?>

3.访问php文件,可以看到没有解析,显示的是源码:

2656
2656

想要支持php解析,需要进行以下几步操作:

1.编辑虚拟主机配置文件:

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

2.增加以下内容:

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;

   }

2657
2657

重新加载配置文件之后再次进行访问,然后会输出一堆html源码而不是输出php源码就代表能够解析了,如果是在浏览器上访问就能解析这些html源码呈现出页面:

2658
2658

如果你配置文件里的socket文件的名称写错了的话,就会出现502状态码:

2659
2659

然后再访问3.php就会出现502状态码:

2660
2660

遇到这种问题就要查看错误日志里的信息是什么,根据日志信息去解决错误:

错误日志的存放路径可以在你Nginx的主配置文件里查看:

2661
2661

知道错误日志的存放路径后,查看一下错误日志:

tail /usr/local/nginx/logs/nginx_error.log

2662
2662

以上是其中一种出现502状态码的情况,还有一种情况就是php-fpm服务监听的是IP和端口,但是却在配置文件里配置去访问sock文件,这样也会出现502错误:

例如我现在将php换成监听IP的形式:

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

2663
2663

然后重新加载一下:

/usr/local/php-fpm/sbin/php-fpm -reload

查看一下端口有没有被监听:

2664
2664

接着我把虚拟主机配置文件里的sock文件名称修改正确,再访问一下,依然是502:

2665
2665

这是因为php-fpm里监听的是IP不是sock文件,而Nginx虚拟主机配置文件里配置的却是sock文件,自然会发生这种错误。

同样的错误日志里也是提示文件不存在,因为php-fpm没有生成这个文件:

2666
2666

现在我们修改一下虚拟主机配置文件里的配置内容:

2667
2667

重新加载配置文件后再进行访问,同样的输出一堆的html源码代表没问题了:

2668
2668

除以上这两种常见的502错误情况外,还有一种情况就是php监听的sock文件,但是却没有定义listen.mode的文件权限,如果不定义的话默认权限是440。例如我把listen.mode那行配置注释掉:

2669
2669

然后重新加载一下配置文件并重启:

/usr/local/php-fpm/sbin/php-fpm -t

/usr/local/php-fpm/sbin/php-fpm reload

/etc/init.d/php-fpm restart

查看一下sock文件就可以发现权限为440:

2670
2670

然后修改虚拟主机配置文件:

2671
2671

这时保存退出并重新加载配置文件,然后再进行访问仍然是502:

2672
2672

然后查看错误日志,就不是显示没有此文件了,而是显示权限不够了:

2673
2673

因为/tmp/php-fcgi.sock文件的权限是440,除了root外都没有权限,而Nginx的用户是nobody,所以自然是会报权限不足错误。

我们可以临时将/tmp/php-fcgi.sock文件的属主改为nobody,这样就能访问了:

chown nobody /tmp/php-fcgi.sock

2674
2674

以上这个例子是为了说明定义listen.mode权限的作用。

除了配置文件的问题外还有一种情况也会引发502错误,当php-fpm这个服务的资源耗尽了,也会发生502错误,这种时候就需要去进行优化了。

12.16 Nginx代理

2675
2675

Nginx可以做代理服务器,代理服务器就是夹在用户和web服务器之间的一个服务器。

例如web服务器只有局域网IP没有公网IP,所以用户想要直接访问web服务器是行不通的,而这时候就需要用到代理服务器了,代理服务器有局域网IP和公网IP,能够接收公网上用户的访问请求,然后把请求通过局域网发送给web服务器。web服务器处理完请求后,也是通过代理服务器将结果返回给用户。

再例如一种普遍的代理服务器应用场景就是:从国内访问国外的web服务器,大家都知道从国内访问国外的网站都很慢,我们希望把访问速度提升,也可以使用代理服务器的方式。例如香港连接美国的web服务器比较快,所以可以把代理服务器放在香港,然后通过这个代理服务器去访问美国的web服务器速度就会有所提升。

现在我们尝试一下以虚拟机作为代理服务器,配置代理服务器也不难,首先进入到虚拟主机配置文件的目录下:

cd /usr/local/nginx/conf/vhost

创建一个文件:

vim proxy.conf

加入以下内容:

代码服务器不需要配置root,因为不需要访问本地文件。

server

{

   listen 80;

   server_name ask.apelearn.com;  //定义一个域名

   location /

   {

       proxy_pass      http://121.201.9.155/;  //定义web服务器的ip

       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;

   }

}

2676
2676

保存退出并重新加载配置文件后,进行测试:

2677
2677

如图代表成功,因为如果没有配置代理服务器的话,本机IP是不能访问外部网站的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门开源软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档