NGINX学习笔记(三):一篇搞懂NGINX的常用配置之LOCATION指令

写在前面

NGINX主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来表示开始与结束。
提示:若编译安装则nginx.conf 位于编译时所指定目录。
我是手动编译安装的,在安装时设置安装文件的路径(将软件安装在:/opt/software/nginx-1.18.0/target目录下),所以配置文件为:/opt/software/nginx-1.18.0/target/conf/nginx.conf

官方文档

LOCATION指令官方指南

LOCATION指令的作用?

NGINX通过将一个请求的URL与LOCATION进行比对判断,决定将该请求使用到哪个LOCATION对应的策略进行处理,可以把LOCATION理解为URL路由,或者当成URL的分发处理器。

配置文件的目录结构

在这里插入图片描述

  • Main层位于nginx.conf 配置文件的最高层;
  • Main层下可以有 EVENTS、HTTP 层;
  • Http层下面允许有多个SERVER块,用于对不同的网站做不同的配置;
  • SERVER块下面允许有多个LOCATION,用于对不同的路径进行不同模块的配置。

1. 全局配置,用来配置对整个 server 都有效的参数,主要设置一些影响NGINX服务器整体运行的配置指令。主要包括配置运行NGINX服务器的用户(组)、允许生成的 worker process 数、进程 PID 存放路径、日志存放路径、类型以及配置文件的引入等。

2. EVENTS层,涉及的指令主要影响NGINX服务器与用户的网络连接。主要包括配置是否开启对多 worker process 下的网络连接进行序列化、是否允许同时接收多个网络连接、选取哪种事件驱动模型来处理连接请求、每个 worker process 可以同时支持的最大连接数等。

3. HTTP层,包括全局层和多个SERVER块。全局块层主要包括配置文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。提示:通常SERVER块配置在独立的:/opt/software/nginx-1.18.0/target/conf/*.conf中,通过引用的方式,在HTTP层调用。

4. SERVER块也被叫做“虚拟主机”部分,它描述的是一组根据不同 server_name 指令逻辑分割的资源,这些虚拟服务器响应HTTP 请求,因此都包含在 http 部分。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。一个SERVER块可以配置多个LOCATION块。

ROOT指令?

ROOT指令,用于设置请求的根目录,允许NGINX将传入的请求映射到文件系统。

如何配置LOCATION指令?

1. 语法

SERVER块可以包含多个LOCATION块,LOCATION指令用于匹配URI,语法:

location [ = | ~ | ~* | ^~] uri {
	... ;
}

location @name {
	... ;
}
2. 前缀
=      # 普通字符串匹配,精确且严格匹配,第一个被处理,匹配到即停止搜索;
^~     # 普通字符串匹配,按最长匹配执行,匹配到即停止搜索,不匹配其它LOCATION选项,一般用来匹配目录;# 普通字符串匹配,按最长匹配执行,匹配到不停止搜索,还要继续看有没有匹配的正则表达式,
       # 例如:location /abc {};

~      # 波浪线,正则匹配,区分大小写;
~*     # 波浪线带星,正则匹配,不区分大小写(*表示大小写不敏感,不用区分大小写);

@      # "@" 定义一个命名的 location, 不参与匹配, 在内部重定向时使用, 
       # 一般用在其他的指令中, 例如:error_page, try_files;
3. 说明
=,精确匹配且第一个被处理,精确匹配成功,停止搜索其他匹配。除了精确匹配,然后执行普通字符匹配(非正则表达式匹配),按最长匹配执行,找到最长前缀匹配的LOCATION块。 举例来说:如果请求的路径是 /abcde,那么 location /abc {} 即使匹配成功,还要再看配置中有没有更长的匹配,如果有 location /abcd {} 的配置,找到这个最长匹配之后,如果URI前面有 ^~ 前缀,则停止搜索其他匹配; 如果没有 ^~ 前缀,那么还要继续看有没有匹配的正则表达式,按正则表达式在配置文件中出现的顺序进行匹配,如果找到一个的正则表达式匹配,则停止搜索其他匹配,执行该匹配的LOCATION块。 当没有正则表达式或者没有正则表达式被匹配的情况时,那么匹配程度最高的且最长前缀匹配 location 会被使用。
4. 注意
  1. 匹配优先级: = > ^~ > ~ = ~* > 不带任何字符(最长前缀匹配) > /
  2. 如果URI包含正则表达式, 则必须要有 ~ 或者 ~* 标识
  3. 默认大小写敏感
5. 示例
location  = / {
  # 只精确匹配"/".
  [ configuration A ] 
}
location  = /login {
  # 只精确匹配"/login".
  [ configuration A+ ] 
}
location  / {
  # 匹配任何请求, 因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会优先匹配
  [ configuration B ] 
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求, 并停止匹配其它LOCATION块
  [ configuration C ] 
}
location ~* .(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理
  [ configuration D ] 
}
请求URI例子:
/ -> 符合[ configuration A ] 
/doc/index.html -> 符合[ configuration B ] 
/images/1.gif -> 符合[ configuration C ] 
/documents/1.jpg ->符合[ configuration D ] 
6. 常用配置
location  / {
	# 网站根目录
	root /usr/share/nginx/html;
	# 定义首页文件的名称
	index index.html index.htm;
	# 禁止访问的IP地址
	deny 192.168.22.101; 
	# 允许访问的IP地址
	allow 192.168.33.104;
	
	...;
}

LOCATION指令配置的URI结尾带不带/的区别?

对于请求URI结尾是否带有/,一般的处理逻辑如下:

  • 带/:表示匹配目录;
  • 不带/:表示先匹配文件,如果文件不存在也会去匹配目录。

但是:
对于LOCATION指令中的URI来说,如果URI的结尾带有/,并且LOCATION要执行的命令是proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass、grpc_pass之一时:

location  /images/{
    proxy_pass http://www.baidu.com
}

对于这种情况,NGINX不管images命名的文件或目录存不存在,如果访问请求为:http://blog.baidu.com/images,则NGINX会将请求重定向到:http://blog.baidu.com/images/。所以如果这两种请求对应不同的处理,就要明确增加不带/结尾的LOCATION指令,如:

location /images {
    proxy_pass http://www.baidu.com
}
location /images/ {
    proxy_pass http://www.google.com
}

LOCATION指令的配置建议

# 1. 先写精准匹配的匹配规则
location  = / {
  # 只精确匹配"/".
  # 一般首页会非常频繁, 所以设置精准匹配, 提高匹配效率。
  [ configuration A ] 
}
location  = /login {
  # 只精确匹配"/login".
  # 登录等也会非常频繁, 所以设置精准匹配, 提高匹配效率。
  [ configuration A+ ] 
}

# 2. 再写排除正则的匹配规则
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求, 并停止匹配其它LOCATION块
  # 排除正则匹配可以配置给一般路径资源, 这样可以提高匹配效率, 因为一旦命中下面的3.(正则的匹配规则) 就不会执行了
  [ configuration C ] 
}

# 3. 再写正则的匹配规则
location ~* .(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理
  # 一般配置给一些特殊路径的资源或者后缀, 可以有多条正则, 越精确的放到前面, 因为正则一旦命中,
  # 直接下面的正则就不匹配了
  [ configuration D ] 
}

# 4. 最后写默认的根路径匹配
location  / {
  # 匹配任何请求, 因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会优先匹配, 上面的都不命中的URI, 全部都走这里
  [ configuration B ] 
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cloneme01

谢谢您的支持与鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值