一、修改虚拟主机配置文件php
# vim /usr/local/nginx/conf/vhost/test.com.confmysql
在配置文件中加入如下内容,这里的内容是和静态元素过时时间、不记录日志结合起来的:nginx
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ //^表示以……开头,web
{正则表达式
expires 7d;sql
valid_referers none blocked server_names *.test.com ; //referer白名单apache
if ($invalid_referer) { //若是不是白名单中的referer,就返回403vim
return 403;服务器
}网络
access_log off;
}
二、测试语法错误并从新加载配置文件
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
三、测试验证
当referer是白名单之外的连接时,就会被禁止访问
# curl -e "http://www.baidu.com" -x127.0.0.1:80 test.com/1.gif -I
当referer是白名单上的连接时,就会访问成功
# curl -e "http://test.com" -x127.0.0.1:80 test.com/1.gif -I
一、配置IP白名单
编辑虚拟主机配置文件/usr/local/nginx/conf/vhost/test.com.conf,加入如下内容:
locaton /admin/ //针对目录作访问控制
{
allow 192.168.31.157; //注意配置白名单须要先容许,再deny
allow 127.0.0.1;
deny all;
}
不一样于apache中的order ,先拒绝全部访问,再开启白名单,而且是顺序执行完全部代码;在nginx中,是没有order的,执行语句时候,只要匹配到访问的IP,则不会执行后面的语句,所以须要将allow写在前面,deny写在后面
二、检查语法错误并从新加载配置文件
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
三、测试验证
# curl -x192.168.31.157:80 -I test.com/admin/1.php
# curl -x127.0.0.1:80 -I test.com/admin/1.php
若是来源IP不在白名单内,则会出现403禁止访问
四、访问控制-正则匹配
匹配正则表达式来进行访问控制容许访问或者拒绝访问
好比能够在虚拟主机配置文件中加入如下内容,表示禁止上传文件或图片解析php
location ~ .*(upload|image)/.*\.php$ //匹配upload或image目录下以php结尾的文件
{
deny all; //拒绝访问
}
检查语法并加载配置文件后,咱们来访问upload下的php文件test.com/upload/1.php提示禁止访问
接下来访问upload下的txt文件test.com/upload/1.txt则访问OK
五、根据user_agent限制访问
在虚拟主机配置文件中加入如下代码:
if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato') //表示匹配到user_agent包含Spider/3.0|YoudaoBot|Tomato中任意一个就拒绝访问
{
return 403; //deny all和return 403效果同样
}
如今来访问test.com/upload/1.txt 是可以成功访问的
接下来模拟用户代理Tomatodsewre,由于匹配到Tomato,全部服务器拒绝访问
# curl -A "Tomatodsewre" -x127.0.0.1:80 -I test.com/upload/1.txt
可是下图中当咱们模拟用户代理tomatodsewre,首字母由大小变成小写后,访问成功了,这说明咱们当前的配置是对大小敏感的
# curl -A "tomatodsewre" -x127.0.0.1:80 -I test.com/upload/1.txt
此时咱们只须要在匹配符号~后面加上*号便可表示忽略大小写,以下
加上*后,咱们再来访问test.com/upload/1.txt就会提示禁止访问了
一、 编辑虚拟主机配置文件
在虚拟主机配置文件中加入如下内容:
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;
}
在从新加载配置文件前,咱们先来测试访问一个页面3.php,文件内容以下
下面咱们来访问这个页面,访问结果出现的是3.php文件的内容,并未解析这个php文件
# curl -x127.0.0.1:80 test.com/3.php
二、检测语法并从新加载配置文件
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
三、测试验证
如今咱们再来访问3.php这个页面,文件里面的php语句被解析
# curl -x127.0.0.1:80 test.com/3.php
四、502状态码
当配置文件中fastcgi_pass unix:/tmp/php-fcgi.sock; 这一行配置的路径/tmp/php-fcgi.sock写错了,就会出现502错误,咱们来将路径改为下面的错误路径
而后来测试访问# curl -x127.0.0.1:80 test.com/3.php 就出现下面的502
当咱们遇到502错误的时候,能够从几个方面来分析:
1)咱们来查看错误日志# tail /usr/local/nginx/logs/nginx_error.log
提示说没有/tmp/php-cgi.sock这个目录或文件,咱们# ls /tmp/php-cgi.sock 发现确实没有这个文件
这时候咱们就须要去php-fpm的配置文件中去查看php-fpm监听的这个socket的路径跟上面nginx配置文件中的路径做一个对比,发现nginx配置文件中的路径写错了
这点总结起来就是:php-fpm配置文件中监听的socket路径是什么,nginx配置文件中的fastcgi_pass路径就应该写什么
2)实验:首先php-fpm配置文件配置监听IP和端口,以下
而后重启php-fpm
# /etc/init.d/php-fpm reload
此时咱们能够看到127.0.0.1:9000已经被监听
咱们再来访问# curl -x127.0.0.1:80 test.com/3.php
再来查看错误日志# tail /usr/local/nginx/logs/nginx_error.log
出现这个错误的缘由是nginx的配置文件尚未修改成IP+端口的形式,须要修改成下图
从新加载配置文件后,咱们再来查看访问结果,结果是成功访问到了
总结:这点总结起来就是若是php-fpm配置文件使用的是IP+端口的形式,那么nginx配置文件中也应该使用一样的形式
3)出现502错误还应该检查的一个地方是nginx配置文件下图中的路径
应该对应下面这个图的路径
4)在php5.4及之后的版本,有一个特色,就是若是咱们在php-fpm配置文件中监听的是socket,而又不定义listen.mode的话,那么/tmp/php-fcgi.sock文件的权限就会变成440
咱们将配置文件修改成以下形式:
从新加载配置文件后,再来查看/tmp/php-fcgi.sock的文件权限,能够看到其权限是440,所属组和所属主都是root用户
而后将nginx的配置文件配置为socket,
再来访问# curl -x127.0.0.1:80 test.com/3.php 结果仍是502报错
咱们经过查看错误日志,能够看到502错误缘由是由于权限被拒绝,
上面咱们提到/tmp/php-fcgi.sock的文件权限是440,所属组和所属主都是root用户,可是下面这个图显示nginx的进程的所属主和所属组都是nobody
咱们来测试下临时将/tmp/php-fcgi.sock的所属主和所属组改成nobody
# chown nobody /tmp/php-fcgi.sock
而后再来访问# curl -x127.0.0.1:80 test.com/3.php,结果访问成功,这是由于此时nobody用户有读写的权限了
5)还有一种502错误的状况是php-fpm服务的资源耗尽了,好比有一个mysql查询卡死了,php-fpm的资源耗尽了,这个时候就须要去优化了
以上修改过php-fpm的配置文件后须要restart php-fpm服务
使用场景:a.用户不能直接访问到web服务器的网络
b.用户虽然能直接访问web服务器,可是网络太慢
代理服务器特色:既能与用户通讯,又能与web服务器通讯
这里咱们尝试将本身的虚拟服务器配置为代理服务器,而后使用虚拟服务器内部的回环IP127.0.0.1来访问外部的网站www.cxkchina.com/robots.txt,内部的回环IP127.0.0.1本来是不能访问外网的
一、切换目录
# cd /usr/local/nginx/conf/vhost/
二、新增虚拟主机配置文件
在新增的虚拟主机配置文件proxy.conf中写入如下内容:
server
{
listen 80;
server_name www.cxkchina.com; //给代理服务器取的域名
//这里没有写root,缘由是由于这个服务器是代理服务器,它不须要访问本地服务器上的任何文件
location /
{
proxy_pass http://121.201.9.155/; //此处告诉nginx真正的WEB服务器的IP
proxy_set_header Host $host; //告诉nginx它要访问的域名Host是上面设置的域名$host,$host也就是server_name
proxy_set_header X-Real-IP $remote_addr; // 定义X-Real-IP这个变量的值是$remote_addr
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; // 定义X-Forwarded-For这个变量的值是$proxy_add_x_forwarded_for
}
}
二、检测语法错误并从新加载配置文件
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
三、测试验证
正常状况下来访问www.cxkchina.com/robots.txt这个页面
使用虚拟服务器内部的回环IP127.0.0.1来访问外部的网站www.cxkchina.com/robots.txt
相关推荐连接:
502问题汇总 http://ask.apelearn.com/question/9109
location优先级 http://blog.lishiming.net/?p=100