前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx rewrite与proxy_pass共用问题分析二

nginx rewrite与proxy_pass共用问题分析二

作者头像
山行AI
发布2019-11-12 14:35:33
5.5K0
发布2019-11-12 14:35:33
举报
文章被收录于专栏:山行AI山行AI

昨天写了篇 nginx rewrite 与 proxypass 的问题分享,最初的配置是运维同学写的,细想了下发现 rewrite 与 proxypass 共用有点奇怪,感觉仍然有一些问题没有分析清楚,今天就再具体细致地分析一下。

前言

我们对比下同时使用 rewrite 与 proxy_pass 与单独使用其中一个的情况下,服务端获取到的 url 的表现。获取 url 的代码如下:

对比一

配置一

代码语言:javascript
复制
location /qz/ {
        #rewrite ^/qz/websocket/(.*)$ /websocket/$1 break ;
        proxy_pass http://websocketqz/;
        proxy_connect_timeout 60;
        proxy_send_timeout  60;
        proxy_read_timeout 3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'Upgrade';

       }

可见,这里的 rewrite 是注释掉了的。

请求一

浏览器请求:http://localhost:8888/qz/websocket/,服务器输出信息为:

代码语言:javascript
复制
before request method is:GET    req uri is:/websocket/-[]

nginx日志为:

代码语言:javascript
复制
127.0.0.1 - - [08/Nov/2019:11:32:12 +0800] "GET /qz/websocket/ HTTP/1.1" 404 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"

可以看到最后经过 proxy_pass 后进入 websocket 服务的路径为http://websocketqz/websocket/

请求二

浏览器请求:http://localhost:8888/qz/websocket,服务器输出信息为:

代码语言:javascript
复制
before request method is:GET    req uri is:/websocket-[]

nginx日志为:

代码语言:javascript
复制
127.0.0.1 - - [08/Nov/2019:11:32:06 +0800] "GET /qz/websocket HTTP/1.1" 404 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"

这种情况下由于/qz/websocket 的/qz/部分完全匹配了 location,则不会进行添加/进行 301 跳转的情况,会将websocket这一串添加到proxy_pass路径后面。

配置二

代码语言:javascript
复制
location /qz/websocket {
        #rewrite ^/qz/websocket/(.*)$ /websocket/$1 break ;
        proxy_pass http://websocketqz/;
        proxy_connect_timeout 60;
        proxy_send_timeout  60;
        proxy_read_timeout 3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'Upgrade';

       }

请求一

  • 请求路径:http://localhost:8888/qz/websocket/
  • 服务器输出:
代码语言:javascript
复制
before request method is:GET    req uri is://-[]
  • nginx日志为:
代码语言:javascript
复制
127.0.0.1 - - [08/Nov/2019:11:26:53 +0800] "GET /qz/websocket/ HTTP/1.1" 404 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"

也就是说经过 proxypass 后的请求为http://websocketqz//,这就是proxypass发挥作用了,与location匹配多出的部分是/,这个会被加在proxy_pass的后面。

请求二

  • 请求路径:http://localhost:8888/qz/websocket
  • 服务器输出:
代码语言:javascript
复制
before request method is:GET    req uri is:/-[]
  • nginx日志为:
代码语言:javascript
复制
127.0.0.1 - - [08/Nov/2019:11:26:55 +0800] "GET /qz/websocket HTTP/1.1" 404 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"

配置三

代码语言:javascript
复制
location /qz/websocket/ {
        #rewrite ^/qz/websocket/(.*)$ /websocket/$1 break ;
        proxy_pass http://websocketqz/;
        proxy_connect_timeout 60;
        proxy_send_timeout  60;
        proxy_read_timeout 3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'Upgrade';

       }

请求一

  • 请求路径: http://localhost:8888/qz/websocket/
  • 服务端输出为:
代码语言:javascript
复制
before request method is:GET    req uri is://-[]

请求二

  • GET 请求路径: http://localhost:8888/qz/websocket
  • 服务端输出为:
代码语言:javascript
复制
before request method is:GET    req uri is:/-[]
  • nginx 日志输出为:
代码语言:javascript
复制
127.0.0.1 - - [08/Nov/2019:11:20:41 +0800] "GET /qz/websocket HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"
127.0.0.1 - - [08/Nov/2019:11:20:41 +0800] "GET /qz/websocket/ HTTP/1.1" 404 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"

如果请求换成 post 方式,服务端输出为:

代码语言:javascript
复制
before request method is:GET    req uri is:/-[]

nginx 日志为:

代码语言:javascript
复制
127.0.0.1 - - [08/Nov/2019:11:20:54 +0800] "POST /qz/websocket HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"
127.0.0.1 - - [08/Nov/2019:11:20:54 +0800] "GET /qz/websocket/ HTTP/1.1" 404 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"

可以看到这里会有一次在/qz/websocket后加/然后进行301 重定向的行为,关于这点上篇中已经重点提到过,需要注意的是这次重定向会将原本的 POST 请求转换成 GET 请求。

分析

看了上面的对比,与上一篇的配置和表现和对比,有没有发现点什么问题?

我们不妨把rewrite规则放开,改成如下配置:

代码语言:javascript
复制
location /qz/ {
        rewrite ^/qz/websocket/(.*)$ /websocket/$1 break ;
        proxy_pass http://websocketqz/;
        proxy_connect_timeout 60;
        proxy_send_timeout  60;
        proxy_read_timeout 3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'Upgrade';

       }
  • 请求http://localhost:8888/qz/websocket,nginx日志无特殊,服务器输出req uri is:/websocket;
  • 请求http://localhost:8888/qz/websocket/,nginx日志无特殊变化,服务器输出req uri is:/websocket/。

在其他情况下把rewrite放开,也基本上没什么异样,情况与去掉rewrite规则时一模一样。可见,在这里rewrite基本是不需要的。proxy_pass已经满足需求了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开发架构二三事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 对比一
    • 配置一
      • 请求一
      • 请求二
    • 配置二
      • 请求一
      • 请求二
    • 配置三
      • 请求一
      • 请求二
  • 分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档