本文主要是介绍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更改发往上游应用服务器的请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!