在前几篇博文中我提到过的 nginx除了是一款的web服务器外 nginx还是一个小型的反向代理服务器 我们可以使用nginx将一些静态文件 例如css js images 存储在客户端本地 下次请求的时候直接从本地读取 加快页面响应速度 又比如 我们可以用做分发匹配 将请求php文件的分发给A机器 将请求py文件的请求分给B机器
还有其他很多 在此就不一一详述 但上述功能都需要location模块的配合 下面我就来详细介绍下location模块
nginx的location模块 用来做模式匹配 官方文档 REFER:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~*开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
下面我将介绍几个常用的用法及配置
1.禁止访问 比如我不允许访问项目下的 .htaccess文件 可以这样设置
location ~ /\.ht {
deny all;
}
deny all表示拒绝所有请求
2.将请求php文件的指令 推送给php-fpm
location ~ \.php$ {
root /xxx;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location中是可以使用nginx内置变量的 详见
3.将请求转发给node服务器
upstream sample {
server 127.0.0.1:9000;
}
server{
listen 80;
server_name www.xxx.com;
location / {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://sample;
}
}
请求www.xxx.com的所有请求 将被转发到9000端口
4.反向代理静态文件 gif jpg jpeg png bmp swf js css
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)${
#使用Web缓存区cache_one
proxy_cache cache_one ;
#对不同HTTP状态码缓存设置不同的缓存时间
proxy_cache_valid 200 304 12h ;
proxy_cache_valid 301 302 1m ;
proxy_cache_valid any 1m ;
#设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,这里根据"域名,URI,
#参数"组合成Key
proxy_cache_key $host$uri$is_args$args;
}
之前我又一篇文章介绍了下squid反向代理的 对比对比有什么不同
5.url重写 请求/123456/xxxx 变为 /xxxx?id=123456
location /{
rewrite ^(.*)/equip(d+).html$ $1/index.php?m=content&c=index&a=lists&catid=$2 last;
}
之后我会有一片文章专门介绍nginx的rewrite 敬请关注
6.设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
7防盗链
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.xxx.com xxx.com ;
if ($invalid_referer) {
rewrite ^/ http://www.xxx.com/retrun.html;
#return 403;
}
}
不是www.xxx.com发出的图片请求一律拒绝