记一次Nginx代理配置的奇怪经历

news2024/11/27 12:35:01

目录

1 背景

2 需求

3 方案

4 问题

5 解决方案

6 最后记录

7 参考文献


1 背景

        最近我们在做一个能源类智能化转型的项目,整个项目非常大,下面有很多的子项目组。不同项目组之间都是独立的子系统。 客户对技术上做了统一要求,使用统一的微服务架构,使用统一的注册中心,统一管控。 希望通过这种方式,打破系统之间的数据壁垒。

        这是一种很好的思路,但实际实施的时候困难重重,因为各个子项目组是不同的供应商支撑,各项目组在正式进入的时候,就已经在赶工期,赶功能,而技术规范、技术要求是后来提出的,而且整个大的项目组又缺少统一的技术负责人 ,或者说缺少能实际落地接地气的技术负责人,就造成从上还是理论化的要求技术统一、框架统一,但是到各个子系统还是自己做自己的。 

        这种情况我遇到不止一次,很多大的集团,大的企业都会这样理想的想法,为了后期自主接手做准备,做统一的技术要求,统一的规范,但能落地的真是凤毛麟角。 我想主要有以下几个原因:

        ① 太过于“急功近利”,项目的deadline和工作量之间有不可调和矛盾,交付了先解决眼下直观的问题往往优先级最高。

        ② 部门太多,人多,就会有各种各种的阻力

        ③ 大领导不懂技术,或者根本不重视技术

        ④ 计划和规划太滞后,甲方缺乏坚定推陈换新,又能接地气的技术负责人

        大集团的企业信息化转型,任重道远,也正是如此,我们这些乙方才能不断有机会有饭吃。

2 需求

        我们所在子项目组,需要调用智能化团队的两个接口,双方在约定好接口规范之后,智能化团队直接给了两个无需校验的post-json接口,我们需要将这两个接口对接上,并将数据回显到页面。

3 方案

        关于这种对接,比较常见的一种方式就是我们自己的后端应用调用智能化的接口,然后我们自己封装接口出来给前端调用。 这种方式可以避免前端跨域请求,也能更好的屏蔽接口细节,而且还能对接口做加工,记录日志等等。

        但是考虑到系统之间的对接容易扯皮,拉扯,而且这两个接口的出入参非常简单,对于业务功能上也仅仅是将内容做展示,我们最终确定的方案是前端直接对接,不通过后端中转,这样如果出问题了,会第一时间在前端有体现,容易将责任划分清楚。 

4 问题

        前端直接对对方的接口,最直接的问题就是跨域访问,另外一个就是前端资源打包的时候,对于外围系统的接口要做ip:port的配置,这就很繁琐或者不方便了。

        基于此一种非常常见的解决方法就是通过nginx做代理转发。 现在的软件架构基本上都已经前后端分离的方式,部署的方案很多时候也是前后端分离部署,前端放到Nginx静态代理中去访问,后端接口通过nginx转发到对应的后端服务去,就这个场景对于我们而言,无非就是nginx上多配置一个代理,多了一个服务而已,这太简单了。 两个接口信息如下:

http://127.0.0.1:8895/iio-data-recognition/specRecommend

http://127.0.0.1:8895/iio-data-recognition/specRecognition

我们的系统入口为:

http://127.0.0.1:9001/platform/#/login

我给集成的小伙说,去做个代理,代理规则如下:
http://127.0.0.1:9001/iio-data-recognition/specRecommend →  http://127.0.0.1:8895/iio-data-recognition/specRecommend

http://127.0.0.1:9001/iio-data-recognition/specRecognition →  http://127.0.0.1:8895/iio-data-recognition/specRecognition

这很清晰了,对于nginx上来说,就是简单的location匹配就好了。

集成的同学配好之后,让前端做验证,发现一直报如下错误:

我本地使用postman尝试了下,发现一直报请求方式不支持

        但是,明明已经是post请求了,为什么通过一层转发就变成了get请求? 这太诡异了。 

然后集成的同学,尝试加了一个proxy_method POST,如下:

        还是不行,后端开始报body没有携带参数。 

        百思不得其解,想着是不是接口有问题,尝试直接在Nginx所在主机上,使用curl post方式请求,发现接口正常返回,这就说明还是出在代理上。 

5 解决方案

        仔细看了代理的配置,从配置上看好像也没什么毛病,但是其实这两个接口有相同的上下文,完全没必要在location的匹配上落到接口层面,直接对上下文iio-data-recognition做匹配,然后转发即可。 最后调整如下:

问题消除!

6 最后记录

        为什么会出现这样的问题?

        参考 Nginx转发post请求变get请求_nginx post-CSDN博客这里,这篇博客讲的更彻底更清晰。 

        我理解主要还是和location、proxy_pass中配置带/不带/,或者带到哪儿有关系。这块的信息参考如下两段引用,尤其第二段,摆事实非常清晰。 

7 参考文献

【1】nginx location/区别详解

【2】Nginx转发post请求变get请求

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

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

相关文章

SpringBoot 自动配置(Condition)

一.Condition Condition 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操 作。 案例:需求1 在 Spring 的 IOC 容器中有一个 User 的 Bean,现要求: 1. 导入Jedis坐标后,加载该Bean…

基于STM32开发的智能农业灌溉系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 农田自动化灌溉家庭园艺智能浇灌常见问题及解决方案 常见问题解决方案结论 1. 引言 智能农业灌溉系统通过集成多种传感器,实时监测土壤湿度、温度、…

​【迅为电子】RK3568驱动指南|第十七篇 串口-第196章 串口简介

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

项目视图组(基于模型)Model-Based-Qt-思维导图-学习笔记

项目视图组(基于模型)Model-Based Model-Based (1)List View:清单视图 QListView 继承关系:继承自 QAbstractItemView,被 QListWidget 和 QUndoView 继承 功能:提供模型上的列表或图标视图,以非分层列表…

通过连接数据库演示解耦过程

一、什么是解耦? 解耦就是为了降低程序之间的耦合性,在软件工程中,对象之间的耦合度就是对象之间的关联度。程序之间耦合度越高,程序维护起来也就越困难,即程序维护成本高。所以我们需要通过现有方法降低耦合性&#x…

oss学习问题记录

1.在使用oss上传文档时,根据返回的地址访问上传的图片,会报错误如下:This XML file does not appear to have any style information associated with it. The document tree is shown below. 在设置了上传的文档类型和代码设置读写权限之后 …

Redis的基本概念和使用

目录 一、Redis简介 1、NOSQL 2、NOSQL和关系型数据库比较 3、主流的NOSQL产品 4、什么是Redis 5、启动Redis 二、Redis基本操作 1、大概操作 三、 Redis 数据类型(5种常用) 1、redis 数据存储格式 2、String 3、hash 4、list 5、Set 6、…

面试题-Spring Bean的生命周期

文章目录 Spring Bean 生命周期分为哪几个阶段浅析Bean生命周期源码实现1.1 DefaultListableBeanFactory1.2 createBean2.1 populateBean3.1 initializeBean3.2 invokeInitMethod3.3 applyBeanPostProcessorsBeforeInitialization5.1 destroyBean5.2 invokeDestroyMethod Sprin…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取,还是运用的是requests方法 首先进入bilibili官网中,选取你想要爬取的视频,进入视频播放页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要…

一次评审会议上的纠偏

这段时间,整个项目组都投入在某个专项项目中,评审和版本迭代的频率也很高。而在近期的评审会上,发生了一起激烈的争辩,也让我意识到大多数产品人身上的通病,觉得挺有意义的,借此分享给大家。 同事A最近在做…

Qt窗口交互场景、子窗口数据获取

一、前言 在现代软件开发中,图形用户界面(GUI)的设计不仅仅关乎美观,更在于用户体验和功能的无缝衔接。Qt框架以其强大的跨平台能力和丰富的组件库,成为众多开发者构建GUI应用的首选工具。在Qt应用中,窗口…

​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​

目录 微机原理判断指令是否正确【见的多了,你就懂了~】 1. 立即数不能作为目标操作数 2. 操作数位数必须匹配 3. 需要指定存储器操作数的字节或字 4. 两个操作数不能同时为存储器操作数 5. 循环次数超过1必须使用CL寄存器 6. 段寄存器限制(特别是…

比OpenAI的Whisper快50%,最新开源语音模型

生成式AI初创公司aiOla在官网开源了最新语音模型Whisper-Medusa,推理效率比OpenAI开源的Whisper快50%。 aiOla在Whisper的架构之上进行了修改采用了“多头注意力”机制的并行计算方法,允许模型在每个推理步骤中预测多个token,同时不会损失性…

[000-01-010].第02节:Spring基础开发环境搭建

1.1.新建空项目: 1.新建Empty项目,主要是为了方便之后把各个模块的代码统一的放在一起: 2.设置JDK: 3.设置maven版本: 1.2.建立第一个Spring项目模块: 1.新建模块: 2.配置依赖&#xff…

gitlab自动部署是什么 gitlab自动部署如何进行操作

在现代软件开发流程中,自动化部署是提高效率和确保软件质量的关键环节。GitLab作为一个强大的DevOps平台,提供了完整的自动部署工具,帮助开发团队实现代码从编写到生产的无缝转换。本文将详细解析GitLab的自动部署功能是什么,如何…

走向绿色:能源新选择,未来更美好

当前,全球范围内可再生能源正经历着从辅助能源向核心能源的深刻转型,绿色能源日益渗透至居住、出行、日常应用等多个领域,深刻影响着我们的生活方式,使我们能够更加充分地体验清洁能源所带来的优质生活。 一、绿色能源与“住” …

Fluent学习笔记——催化转化器内流场仿真(含多孔介质)

参考课程: 标题:【ANSYS Fluent教程|流体仿真基础入门105讲(官方最新案例讲解)】 作者:仿真秀APP 选集:P35-P40https://www.bilibili.com/video/BV1vT4y1z7on?p35&vd_source7e977d0187273d77005659cdd…

数据结构(03):线性表的逻辑结构

线性表的逻辑结构 在谈论逻辑结构的时候,我们不讨论具体数据在物理内存中的存储细节,而只关注线性表的逻辑结构。数据结构系列文章02介绍过常见的逻辑结构有:集合、线性表结构、树结构和图结构等。 A.What(什么是线性表&#xff0…

什么是凤凰雪球期权?和雪球期权有什么区别?

凤凰结构,和经典雪球结构类似,属于障碍期权的一种。凤凰结构中包括敲入事件,也包括敲出事件,最后的收益取决于挂钩标的走势和敲入、敲出事件发生的时间,不过在收益计算规则上与雪球有所不同,下文为大家科普…

deepin V23 Release 安装与功能介绍!!!

原文链接:deepin V23 Release 安装与功能介绍!!! Hello,大家好啊!2024年8月15日,deepin正式发布了最新版操作系统——deepin V23。今天,我将为大家带来一篇关于deepin V23的安装及功…