笔记内容:

  • 12.13 Nginx防盗链

  • 12.14 Nginx访问控制

  • 12.15 Nginx解析php相关配置

  • 12.16 Nginx代理

笔记日期:2017-10-23


12.13 Nginx防盗链

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

编辑虚拟主机配置文件:

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;

}

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


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

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


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

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

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


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

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


12.14 Nginx访问控制

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

编辑虚拟主机配置文件:

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


增加以下内容:

location /admin/

{

   allow 192.168.133.1;

   allow 127.0.0.1;

   deny all;

}

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

和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,则代表成功了。


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

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

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

{

       deny all;

}

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


创建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

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


再创建一个txt文件:

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


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

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

因为txt不在匹配范围内。



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

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

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

{

     return 403;

}

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


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

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


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

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


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

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

{

     return 403;

}





12.15 Nginx解析php相关配置

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

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

  1. 创建一个php文件:

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

  1. 文件内容如下:

<?php

phpinfo();

?>


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

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



想要支持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;

   }

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


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

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


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

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


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

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


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

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

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


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

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

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


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

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

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

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


然后重新加载一下:

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


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

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


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

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

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

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

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


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

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


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

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


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

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


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

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

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

/etc/init.d/php-fpm restart


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

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


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

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


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

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


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

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

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

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

chown nobody /tmp/php-fcgi.sock

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


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

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

12.16 Nginx代理

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

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;

   }

}

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


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

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

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