nginx是由俄罗斯开发的一款http web服务器,我们经常用这款服务器做负载均衡和反向代理。
今天我们就来聊聊Nginx作为反向代理时,如何进行路由配置。
假设你已经部署好Nginx了,我们进入Nginx安装目录,进入nginx.conf文件。
找到http节点下的server节点,值是一个json。
在json中 有一个location的指令,就是代表转发。
一般是这样的形式:

location {$path} {
proxy_pass {$url};
}

{$path}代表匹配源url的部分,proxy_pass 后的{$url}则是代表要转发的目标url,

这里一般会涉及到转发时是否携带原有路径的问题。举个例子:

location /abc {
proxy_pass http://127.0.0.1:9090/;
}

如果我们请求 http://127.0.0.1:80/abc (假设nginx的服务器的是80)

则请求的路径path是/abc,此时会匹配到该location指令的规则 /abc,则请求会转发的本机的9090端口。
如果我们请求 http://127.0.0.1:80/abc/cloud
则请求的路径path是/abc/cloud,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )此时会匹配到该location指令的规则,则请求会转发的本机的9090端口。
但是问题来了,转发9090端口时,/abc要不要补充到后边?后边的/cloud部分要不要追加?
这里是和$url是否包含路径有关系,无斜杠就代表不包含路径,有斜杠就代表包含路径。

一、

如果:$url为http://127.0.0.1:9090 表示无路径
此种情况,会将源url的路径部分直接追加
举几个例子
(1)

location /abc {
proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/abc/bcd
(2)

location /abc/bcd {
proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/abc/bcd
(3)

location /abc/bcd/ {
proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd/

则跳转到http://127.0.0.1:9090/abc/bcd/

总结就是一句话,proxy_pass 后配置的目标url,如果没有路径信息(包括/),则会将源url的路径部分,直接追加到目标url中

二、

如果:$url为http://127.0.0.1:9090/ 表示有路径
如果:$url为http://127.0.0.1:9090/gov 表示有路径
如果:$url为http://127.0.0.1:9090/gov/ 表示有路径
此种情况,会将源url的路径部分去掉已匹配部分后,将剩余部分直接追加到目标url后,如图:

举几个例子

(1)

location /abc/ {
proxy_pass http://127.0.0.1:9090/;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/bcd
分析:
源url的路径部分是: “/abc/bcd”
与匹配规则“/abc/”匹配成功
匹配后剩余部分是“bcd”“http://127.0.0.1:9090/”追加“bcd”
则最终会跳转到http://127.0.0.1:9090/bcd
(2)

location /abc {
proxy_pass http://127.0.0.1:9090/gov;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/gov/bcd
(3)

location /abc/b {
proxy_pass http://127.0.0.1:9090/gov/;
}

请求http://127.0.0.1:80/abc/bcd/

则跳转到http://127.0.0.1:9090/gov/cd/
(4)

location /abc/b {
proxy_pass http://127.0.0.1:9090/gov/;
}

请求http://127.0.0.1:80/abc/b/cd/

则跳转到http://127.0.0.1:9090/gov//cd/

总结就是一句话,proxy_pass 后配置的目标url,如果有路径信息(包括/),则会将源url的路径部分匹配后剩余的部分路径,直接追加到目标url中

现在还有一个问题就是,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )如果有多个匹配规则都命中的话,那么nginx会怎么处理呢?

如下:

location / {
proxy_pass http://127.0.0.1:9091/gov/;
}
location /abc {
proxy_pass http://127.0.0.1:9092/gov/;
}
location /abc/ai {
proxy_pass http://127.0.0.1:9093/gov/;
}

请求http://127.0.0.1:80/abc/ai/

则nginx 会按照最大匹配原则的情况,选择匹配对象,此时就会将请求转发至9093端口

Nginx服务器配置---反向代理服务时proxy_pass的转发规则的更多相关文章

  1. 【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置

    > 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往 ...

  2. 如何取得nginx做反向代理时的真实IP?

    1. 编译 对于client -> nginx reverse proxy -> apache, 要想在程序中取得真实的IP,在执行nginx的configure时,必须指定参数" ...

  3. nginx做反向代理时获取真实IP

    原文:http://blog.csdn.net/aquester/article/details/48657395 1. 编译 对于client -> nginx reverse proxy - ...

  4. nginx做反向代理时出现302错误

    现象:nginx在使用非80端口做反向代理时,浏览器访问发现返回302错误 详细现象如下: 浏览器请求登录页: 输入账号密码点击登录: 很明显登录后跳转的地址少了端口号. 原因:proxy.conf文 ...

  5. nginx做反向代理时出现302错误(转载)

    现象:nginx在使用非80端口做反向代理时,浏览器访问发现返回302错误 详细现象如下: 浏览器请求登录页: 输入账号密码点击登录: 很明显登录后跳转的地址少了端口号. 原因:proxy.conf文 ...

  6. Nginx作为反向代理时传递客户端IP的设置方法

    因为nginx的优越性,现在越来越多的用户在生产环境中使用nginx作为前端,不管nginx在前端是做负载均衡还是只做简单的反向代理,都需要把日志转发到后端real server,以方便我们检查程序的 ...

  7. Nginx http反向代理流程Proxy_pass模块

    L:88 反向代理代码示列 server { listen ; server_name shop**.com.cn; location /{ proxy_pass http://test/www; p ...

  8. nginx的proxy_pass路径转发规则浅析(末尾/问题)

    源地址 : https://www.zifangsky.cn/917.html 一 location匹配路径末尾没有 / 此时proxy_pass后面的路径必须拼接location的路径:   1 2 ...

  9. (转)FIKKER和Nginx的反向代理服务功能对比评测报告

    转自:http://tieba.baidu.com/p/1268737304 针对高并发反向代理服务器 NGINX和FIKKER评测报告 测试硬件环境:服务端:CPU:E5200硬盘:SATA 133 ...

  10. Nginx做代理路由时,不转发http的header问题

    从header里面拿不到 TX_XID这种类型的字段, Nginx 会默认忽略含有 “_” 的 header 参数,而 TX_XID值的参数名恰好含有 “_” 符号,需要手动开启转发. 在 nginx ...

随机推荐

  1. 配置 Windows Boot Manager

    配置 Windows Boot Manager 通常需要使用 bcdedit 命令,这是一个命令行工具,用于管理 Boot Configuration Data (BCD) 存储.BCD 存储包含了启 ...

  2. C++ 项目目录结构

    目录结构 project_root/ ├── bin/ # 可执行文件目录 │ ├── my_app # 可执行文件 │ └── ... # 其他可执行文件或脚本 │ ├── build/ # 编译产 ...

  3. Docker学习11-Docker常规方式安装软件

    本文咱们将通过按照Tomcat.按照MySQL.安装Redis这三个实战安装,来熟悉在docker中怎么安装软件,咱们使用端口映射,及数据卷的使用场景 安装的总体步骤: 1:搜索镜像: 2:拉取镜像: ...

  4. qumu虚拟机启动后无法远程连接

    通过 virsh 在启动 qemu 虚拟机,可以通过 VNC 访问虚拟机,但无法通过设置的 SSH 的外部映射端口登录.首先在宿主机上查看虚拟机(csv\tpm\name)的网络配置,可以看到端口映射 ...

  5. 简单聊聊 CORS 攻击与防御

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霁明 什么是CORS CORS(跨域资源共享)是一种基于H ...

  6. CSS & JS Effect – Image Overlay

    介绍 一张背景图, 一行写字, 一层黑影 (Image Overlay), 如果没有做黑影, 字的颜色容易和图片撞, contrast 就会很烂. HTML 结构 <div class=&quo ...

  7. JVM(JAVA Virtual Machine)Java虚拟机

    JVM的跨平台性 一次编写,到处运行 JVM将字节码文件编译成对应操作系统的机器码 JVM的语言无关性 JVM的内存区域 虚拟机栈:在JVM运行过程中存储当前线程运行方法所需的数据,指令.返回地址 本 ...

  8. HEOI2024 题目转存

    赛时测试数据下载 wind xor wormhole maze timeline sleep 题解参考 [省选联考 2024] 季风 题目背景 生活在二维平面的小 X 准备拜访小 Y,但由于气候的变化 ...

  9. 17 模块subprocess、re

    1. subprocess模块 1.1 概念 subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值 简单理解:可以远程连接电脑(socket模块) 1.2 Pop ...

  10. 完美转发(模板)--T&&

    在C++模板编程中,完美转发(Perfect Forwarding)是一种技术,旨在保留函数参数的值类别,即在将参数传递到另一个函数时,无论参数是左值还是右值,都能够保持它的原始性质,而不会因为转发丢 ...