笔记内容:
12.13 Nginx防盗链
12.14 Nginx访问控制
12.15 Nginx解析php相关配置
12.16 Nginx代理
笔记日期:2017-10-23
12.13 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;
}
保存退出后,重新加载配置文件:
使用curl命令测试一下防盗链,状态码为403代表成功:
curl -e "http://www.baidu.com/1.txt" -x127.0.0.1:80 -I test.com/1.jpg
然后测试一下白名单内的域名是否能够进行访问,状态码为200代表成功:
12.14 Nginx访问控制
编辑虚拟主机配置文件:
vim /usr/local/nginx/conf/vhost/test.com.conf
增加以下内容:
location /admin/
{
allow 192.168.133.1;
allow 127.0.0.1;
deny all;
}
和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,则代表成功了。
还可以使用正则进行匹配,把能上传的目录都进行限制:
location ~ .*(upload|p_w_picpath)/.*\.php$
{
deny all;
}
创建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
再创建一个txt文件:
echo "1111" > /data/wwwroot/test.com/upload/1.txt
访问upload下的1.txt,状态码为200代表成功:
因为txt不在匹配范围内。
还可以根据user_agent来进行限制,可以让网站不被搜索引擎搜索到,能做到隐藏网站的效果:
编辑配置文件,增加以下内容:
if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
return 403;
}
deny all和return 403效果是一样的。
配置完后测试一下,-A 选项可以自定义user_agent,状态码为403代表成功:
使用没有被配置内容匹配的user_agent才能进行访问,只要被匹配的一概被拒绝掉:
想要不区分大小写匹配的话,在~后面加个*就可以了:
if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato')
{
return 403;
}
12.15 Nginx解析php相关配置
现在test.com还不可能够解析php,我们可以测试一下:
创建一个php文件:
vim /data/wwwroot/test.com/3.php
文件内容如下:
phpinfo();
?>
3.访问php文件,可以看到没有解析,显示的是源码:
想要支持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;
}
重新加载配置文件之后再次进行访问,然后会输出一堆html源码而不是输出php源码就代表能够解析了,如果是在浏览器上访问就能解析这些html源码呈现出页面:
如果你配置文件里的socket文件的名称写错了的话,就会出现502状态码:
然后再访问3.php就会出现502状态码:
遇到这种问题就要查看错误日志里的信息是什么,根据日志信息去解决错误:
错误日志的存放路径可以在你Nginx的主配置文件里查看:
知道错误日志的存放路径后,查看一下错误日志:
tail /usr/local/nginx/logs/nginx_error.log
以上是其中一种出现502状态码的情况,还有一种情况就是php-fpm服务监听的是IP和端口,但是却在配置文件里配置去访问sock文件,这样也会出现502错误:
例如我现在将php换成监听IP的形式:
vim /usr/local/php-fpm/etc/php-fpm.conf
然后重新加载一下:
/usr/local/php-fpm/sbin/php-fpm -reload
查看一下端口有没有被监听:
接着我把虚拟主机配置文件里的sock文件名称修改正确,再访问一下,依然是502:
这是因为php-fpm里监听的是IP不是sock文件,而Nginx虚拟主机配置文件里配置的却是sock文件,自然会发生这种错误。
同样的错误日志里也是提示文件不存在,因为php-fpm没有生成这个文件:
现在我们修改一下虚拟主机配置文件里的配置内容:
重新加载配置文件后再进行访问,同样的输出一堆的html源码代表没问题了:
除以上这两种常见的502错误情况外,还有一种情况就是php监听的sock文件,但是却没有定义listen.mode的文件权限,如果不定义的话默认权限是440。例如我把listen.mode那行配置注释掉:
然后重新加载一下配置文件并重启:
/usr/local/php-fpm/sbin/php-fpm -t
/usr/local/php-fpm/sbin/php-fpm reload
/etc/init.d/php-fpm restart
查看一下sock文件就可以发现权限为440:
然后修改虚拟主机配置文件:
这时保存退出并重新加载配置文件,然后再进行访问仍然是502:
然后查看错误日志,就不是显示没有此文件了,而是显示权限不够了:
因为/tmp/php-fcgi.sock文件的权限是440,除了root外都没有权限,而Nginx的用户是nobody,所以自然是会报权限不足错误。
我们可以临时将/tmp/php-fcgi.sock文件的属主改为nobody,这样就能访问了:
chown nobody /tmp/php-fcgi.sock
以上这个例子是为了说明定义listen.mode权限的作用。
除了配置文件的问题外还有一种情况也会引发502错误,当php-fpm这个服务的资源耗尽了,也会发生502错误,这种时候就需要去进行优化了。
12.16 Nginx代理
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;
}
}
保存退出并重新加载配置文件后,进行测试:
如图代表成功,因为如果没有配置代理服务器的话,本机IP是不能访问外部网站的。