Nginx企业级负载均衡:技术详解系列(12)—— 深入解析root、alias及location

本文主要是介绍Nginx企业级负载均衡:技术详解系列(12)—— 深入解析root、alias及location,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

你好,我是赵兴晨,97年文科程序员。
在生产服务器的Nginx配置中,我们总会遇到形形色色的配置方案。你是否曾注意到root和alias指令的巧妙应用?是否对那些五花八门的location匹配规则感到好奇?
今天,咱们来聊聊Nginx配置中root和alias以及location的详细使用。

root与alias
root:指定web的跟目录,在定义location的时候,文件的绝对路径等于root+location

server {listen 80;server_name chensir.ink;location / {root /data/nginx/html/pc;}location /about {# 必须要在html目录中创建一个about目录才可以访问,否则报错。root /opt/html;}
}

新建关于 location /about 的静态资源目录

# 创建目录
mkdir -p /opt/html/about# 写入index.html
echo about > /opt/html/about/index.html

加载Nginx配置文件并访问

systemctl reload nginx

在这里插入图片描述
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于location上下文,此指令使用较少。

示例

server {listen 80;server_name chensir.ink;location / {root /data/nginx/html/pc;}# 注意:about后不要加斜杠。使用alias时,如果URI后面加了斜杠,# 则下面的路径配置必须加斜杠,否则会导致403错误。location /about {# 当访问/about时,会显示/opt/html/about目录下的内容。alias /opt/html/about;}
}

加载Nginx配置文件并访问

systemctl reload nginx

在这里插入图片描述

注意:location中使用root指令和alias指令的意义不同。
root:给定的路径对应于location中的/uri 左侧的/。
alias:给定的路径对应于location中的/uri 的完整路径。

location的详细使用
在nginx的配置中,每个server块可以定义多个location段,这些段负责将用户请求的URI映射到文件系统路径。当用户处理请求时,Nginx会按照以下优先级顺序来选择最佳匹配的location:
精确匹配:Nginx首先尝试找到与请求URI完全一致的location。
最长非正则前缀匹配:如果没有找到精确匹配,Nginx会寻找最长的、非正则表达式的URI前缀匹配。
正则表达式匹配:如果配置中包含正则表达式location,Nginx将按照配置文件中定义的顺序进行匹配,一旦找到匹配的正则表达式,就会停止搜索并使用该location处理请求。

注意:如果location中使用了正则表达式,它将具有较高的优先级,因为Nginx会首先评估所有正则表达式location。此外,location匹配是基于它们在配置文件中出现的顺序,所以配置的顺序也会影响最终匹配的结果。

location官方帮助
https://nginx.org/en/docs/http/ngx_http_core_module.html#location

Nginx语法规则

location [ = | ~ | ~* | ^~ ] uri { ... }
  1. = 精确匹配:使用=前缀表示精确匹配,请求的uri必须完全等同于指定的uri字符串。这种匹配是大小写敏感的,并且一旦找到精确匹配,Nginx将停止搜索其他location块,并使用匹配的location处理请求。
location = /exact-match {# 配置
}

示例:在server部分使用location配置一个web界面,当访问Nginx服务器的/logo.jpg的时候要显示指定html文件的内容。
精确匹配一般用于匹配组织的logo等相对固定的URL,匹配优先级最高

server {listen 80;server_name chensir.ink;location / {root /data/nginx/html/pc;index index.html;}location = /logo.jpg {root /data/nginx/images;}
}

上传logo.jpg图片到 /data/nginx/images目录下,重启Nginx并测试。
访问测试:http://chensir.ink/logo.jpg

在这里插入图片描述

  1. ^~ 最长非正则前缀匹配:使用^~前缀表示Nginx将查找最长的非正则表达式前缀匹配。如果匹配成功,Nginx将继续搜索正则表达式location,但不会考虑没有正则表达式的location。
location ^~ /prefix {# 配置
}

示例

server {listen 80;server_name chensir.ink;# 处理/images请求,映射到/data/nginx/images目录location ^~ /images {root /data/nginx;index index.html;}# 处理/api请求,使用alias映射到/data/nginx/api目录location /api {alias /data/nginx/api;index index.html;}
}
mkdir -p /data/nginx/images
echo images web > /data/nginx/images/index.htmlmkdir -p /data/nginx/api
echo api web > /data/nginx/api/index.html

重新加载Nginx并访问测试,实现效果是访问 /images 和 /api 返回不同结果。
在这里插入图片描述

  1. ~ 正则表达式匹配:使用 ~前缀表示后面的uri是一个正则表达式,并且匹配时区分大小写。
location ~ /regex/ {# 配置
}

示例:实现区分大小写的模糊匹配

server {listen 80;server_name chensir.ink;# 匹配以字母A开头,区分大小写,后面跟着零个或一个任意字符的.jpg图片文件location ~ /A.?\.jpg {index index.html;root /data/nginx/images;}
}

重新载入Nginx配置并访问测试。
在这里插入图片描述

上图中有两个图片,一个含有大写的,一个都是小写的,根据上面的location规则,进行访问测试,分别访问 http://chensir.ink/Aa.jpg 和 http://chensir.ink/aa.jpg
在这里插入图片描述

在这里插入图片描述

访问结果显而易见,location区分大小写配置成功。

  1. ~* 正则表达式匹配:使用 ~* 前缀同样表示后面的uri是一个正则表达式,但匹配时不区分大小写。
location ~* /case-insensitive-regex/ {# 配置
}

示例

server {listen 80;server_name chensir.ink;# 匹配以字母A开头,区分大小写,后面跟着零个或一个任意字符的.jpg图片文件location ~* /A.?\.jpg {index index.html;root /data/nginx/images;}
}

重新加载Nginx配置,然后访问测试。
在这里插入图片描述

在这里插入图片描述
5. 无前缀匹配:如果没有任何前缀,Nginx会将此location视为一般匹配。如果有多个location块,Nginx会根据最长匹配原则选择一个匹配项。

location /generic-match {# 配置
}

6.转义特殊字符:在正则表达式中,如果需要将特殊字符(如 .,*,?)作为普通字符使用,可以使用反斜杠\进行转义。

location ~* \.(pdf|doc)$ {# 配置
}

匹配优先级:

  • 精确匹配(=)具有最高优先级。
  • 接下来是最长非正则前缀匹配(^~),但仅在没有正则表达式的情况下。
  • 正则表达式匹配(*)优先于非正则表达式匹配,但它们之间根据在配置文件中出现的顺序来确定。
  • 如果存在多个正则表达式location,Nginx将按照它们在配置文件中出现的顺序进行匹配。

注意:如果~匹配成功,Nginx将继续搜索正则表达式location,但如果正则表达式location在~匹配的location之后定义,则不会被考虑。这意味着配置顺序对于确定最终的匹配结果很重要。

以上就是就是今天的全部分享啦,咱们聊了Nginx配置中的root、alias以及location、希望这些知识能够帮助你在构建和优化Web服务器时更加得心应手。

在这个由代码编织的世界里,每一个配置细节都可能成为提升性能和稳定性的关键。记住,技术之路永无止境,不断学习和探索才能让我们在这条路上走得更远。

如果你对Nginx的负载均衡或其他高级特性有更多的兴趣,不妨继续关注我的Nginx技术详解系列。同时,如果你有任何问题或想法,欢迎在评论区留言,我们一起讨论,共同进步。

感谢你的阅读,期待在下一篇文章中与你再次相遇。保持好奇,继续探索,咱们下次见!


最后,我为您准备了一份特别的技术学习礼物,包括:
Linux学习笔记:详尽记录了Linux的核心知识点和实用技巧。
Java基础笔记:为您打下坚实的Java编程基础。
Java面试总结:十万字的面试经验,助您轻松应对各种技术面试。

【一键领取】
领取这份资料包,您只需轻松一扫:
按住👇🏻图片,扫描二维码,备注:【大礼包】‍
通过好友验证后,您的的专属资料包就会立即发送给您。

Linux系统学习笔记、Java基础学习笔记、10万字Java面试总结
在这里插入图片描述

这篇关于Nginx企业级负载均衡:技术详解系列(12)—— 深入解析root、alias及location的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1011835

相关文章

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

maven中的maven-antrun-plugin插件示例详解

《maven中的maven-antrun-plugin插件示例详解》maven-antrun-plugin是Maven生态中一个强大的工具,尤其适合需要复用Ant脚本或实现复杂构建逻辑的场景... 目录1. 核心功能2. 典型使用场景3. 配置示例4. 关键配置项5. 优缺点分析6. 最佳实践7. 常见问题

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

Mybatis Plus JSqlParser解析sql语句及JSqlParser安装步骤

《MybatisPlusJSqlParser解析sql语句及JSqlParser安装步骤》JSqlParser是一个用于解析SQL语句的Java库,它可以将SQL语句解析为一个Java对象树,允许... 目录【一】jsqlParser 是什么【二】JSqlParser 的安装步骤【三】使用场景【1】sql语

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结