Nginx: 代理场景下Nginx更改发往上游应用服务器的请求

2024-08-28 09:12

本文主要是介绍Nginx: 代理场景下Nginx更改发往上游应用服务器的请求,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

反向代理

  • 首先来看一下这样一个反向代理的图
  • Nginx 在这中间会有很多的指令,可以对用户发过来的一些请求包中的信息进行修改
  • 包括: 请求头, 请求行, 请求体都可以进行修改, 这对于在某一些特殊的场景下实现一些功能是有意义的
  • 也就是说,Nginx 可以将用户发来的请求包拆开,将里面的某一些内容做一些更改
  • 更改完之后,再将这些信息封包再把这些request信息发送到应用服务器

1 ) 一个HTTP请求过来以后,它包含了哪些信息

  • 请求通常是由三部分组成的: 请求头, 请求行, 请求体

2 )对请求行信息的更改方法

2.1 proxy_method 指令

  • 语法:proxy_method method;
  • 默认值:无
  • 上下文:http、server、location

2.2 proxy_http_version 指令

  • 语法:proxy_http_version 1.0 | 1.1;
  • 默认值:proxy_http_version 1.0;
    • 注意,1.0 不支持长连接
    • 如果要修改成 1.1,还要把 下面的 proxy_set header Connection 值修改成 “keep-alive”
    • 这样就修改成了长连接,eg: proxy_set_header Connection "keep-alive"; 这个不常用
  • 上下文:http、server、location

3 )对请求头的修改指令

3.1 proxy_set_header 指令

  • 修改请求头字段
  • 语法:proxy_set_header field value;
    • field 对应字段名称,比如:Host, User-Agent, Content-Length, …
  • 默认值:
    • proxy_set_header Host $proxy_host;
    • proxy_set header Connection close;
  • 上下文:http、server、location

3.2 proxy_pass_request_header 指令

  • 是否原封不动转发
  • 语法:proxy_pass_request_header on/off;
    • on 表示全部原封不动转发到上游服务器
    • off 表示头信息都不转发到上游服务器
  • 默认值:proxy_pass_request_header on;
  • 上下文:http、server、location

4 )对请求包体修改指令

4.1 proxy_set_body

  • 设置body
  • 语法:proxy_set_body value;
  • 默认值:无
  • 上下文:http、server、location

4.2 proxy_pass_request_body

    • 是否原封不动转发 和上面 3.2 一样的用法
  • 语法:proxy_pass_request_body on | off;
  • 默认值:proxy_pass_request_body on;
  • 上下文:http、server、location

5 )配置示例

5.1 上游应用服务器,这里简化,使用 nginx 来模拟, 假设应用服务器ip: 192.168.184.20

server {listen 8888;server_name localhost;location / {return 200    '以下是请求行变量:
request method:	        $request method
uri:		 			$uri
request:				$request
以下是请求头变量:
http test:				$http_test
content_length:			$content_length
content_type:			$content_type
';}
}

5.2 Nginx 代理服务器

server {listen 			8010;server_name 	proxy.baidu.com;location /request/ {proxy_pass  http://192.168.184.20:8888;}
}

5.3 初步测试

现在,某一个客户端请求中间这个 Nginx代理服务器,假设客户端配置好了本地 hosts

$ curlI -H "test: 'Test Variable'" -d "name=jack&age=25&score=99" proxy.baidu.com:8010/request/

以下是请求行变量:
request method:		GET
uri:				/request/
request:			GET /request/ HTTP/1.0
以下是请求头变量:
http_test:			'Test Variable'
content_length:      25
content_type:		 application/x-www-form-urlencoded

5.4 更改 Nginx 代理服务器

server {listen 			8010;server_name 	proxy.baidu.com;location /request/ {proxy_pass  http://192.168.184.20:8888;# 添加以下的修改proxy_method PUT;proxy_http_version 1.1;proxy_set_header test "var modified by nginx"# proxy_pass_request_headers off; # 这里默认on,这里关闭后,上面就没有意义了# proxy_set_body "XXXXXXXXXXXX" # 这里修改 body# proxy_pass_request_body off; # 这里关闭后,curl 中 -d 传递的全失效}
}

reload 配置

5.5 继续测试

回到客户端,继续请求

$ curlI -H "test: 'Test Variable'" proxy.baidu.com:8010/request/

以下是请求行变量:
request method:		PUT
uri:				/request/
request:			PUT /request/ HTTP/1.1
以下是请求头变量:
http_test:			'var modified by nginx'
content_length:      25
content_type:		 application/x-www-form-urlencoded
  • 如果想要继续测试,可以把上面 5.4 中 nginx 配置中的注释打开

这篇关于Nginx: 代理场景下Nginx更改发往上游应用服务器的请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Nginx配置location+rewrite实现隐性域名配置

《Nginx配置location+rewrite实现隐性域名配置》本文主要介绍了Nginx配置location+rewrite实现隐性域名配置,包括基于根目录、条件和反向代理+rewrite配置的隐性... 目录1、配置基于根目录的隐性域名(就是nginx反向代理)2、配置基于条件的隐性域名2.1、基于条件

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超