Nginx快速入门:nginx各类转发、代理配置详解|location、proxy_pass参数详解(五)

0. 引言

咱们上节讲解了nginx的负载均衡配置,但是还有很多其他的转发情况,包括不同路径转发至不同的业务服务,通配符识别路径转发等。

今天一起来学习nginx的转发配置

1. location模块的匹配模式

首先我们要了解nginx进行转发代理的核心在于两处,一是入口,二是出口;入口就是url路径匹配识别对应的路径,出口就是转发映射对应的后台服务地址
在这里插入图片描述

我们的入口路径匹配识别都是在location模块实现的,所以我们要首先认识location支持的匹配模式。

所谓匹配模式,就是根据什么样的路径进行匹配,比如识别到路径以“/user”开头的,则转发至user-server服务,那么“/user”就是我们的匹配路径

location支持2种匹配模式:精确匹配(普通匹配)和模糊匹配(正则匹配),总共以下几种呈现形式:

  • 1、全路径精确匹配 =

进行uri的全路径精确匹配,要匹配的一模一样的uri
比如 location = /index ,那么只有路径为/index的才会匹配到

  • 2、前缀模糊匹配 ^~

进行uri的前缀精确匹配
比如 location ^~ /user/ ,那么只要是路径以/user/开头的都会匹配到

  • 3、无匹配符号的精确匹配

没有符号,按照路径开头精确匹配,但是匹配到后不会立即返回,还会继续匹配其他普通匹配,如果匹配到,则会舍弃之前匹配的路径
比如 location /user/ , 当访问/user/开头时会匹配到
比如 location /user/admin,当访问/user/admin时会匹配到

  • 4、模糊匹配 ~

进行uri的模糊匹配,区分大小写,匹配到后不再进行其他匹配
比如 location ~ /user/ ,当路径包含/user/时会匹配,比如/admin/user/或者/user/admin/
当然也可以用正则表达式来表示匹配路径:
比如 location ~ ^/user(.*)admin$,能够匹配以/user开头,admin结尾的路径,.*表示的是任意字符

这里我们简单测试一下,配置后我们访问192.168.244.41/user/xxx/admin,发现是可以正常转发至后台的tomcat服务的,只是tomcat服务中没有/user地址的接口,所以返回404

在这里插入图片描述
我们继续访问192.168.244.41/user/xxx,发现报的就是nginx的404了,这说明请求并没有转发到后台tomcat中,说明没有命中匹配。
在这里插入图片描述

  • 5、模糊匹配 ~*

进行uri的模糊匹配,不区分大小写,匹配到后不再进行其他匹配,优先级与~相同,按照先后顺序优先
比如 location ~ /USER/,当路径包含/USER/时会匹配,如果是/user/则不会,因为区分大小写了

优先级:
由高到低:= > ^~ > 其他,其他匹配根据先后顺序,配置在前的越优先

2. proxy_pass配置详解

我们上述讲解了匹配模式的书写,匹配到了还要进行合理的转发,而转发模式的控制就是通过proxy_pass, 下面我们来看看proxy_pass的语法结构

2.1 proxy_pass 的四种配置写法

首先我们来回顾下proxy_pass的语法:

 proxy_pass url;

转发地址url分为带/和不带/,带杠的为绝对根路径,会直接在路径后拼接上不带匹配路径的转发地址;如果没有杠表示相对路径,则会将匹配路径也带上进行转发,我们举例说明:

location /user/ {proxy_pass url;
}

访问路径固定为:http://192.168.244.21/user/index.html

  • 1、当proxy_pass http://192.168.244.21:8080/

会跳转至http://192.168.244.21:8080/index.html,带/表示绝对路径,匹配路径/user/会被消除

  • 2、当proxy_pass http://192.168.244.21:8080

会跳转至http://192.168.244.21:8080/user/index.html,相对路径,匹配路径/user/不会被消除

  • 3、当proxy_pass http://192.168.244.21:8080/admin/

会跳转至http://192.168.244.21:8080/admin/index.html,匹配路径/user/被消除,并且保留转发路径里的/admin/

  • 4、当proxy_pass http://192.168.244.21:8080/admin

会跳转至http://192.168.244.21:8080/adminindex.html,因为proxy_pass中也包含了/了,表示绝对路径,所以/user/会被消除

总言之记住一点,带/表示绝对路径,请求路径中的匹配路径(location)转发时会被消除

2.2 server和location模块中proxy_pass的区别

在server模块中的proxy_pass只需要配置ip(或域名)和端口,相当于端口转发;而在location中的proxy_pass,也就是我们更加常用的,可以配置域名、ip、端口、uri,此外还需要提供协议:http或https,相当于地址转发。

配置语法如下:

server {listen 80;proxy_responses 1;proxy_timeout 20s;proxy_pass xxx.com:8080;# proxy_pass 192.168.244.21:8080;location /user/ {proxy_pass http://192.168.244.21:8081;}
}

3. location匹配案例练习

  • 1、匹配匹配以.jsp结尾的路径,将其转发至端口为8080的tomcat服务

解析:要匹配以.jsp结尾,只需要默认写上.jsp即可,但是需要注意.是单一字符通配符,所以要添加\做转义,才能表示成本身点的含义

server {listen 81;location ~ (.*)\.jsp {proxy_pass http://localhost:8080;proxy_set_header HOST $host;proxy_http_version 1.1;}
}

测试:

访问ip:81/index.jsp,可以看到成功转发到8080端口的tomcat了(这里提前修改了首页,将端口显示在tomcat首页了)
在这里插入图片描述
去除点号访问,发现访问不通了,测试通过
在这里插入图片描述

  • 2、三台不同的tomcat,端口分别为8080,8081,8083,分别承担不同的业务,将路径以/user开头的请求转发至tomcat 8080, 以/order开头的转发至tomcat 8081, 路径包含/product跳转到tomcat 8083的首页

解析:
该需求实际上一共有两部分,/user,/order的配置都类似,我们使用^~即可,只有8083的需要用到的是跳转,也就是重定向到tomcat 8083首页,这里需要用到return,大家暂时知道即可,下一章我们详细讲解重定向的配置。

server {listen 81;location ^~ /user {proxy_pass http://localhost:8080/;proxy_set_header HOST $host;proxy_http_version 1.1;}location ^~ /order {proxy_pass http://localhost:8081/;proxy_set_header HOST $host;proxy_http_version 1.1;}location ~* /product {return http://192.168.244.41:8083/index.jsp;}}

测试:
1、访问/order/index.jsp, /user/index.jsp都成功转发对应服务
在这里插入图片描述

在这里插入图片描述
2、访问/product/xxx,也成功跳转到tomcat 8083首页了,测试通过。
在这里插入图片描述

4. 总结

上述案例我们讲解到了需要重定向跳转的问题,上述案例中可以看到我们重定向后地址栏的地址也发生了变化,这实际上也暴露了一些后台服务的地址信息,如果我们想地址不变化,内容进行转发即可,要怎么实现呢?

这就需要详细学习nginx 重定向的内容,下一章我们将针对这块内容继续攻克。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万德高科携手航天科技AIRIOT打造智慧能碳管理平台, 助力碳达峰碳中和

“十四五”时期,我国生态文明建设进入了以降碳为重点战略方向、推动减污降碳协同增效、促进经济社会发展全面绿色转型、实现生态环境质量改善由量变到质变的关键时期。“实施数字化赋能行动”,聚焦能源管理、节能降碳、低碳能力等典型场景,推…

MySQL数据库基本操作语言:SQL

SQL 概述 SQL是一 种用于操作数据库的语言,SQL适用于所有关系型数据库。 MySQL、Oracle、 SQLServer是一 一个数据库软件,这些数据库软件支持标准SQL,也就是通过SQL可以使用这些软件,不过每一个数据库系统会在标准SQL的基础 上扩展自己的SQL语法。 大部分的NoSQ…

污水处理厂可视化:让环保与科技共舞

随着科技的飞速发展,我们的生活环境变得越来越美好。然而,随着城市化进程的加快,污水处理问题也日益凸显。如何有效、高效地处理污水,成为了一个亟待解决的问题。而“污水处理厂可视化”技术的出现,为这个问题提供了一…

C语言字符串函数

1.strlen函数 size_t strlen( const char *str ); 例: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h>int main() {char arr[] "asdfgh";size_t len strlen(arr);printf("%zd\n", len);return 0; } strlen函数…

Mysql常用SQL语句

导出指定表 mysqldump --no-create-info -uroot -proot test book book_chapter book_chapter_item > book.sql 导出数据库&#xff0c;排除某几个表 /usr/local/mysql/bin/mysqldump -uroot -proot --ignore-tableshiji.log shiji > /data/shiji/db/shiji.sql 统计所…

【Linux进阶之路】线程

文章目录 一、初始线程1.概念2.执行3.调度4.切换 二、线程控制1.创建2.等待3.分离4.退出5.取消 三、线程安全1.互斥1.1初始1.2理解1.3锁1.3.1概念1.3.2原理1.3.4死锁 2.同步2.1概念2.2原理 3.生产消费者模型 总结尾序 一、初始线程 1.概念 简单的概念&#xff1a; 线程就是一…

Linux环境安装Hadoop

&#xff08;1&#xff09;下载Hadoop安装包并上传 下载Hadoop安装包到本地&#xff0c;并导入到Linux服务器的/opt/software路径下 &#xff08;2&#xff09;解压安装包 解压安装文件并放到/opt/module下面 [roothadoop100 ~]$ cd /opt/software [roothadoop100 software…

opencv静态链接error LNK2019

opencv 3.1.0 静态库&#xff0c;包括以下文件 只链接opencv_world310d.lib&#xff0c;报错 opencv_world310d.lib(matrix.obj) : error LNK2019: 无法解析的外部符号 _ippicvsFlip_16u_I8&#xff0c;该符号在函数 "enum IppStatus (__stdcall*__cdecl cv::getFlipFu…

嵌入式中断理解

一、概念 中断&#xff1a; 在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。 中断优先级&#x…

大型医院PACS系统源码,影像存储与传输系统源码,支持多种图像处理及三维重建功能

PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以数字化的方式将各种医学影像&#xff0c;如核磁共振、CT扫描、超声波等保存起来&#xff0c;并在需要时能够快速调取…

springboot使用poi-tl动态填充word模板

第一、导入依赖 <!-- docx 数据填充生成 doc文件 这个是主要 --> <!-- POI --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version> </dependency> <depen…

C++11特性:共享智能指针

在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&#xff08;smart pointer&#xff09;。智能指针是存储指向动态分配&#xff08;堆&#xff09;对象指针的类&#xff0c;用于生存期的控…

docker hub 上传笔记

近段时间刚好有相关需求上传docker到hub&#xff0c;顺便记录学习一下&#xff1a; 1. 构建指定版本&#xff0c;并上传 docker build --platformlinux/amd64 -f dockerfile_s01 -t myDocker . # 打标签&#xff0c;docker images的名字为myLocalDockerName docker tag myLoc…

机器学习 深度学习 神经网络

神经网络概念&#xff1a; 神经网络是一个由生物神经元组成的网络或电路&#xff0c;或者从现代意义上讲&#xff0c;是一个由人工神经元或节点组成的人工神经网络。因此&#xff0c;一个神经网络要么是由生物神经元组成的生物神经网络&#xff0c;要么是用于解决人工智能&…

pytorch——基于循环神经网络的情感分类

任务目标 基于给定数据集&#xff0c;进行数据预处理&#xff0c;搭建以LSTM为基本单元的模型&#xff0c;以Adam优化器对模型进行训练&#xff0c;使用训练后的模型进行预测并计算预测分类的准确率。 数据集信息 IMDB数据集是一个对电影评论标注为正向评论与负向评论的数据…

35_36-Golang 中的 go mod 以及 Golang 包详解

**Golang **中的 **go mod **以及 **Golang **包详解 主讲教师&#xff1a;&#xff08;大地&#xff09; 合作网站&#xff1a;www.itying.com** **&#xff08;IT 营&#xff09; 我的专栏&#xff1a;https://www.itying.com/category-79-b0.html 一、Golang 中包的介绍和…

Ubuntu 常用命令之 chown 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 chown 命令在 Ubuntu 系统中用于改变文件或目录的所有者和组。这个命令的基本格式是 chown [选项]... [所有者][:[组]] 文件...。 chown 命令的主要参数有 -c 或 --changes&#xff1a;类似 verbose&#xff0c;但只在发生改变时…

【产品经理】Axure原型工具教程

笔记为项目总结笔记&#xff0c;若有错误欢迎指出哟~ Axure原型工具教程 Axure简介原型图分类常用操作常用原件常用交互母版常用设备分辨率 Axure简介 Axure是一款专业的原型设计与交互设计软件&#xff0c;可以帮助用户快速创建高保真的原型和交互设计。Axure支持多种常见的交…

java8实现List中对象属性的去重

java8的stream流能完美解对象集合去重问题. Data AllArgsConstructor NoArgsConstructor Builder public class UserCar {private Integer id;private String carNo;public static void main(String[] args) {List<UserCar> cars new ArrayList<>();cars.add(Use…

关于Selenium的网页对象单元测试的设计模式

写在前面&#xff1a;经过了实践总结一下经验&#xff0c;心得进行一个分享。 首先driver是可以单独抽出来的&#xff0c;变成一个driver函数放在driver.py。 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver…