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

相关文章

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

MyBatis与其使用方法示例详解

《MyBatis与其使用方法示例详解》MyBatis是一个支持自定义SQL的持久层框架,通过XML文件实现SQL配置和数据映射,简化了JDBC代码的编写,本文给大家介绍MyBatis与其使用方法讲解,... 目录ORM缺优分析MyBATisMyBatis的工作流程MyBatis的基本使用环境准备MyBati

IDEA与JDK、Maven安装配置完整步骤解析

《IDEA与JDK、Maven安装配置完整步骤解析》:本文主要介绍如何安装和配置IDE(IntelliJIDEA),包括IDE的安装步骤、JDK的下载与配置、Maven的安装与配置,以及如何在I... 目录1. IDE安装步骤2.配置操作步骤3. JDK配置下载JDK配置JDK环境变量4. Maven配置下

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

Java之并行流(Parallel Stream)使用详解

《Java之并行流(ParallelStream)使用详解》Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集... 目录Java并行流(Parallel Stream)1. 核心概念与原理2. 创建并行流的方式3. 适

web网络安全之跨站脚本攻击(XSS)详解

《web网络安全之跨站脚本攻击(XSS)详解》:本文主要介绍web网络安全之跨站脚本攻击(XSS)的相关资料,跨站脚本攻击XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本诱使用户执行,可能... 目录前言XSS 的类型1. 存储型 XSS(Stored XSS)示例:危害:2. 反射型 XSS(Re