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

news/2024/9/23 17:30:57/

在这里插入图片描述

你好,我是赵兴晨,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面试总结
在这里插入图片描述


http://www.ppmy.cn/news/1463881.html

相关文章

字符串转ArrayBuffer

const arrayBuffer new ArrayBuffer(str.length)const bufferView new Uint8Array(ab) for (let i 0; i < str.length; i) {bufferView[i] str.charCodeAt(i) }【前端】失落的 ArrayBuffer - 知乎

jeecgboot 同一账号只允许一个人登录

1.需求分析 jeecgboot 框架要实现同一个账号只允许一个人登录&#xff0c;就跟游戏账号类似&#xff0c;“我登录了就把你踢下去&#xff0c;你登录了就把我踢下去”&#xff1b;jwt 原理是生成 token 后一段时间内登录都有效&#xff0c;jeecgboot 中 jwt 和 redis 联合使用后…

原生html和js实现瀑布流布局(macyjs插件,不依赖于jquery,纯原生)

官网地址 方式一&#xff1a;在github上找到项目&#xff0c;复制demo/assets/css/macy.css&#xff0c;以及/dist/macy.js 直接引入项目 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv&qu…

QT学习(20):QStyle和自定义样式

QStyle 样式&#xff08;继承自QStyle类&#xff09;代表控件的绘制并封装GUI的外观。QStyle是一个封装了GUI外观的抽象基类。Qt使用QStyle去执行几乎所有的内置控件的绘制&#xff0c;确保控件外观和原生控件风格风格相同。 class Q_WIDGETS_EXPORT QStyle : public QObject{…

QT学习(20):QStyle类

Qt包含一组QStyle子类&#xff0c;这些子类&#xff08;QWindowsStyle&#xff0c;QMacStyle等&#xff09;模拟Qt支持的不同平台的样式&#xff0c;默认情况下&#xff0c;这些样式内置在Qt GUI模块中&#xff0c;样式也可以作为插件提供。 Qt的内置widgets使用QStyle来执行几…

动态内存管理—C语言通讯录

目录 一&#xff0c;动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二&#xff0c;通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一&#xff0c;动态内存函数的介绍 1.1 malloc和free void* malloc (…

关于智慧校园安全用电监测系统的设计

人生人身安全是大家关注的话题&#xff0c;2019年12月中国消防统计近五年发生在全国学生宿舍的火灾2314起&#xff08;中国消防2019.12.应急管理部消防救援局官方微博&#xff09;&#xff0c;违规电器是引发火灾的主因。如果在各寝室安装智能用电监测器实时监督线路参数&#…

三层架构有哪三层,为什么要三层

三层架构&#xff08;Three-Tier Architecture&#xff09;是一种常见的软件架构模式&#xff0c;将应用程序分为三个逻辑层次&#xff1a;表示层、业务逻辑层和数据访问层。每一层都负责处理特定的任务&#xff0c;这样的分层设计有助于提高系统的可维护性、可扩展性和灵活性。…