回顾:
在上一篇Nginx文章中,我们做过了Nginx的轮询、加权轮询、IP地址哈希,在本文章中,我们要去熟悉一下Nginx主配置文件中的Location参数,来做一个业务的动静分离,实现用户访问静态资源直接从Nginx返回,动态交互式的页面就从后端Web服务器获取;
环境描述:
对于环境我们依旧是使用上个文章中做了IP_HASH 之后的环境,就不用恢复到快照”LAMP+Nginx集群架构-1″进行实验了,拓扑如下:

Nginx Location深入解析
Nginx 由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单。仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
默认Nginx.conf配置文件中至少存在一个”location /” ,即表示客户端浏览器请求的URL为:域名+/,如果 location /newindex/,则表示客户端浏览器请求的URL为:域名+/newindex/。常见location匹配URL的方式如下:
= 字面精确匹配;
^~ 最大前缀匹配;
/ 不带任何前缀;
~ 大小写相关的正则匹配;
~* 大小写无关的正则匹配;
@ location内部重定向的变量。
其中location =、^~、 / 属于普通字符串匹配,location ~ 、~*属于正则表达式匹配,location优先级与其在Nginx.conf配置文件中的先后顺序没有关系;
location = 精确匹配会第一个被处理,如果发现精确匹配,Nginx则停止搜索其他任何location的匹配。
普通字符匹配,正则表达式规则和完整URL规则将被优先和查询匹配,^~为最大前缀匹配,如果匹配到该规则,Nginx则停止搜索其他任何location的匹配,否则nginx会继续处理其他location指令。
正则匹配 “~” 和 “~*” ,如果找到相应的匹配,则Nginx停止搜索其他任何location的匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
location规则匹配优先级总结如下:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~ | ~* 正则顺序) > ( location 部分起始路径 ) > (/)
实验动静分离:
在虚拟主机配置文件bbs.zhanggeng.com中,添加标红部分

LB上创建/var/www/html/discuz目录:
[root@LB ~]# mkdir -p /var/www/html/discuz
从Lamp1上将discuz的文件都cp到LB上:
[root@Lamp1 ~]# cd /var/www/html/discuz/
[root@Lamp1 discuz]# scp -r ./* 192.168.169.201:/var/www/html/discuz/
复制了discuz的全部文件,可以将PHP的文件删除掉:
[root@LB ~]# find /var/www/html/discuz/ -name "*.php" -exec rm -rf {} \;
重启Nginx:
[root@LB ~]# /usr/local/nginx/sbin/nginx -s reload
进行反向测试:
将Lamp2中的Apahce关闭,并且将Lamp1中discuz目录下的static目录删掉:
[root@Lamp1 discuz]# cd /var/www/html/discuz/
[root@Lamp1 discuz]# rm -rf static/
[root@Lamp1 discuz]# systemctl retsart httpd
此时刷新页面依然可以正常访问:

补充:
php | jsp | cgi | do 动态的东西使用明细指向后端的页面:
当标红部分匹配不上,才会去找上面的 location /

如下为Nginx Location规则案例演示:
location = / {
[ configuration L1 ]
#只会匹配/,优先级比Location /低。
}
location = /index.html {
[ configuration L2 ]
#只会匹配/index.html,优先级最高。
}
location / {
[ configuration L3 ]
#匹配任何请求,因为所有请求都是以"/"开始;
#但是更长字符匹配或者正则表达式匹配会优先匹配,优先级最低。
}
location = /images/ {
[ configuration L4 ]
#匹配任何以/images/开始的请求,并停止匹配其它location;
}
location ~* \.(html|txt|gif|jpg|jpeg)$ {
[ configuration L5]
# 匹配以html、txt、gif、jpg、jpeg结尾的URL文件请求;
# 但是所有/images/目录的请求将由 [Configuration L4]处理。
}
浏览器发起HTTP Request URI案例与Location规则案例匹配如下:
* / ->匹配configuration L3;
* /index.html匹配configuration L2;
* /images/匹配configuration L4;
* /images/logo.png匹配configuration L4;
* /img/test.jpg匹配configuration L5。
企业生产环境中无需在Nginx.conf配置文件中同时添加五种规则匹配,如下为企业生产环境Nginx
Location部分配置代码:
location /
{
root /var/www/html/;
expires 60d;
}
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /var/www/html/;
expires 60d;
}
location ~ .*\.(jsp|php|cgi|do)$
{
root /var/www/html/;
proxy_pass http://linux_web;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location =/newindex.html
{
root /var/www/newwww/;
expires 60d;
}