nginx基础学习(二):nginx的location内部属性的详细说明和介绍

上一篇文章写的nginx的基础安装,以及nginx配置文件的整体结构。这篇文章将会一起来看一下nginx中的一个重要属性locationlocation是放在server里面的,用于匹配访问的域名后的path路径。location匹配的规则很复杂,内容也是非常多,这里只做简单的介绍。

location的匹配规则

location的三种匹配方式

location的匹配规则有三种,分别是精准匹配、普通匹配和正则匹配。下面对三种匹配做一个说明。

http://blog.itcrud.com/2018/12/12
监听的端口是:80
服务名是:blog.itcrud.com
path:/2018/12/12
  • 精准匹配:根据path做精准匹配,使用的操作符是=如下:

    location = /2018/12/12 {
        root html/;
        index index.html;
    }
    
  • 普通匹配:请求的path和当前的location指定的值做匹配,location关键字和规则路径使用空格隔开(也可以用^~来表示,一般不会这么操作,了解一下),遵从最长匹配路径优先的原则。如下:

    location /2018 {
        root html/;
        index index.html;
    }
    location /2018/12 {
        root html/;
        index index.html index.htm;
    }
    # 两个location都会被命中,但是根据最长匹配原则第二个将会被最终命中。
    
  • 正则匹配:通过正则表达式的方式来命中,如果命中多个,以最先命中为准,这一点是和普通匹配有所不同。使用的 操作符是=

    # 正则1
    location ~ \.* {
        root html/;
        index index.html index.htm;
    }
    # 正则2
    location ~ \.html$ {
        root html/;
        index index.html index.htm;
    }
    #当浏览器中输入:http://blog.itcrud.com/regex.html,此时两个正则表达式都是可以命中的,但是由于正则1是在前面,所以会直接作为命中目标,不会再去考虑正则2。
    
匹配规则混合使用命中逻辑

在一个server中一般不会只出现一种匹配方式,往往是好几种混合的使用,在多种匹配方式都命中的情况下,到底是以谁为准呢,这里有一个匹配命中的逻辑。看下图:

在这里插入图片描述

解释:

  • 当直接命中精准匹配的时候,其他的匹配规则就不会再生效,将会按精准规则内的逻辑执行返回。
  • 当命中的是普通匹配的时候,命中一个后会直接进入此规则的逻辑。命中多个的话需要根据最长匹配原则来筛选出最终命中的规则。到这里还没有完,命中规则逻辑实现完后,会继续做正则匹配,如果没有匹配到正则规则,就按照普通匹配来做最终返回,如果命中了正则的规则,最终是以正则规则为准。
  • 当精准匹配和普通匹配都没有命中时,会进入正则匹配。匹配中给返回,不中也是给返回,但是是错误信息。

location下的子元素root

在匹配的时候,根据请求地址中pathroot到指定的目录下找对应的文件。

示例:

# 请求地址:http://blog.itcrud.com/2018/12/user.html
# location配置:
location /2018 {
    root /usr/local/html;
    index index.html;
}

请求命中/2018的的普通匹配规则,请求地址对应的path是/2018/12/user.html,这个时候会到root对应目录下找path对应的文件。最终找的是/usr/local/html/2018/12/user.html

location下的子元素alias

当配置的是alias的时候,会将location匹配的路径舍弃,进入到alias目录中,按照请求地址的path找对应的文件,相当于alias替代了location配置的匹配地址。

示例:

# 请求地址:http://blog.itcrud.com/2018/12/user.html
# location配置:
location /2018/12 {
    alias ^/ /usr/local/html;
    index index.html;
}

请求命中规则,请求地址对应的path2018/12/user.html,由于是采用alias,会将请求地址中/2018/12替换成/usr/local/html,最终查找文件的路径是/usr/local/html/user.html

location下的子元素proxy_pass

proxy_pass是在使用的时候最经常使用的,上面都是静态文件,这里是将请求转化给代理的服务。

示例:

# 请求地址:http://blog.itcrud.com/2018/user/index.html
# location配置:
location /2018 {
    proxy_pass http://127.0.0.1:8081;
}

当请求进来以后,会将请求路由到对应虚拟服务器,请求到服务器的地址是:http://127.0.0.1/2018/user/index.html

如果将proxy_pass修改成http://127.0.0.1:8081/,请求就会不一样,请求到服务器的地址是:http://127.0.0.1//user/index.html。这个地址是有问题的,IP地址后面会有两个/。修改正确的写法如下:

# 请求地址:http://blog.itcrud.com/2018/user/index.html
# location配置:这里将"/2018"换成"/2018/"
location /2018/ {
    proxy_pass http://127.0.0.1:8081/;# 后面用"/",进行关闭操作
}
# 实际请求地址:http://127.0.0.1/user/index.html
# ↓↓↓↓错误写法
location /2018 { # 这里没有用"/"关闭
    proxy_pass http://127.0.0.1:8081/;# 后面用"/",进行关闭操作
}
proxy反向代理相关参数
  • proxy_set_header:通过此参数来指定代理的请求头信息,如:

    proxy_set_header X-Forwarded-For $remote_addr;#1
    proxy_set_header X-Real-IP $remote_addr;#2
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#3
    

    #1#3有时候会带来坑。nginx默认的配置是#3

    场景:

    在外部请求进入nginx后,反向代理进入到对应的服务器中,这个时候服务器需要获取客户端的IP地址,nginx中配置就必须用#1指令,如果使用#3,那么服务器获取的ip永远只是nginx所在机器的IP地址。(如:博客统计访客量)

  • proxy_redirect:代理重定向,其实和页面重定向是类似的(内部重定向,不改变浏览器请求地址),支持正则表达式的匹配等。

    proxy_pass http://127.0.0.1:8080;
    proxy_redirect http://127.0.0.1:8080/server1 http://127.0.0.1:8081/server2;
    

    当进入的请求满足proxy_redirect的匹配规则表达式http://127.0.0.1:8080/server1,就会重定向请求http://127.0.0.1:8081/server2

  • proxy_connect_timeout:向服务器请求连接等待时间,这个时候是在请求获取连接,还没有正式和服务建立连接,最大值不能超过75,此参数的单位是秒。

  • proxy_buffers:指定缓冲区的大小和数量。如:proxy_buffers 10 8K,表示缓冲区数量为10,大小是8K。

  • proxy_send_timeout:服务器数据回传时间,表示请求已经处理结束,响应数据回传等待时间,也就会回传数据经历的时长。

  • proxy_read_timeout:已经和服务器建立连接,但是一直处于等待处理状态,此参数就是对应等待时间。

还有很多参数就不一一的说明了,一般使用默认的就好,需要设置的也就是主要的几个参数(请求头设置proxy_set_header、请求重定向设置proxy_redirect、请求代理设置proxy_pass)。

总结

简明的总结一下这篇文章的主旨。首先说明一下location的三种匹配方式以及匹配方式之间的关系。然后就是介绍location里面的主要的属性aliasproxy_passroot,当然还有其他重要的属性,篇幅有限,将在下一篇文章来具体说明。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
nginx中的location指令用于定义URI匹配规则,用于指定不同的配置块应用于不同的URI。 优先级表示了location配置块的匹配顺序,当请求到达nginx服务器时,nginx会依次遍历配置文件中的location配置块,然后使用第一个与请求URI匹配的location块进行处理。 具体来说,nginxlocation指令有两种形式:精确匹配和正则表达式匹配。 1. 精确匹配: location = /path { // 配置内容 } 这种形式表示对URI进行完全匹配,只有当请求的URI与指定的path完全相同时才会被匹配。 2. 前缀匹配: location /path { // 配置内容 } 这种形式表示对URI进行前缀匹配,只要请求的URI以指定的path开头就会被匹配到。 3. 正则表达式匹配: location ~* \.(jpg|jpeg|png)$ { // 配置内容 } 这种形式表示使用正则表达式进行URI匹配,只有当请求的URI符合指定的正则表达式时才会被匹配。 当有多个location配置块与请求的URI匹配时,nginx会按照以下优先级进行选择: 1. 精确匹配优先级最高,如果有精确匹配的location块与请求的URI完全匹配,就会选择该location块进行处理。 2. 如果没有精确匹配的location块,nginx会按照配置文件中location块的顺序从上到下依次匹配前缀匹配和正则表达式匹配的location块,选择第一个匹配的location块进行处理。 因此,当有多个location配置块与请求的URI匹配时,需要根据优先级和匹配规则来设置location配置块的顺序,以确保请求能够被正确地处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿洞晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值