LNMP的nginx、php配置(下)
8、访问控制
编辑对应服务器配置文件
(1)限制某个ip访问:
deny 192.168.1.104;
allow all;
在进行限制匹配时,满足第一个deny条件,就直接抛弃ip了,所以要注意顺序,如果顺序搞反,就会失去限制限制效果,以为所有ip都能匹配allow all,然后就不再匹配后面的deny了;
(2)只允许某个ip访问:
allow 127.0.0.1;
allow 192.168.1.104;
deny all;
在进行限制匹配时,满足第二个allow条件,就直放行ip,不在进行后面的匹配,所以要注意顺序;
(3)针对某个目录进行访问限制
location /uc_server/{
allow 127.0.0.1;
allow 192.168.1.104;
deny all;
}
(4)针对某些目录禁止解析php
location ~ .*(diy|template|attachments|forumdata|attachment|image)/.*\.php$
{
deny all;
}
(5)根据user_agent(浏览器标识)控制,带有限制标识的浏览器会被限制访问
if ($http_user_agent ~ 'bingbot/2.0|MJ12bot/v1.4.2|Spider/3.0/YoudaoBot|Tomato|Gecko/20100315')
{
return 403;
}
9.nginx的rewrite应用
(1)当用户访问一些不存在或者错误的网页时,按照一定规则跳转到指定网页,而不是错误页,下面是伪静态rewrite规则模板:
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
(2)nginx可以用if进行条件匹配,例如:
if($htttp_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;}
a、正则表达式匹配,其中:
~ 是区分大小写匹配
~* 是不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
b、文件及目录匹配,其中:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e 用来判断是否存在文件或目录
-x和!-x 用来判断文件是否可以执行
例如:
if(!-f $request_filename {proxy_pass http://127.0.0.1;}
c、nginx的rewrite规则与apache几乎一致,只是最后的flag标记不同,例如:
rewrite ^/feed/$ http://www.1.com last;
flag标记有:
last 相当于apache里的L标记,表示完成rewrite,不再匹配后面的规则
break与last类似
redirect 返回302临时重定向
permanent 返回301永久重定向
Wordpress的重定向规则:
if(!-e $request_filename) {rewrite ^/(index|atom|rsd)\.xml$ http://www.1.com last;rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;rewrite ^ /index.php last; }
(3)$document_uri表示访问的url
现在要求访问www.1.com 请求到www.1.com/1/
在nginx配置文件中加入:
if($document_uri !~ '1')
{
rewrite ^/(.*) http://www.1.com/1/$1 permanent;
}
单独加rewrite ^/(.*) http://www.1.com/1/$1 permanent;会导致死循环;
(4)nginx rewrite不支持if嵌套也不支持逻辑或、并,对于复杂功能的实现,需要借助标记功能实现:
例如,要求url以/abc/开头的请求,且user_agent带有ie6或者firefox关键词的请求禁止访问:
set $rule 0;
if($document_uri ~ '^/abc/')
{
set $rule "{rule}1";
}
if($http_user_agent ~* 'ie6|firefox' )
{
set $rule "{rule}2";
}
if($rule = "012")
{
deny all;
}
10、nginx代理
(1)
vi /usr/local/nginx/conf/vhosts/proxy.conf
vi /usr/local/nginx/conf/vhosts/proxy.conf
(2)对于多个后台服务器的:
upstream bbb
{
server 2.2.2.1:80 weight=100;
server 2.2.2.2:80 weight=10;
}
server{
listen 80;
server_name www.baidu.com;
location /{
proxy_pass http://bbb/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarder_for;
}
access_log /home/logs/aaa_access.log combined;
}
(3)代理一个服务器上所有域名
在vhosts目录下建立两个文件:
a、servername:
server_name www.1.com www.2.com www.3.com... ;
b、虚拟主机配置文件:
server{
listen 80;
include vhosts/servername
location /{
proxy_pass http://bbb/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarder_for;
}
access_log /home/logs/aaa_access.log combined;
}
(4)根据文件目录来进行代理
需求:当请求目录为/aaa/则把请求发送到机器a,当请求目录/bbb/则把请求发送到机器b,除了目录/aaa/与目录/bbb/外,其他的请求发送到机器b
nginx配置文件内容为:
upstream aaa.com
{
server 192.168.111.6;
}
upstream bbb.com
{
server 192.168.111.20;
}
server {
listen 80;
server_name li.com;
location /aaa/
{
proxy_pass http://aaa.com/aaa/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarder_for;
}
location /bbb/
{
proxy_pass http://bbb.com/bbb/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarder_for;
}
location /
{
proxy_pass http://bbb.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarder_for;
}
}
(5)根据url来进行代理
要求:根据不同的请求使用一台nginx代理四台apache
nginx配置如下:
upstream aa.com
{
server 192.168.111.6;
server 192.168.111.7;
}
upstream bb.com
{
server 192.168.111.20;
server 192.168.111.21;
}
server {
listen 80;
server_name www.abc.com;
location ~ aa.php
{
proxy_pass http://aa.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarder_for;
}
location ~ bb.php
{
proxy_pass http://bb.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarder_for;
}
}