Nginx-集群架构-4-基础应用-Location

回顾:

在上一篇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中,添加标红部分

注释:标红部分表示以上述后缀结尾的文件都从/var/www/html/discuz中获取;

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;
}