Nginx服务器配置---反向代理服务时proxy_pass的转发规则

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端口