Nginx反向代理支持的协议
upstream模块
1、作用
upstream模块用于定义上游服务器的相关信息,如下图所示:
upstream模块默认已被编译进nginx,禁用需要使用--without-http-upstream_module
来编译nginx。
语法:
upstream name {
指令
}
默认值:无
上下文:http
2、指令集
指令 | 含义 |
---|---|
upstream | 段名,以{}开始和结束,中间定义上游服务URL |
server | 定义上游服务器地址 |
zone | 定义共享内存,用于跨worker子进程 |
keepalive | 对上游服务启用长连接 |
keepalive_requests | 一个长连接最多请求个数 |
keepalive_timeout | 空闲情形下,一个长连接的超时时长 |
hash | 哈希负载均衡算法 |
ip_hash | 依据IP进行哈希计算的负载均衡算法 |
least_conn | 最少连接数负载均衡算法 |
least_time | 最短响应时间负载均衡算法 |
random | 随机负载均衡算法 |
3、server指令使用
语法:server address [parameters]
默认值:无
上下文:upstream
parameters可选参数 | 含义 |
---|---|
weight=number | 权重值,默认为1,越大 表示服务器处理能力越强 |
max_conns=number | 上游服务器的最大并发连接数,超过之后直接拒绝 |
fail_timeout=time | 服务器不可用的判定时间,如果设置为10秒,max_fail设置为3,即10秒内,3次访问失败,则表示服务不可用,10秒过后会再次接受客户端请求,某次请求成功,计数会重置 |
max_fails=number | 服务器不可用的检查次数 |
backup | 备份服务器,仅当其他服务器都不可用时 |
down | 标记服务器长期不可用,离线维护 |
4、keepalive指令使用
功能:限制每个worker子进程与上游服务器空闲长连接的最大数量,保持一定的长连接数量,能够提高服务性能。
语法: keepalive connections;
默认值:无
上下文:upstream
示例:keepalive 16;
5、keepalive_requests指令使用
功能:单个长连接可用处理的最多HTTP请求个数。
默认值:keepalive_requests 100;
上下文:upstream
6、keepalive_timeout指令使用
功能:空闲长连接的最长保持时间,限时时间内没有长连接请求,长连接就会销毁。
默认值:keepalive_timeout 60s;
上下文:upstream
proxy_pass模块
说明:proxy_pass可以将请求进行代理转发,用于反向代理中。proxy_pass模块由http_proxy模块提供(ngx_http_proxy_module),默认已被编译进nginx,可以通过--without-http_proxy_module
来禁用。
语法:proxy_pass URL;
默认值:无
上下文:location、limit_except
示例:proxy_pass http://ip:port/url
注意:
- URL必须是已http或https开头
- URL中可以携带变量
- URL中是否带URL,会直接影响发往上游请求的URL
proxy_pass指令用法常见误区
proxy_pass后面的URL追加/
和不追加/
是有区别的,不追加的会将url原封不动的传递到应用服务器,追加/
的先找到应用服务器地址,然后将匹配到的URI去掉,如:proxy_pass http://ip:port/abc/
到应用服务器就是http://ip:port/
反向代理配置示例
upstream proxy_server {
server 101.200.147.104:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
keepalive 32;
keepalive_requests 80;
keepalive_timeout 20s;
}
server {
listen 8080;
server_name localhost;
location /proxy {
proxy_pass http://proxy_server/app;
}
}
反向代理处理客户端请求包体
1、proxy_request_buffering on | off;
说明:on表示nginx会开辟一个内存空间来缓存客户端发来的请求包体,然后再发给上游服务器,off表示不做缓存,收到客户端请求包体就直接发给上游服务器。
语法:proxy_request_buffering on;
上下文:http、server、location
2、client_max_body_size size;
说明:设置处理客户端请求体的大小。
默认值:client_max_body_size 1M;
上下文:http、server、location
应用场景,失败情况:
成功情况:
3、client_body_buffer_size size;
说明:设置缓冲区大小。32位通常默认是8k,64位是16k。
默认值:client_body_buffer_size 8k | 16k;
上下文:http、server、location
4、client_body_in_single_buffer on | off;
说明:on表示请求体会尽可能的分配到一块连续的内存空间,提高效率而不是离散存储。
默认值:client_body_in_single_buffer off;
上下文:http、server、location
5、client_body_temp_path path [level1] [level2] [level3];
说明:请求体存储磁盘目录。
默认值:client_body_temp_path client_body_temp;
上下文:http、server、location
6、client_body_in_file_only on | clean | off;
说明:
- on表示无论请求体大小大于还是小于client_body_buffer_size都会存储在磁盘上;
- clean表示无论请求体大小大于还是小于client_body_buffer_size都会存储在磁盘上,但是处理完成之后会清理掉磁盘文件;
- off表示禁止存储在磁盘上
默认值:client_body_in_file_only off;
上下文:http、server、location
7、client_body_timeout time;
说明:客户端与nginx建立连接后在限定时间内不发送请求体,则断开连接。
默认值:client_body_timeout 60s;
上下文:http、server、location
8、测试
配置如下:
server {
listen 8080;
server_name localhost;
location /app {
root /home/nginx/nginx/html;
index proxy.html;
proxy_method GET;
proxy_request_buffering on;
client_max_body_size 250k;
client_body_temp_path client_body_temp;
client_body_in_file_only on;
}
}
使用命令:curl -F "file=@/home/nginx/nginx/a.png" 101.200.147.104:8080/app/
上传文件
反向代理更改发往上游的用户请求
一、修改请求行
1、proxy_method GET | POST …;
说明:修改请求行方法。
默认值:无
上下文:http、server、location
2、proxy_http_version 1.0 | 1.1;
说明:修改请求行协议。
默认值:proxy_http_version 1.0;
上下文:http、server、location
二、修改请求头
1、proxy_set_header field value;
说明:修改请求头。
默认值:proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
长连接要改成keepalive
上下文:http、server、location
2、proxy_pass_request_headers on | off;
说明:开启或关闭客户端请求头是否发往上游服务器。
默认值:proxy_pass_request_header on;
上下文:http、server、location
三、修改请求体
1、proxy_set_body value;
说明:修改请求体。
默认值:无
上下文:http、server、location
2、proxy_pass_request_body on | off;
说明:开启或关闭客户端请求体是否发往上游服务器。
默认值:proxy_pass_request_body on;
上下文:http、server、location
四、测试服务
1、配置nginx.conf
server {
listen 8080;
server_name localhost;
location /app {
root /home/nginx/nginx/html;
index proxy.html;
return 200
"request_method: $request_method
uri: $uri
request: $request
http_test: $http_test
content_length: $content_length
content_type: $content_type\n";
}
}
2、输入命令curl -H "test: 'test header'" -d "name=rui&age=3" 101.200.147.104:8080/app/
3、显示结果如下
4、修改代理配置示例
server {
listen 8080;
server_name localhost;
location /app {
proxy_pass http://ip:port;
proxy_method PUT;
proxy_http_version 1.1;
proxy_set_header test "test header";
proxy_pass_request_headers on;
proxy_set_body "test body";
proxy_pass_request_body on;
}
}
5、使用tcpdump抓包示例
-
先查看网卡,执行ifconfig
-
执行监听命令
tcpdump -i eth0 port 8080 -A
-
发起请求
curl -H "test: 'test header'" -d "name=rui&age=3" 101.200.147.104:8080/app/
-
查看结果
反向代理其他请求配置
1、长连接
- 客户端到Nginx
keepalive_timeout 65;
上下文:upstream - Nginx到上游服务器
keepalive 32;
keepalive_requests 100;
keepalive_timeout 60s;
上下文:upstream
2、proxy_connect_timeout time
说明:nginx连接上游服务器(三次握手)的超时时间。
默认值:proxy_connect_timeout 60s;
上下文:http、server、location
3、proxy_socket_keepalive on | off;
说明:复用tcp协议层的长连接,tcp层长连接复用的是linux系统的长连接。
默认值:proxy_socket_keepalive off;
上下文:http、server、location
4、proxy_send_timeout time;
说明:Nginx在限定时间内没有向上游服务器发送数据,则连接断开。
默认值:proxy_send_timeout 60s;
上下文:http、server、location
5、proxy_ignore_client_bort on | off;
说明:是否忽略客户端请求退出,on表示如果客户端断开连接,nginx到上游服务器也会断开连接;off表示如果客户端断开连接,nginx到上游服务器会到请求响应结束后再断开。
默认值:proxy_ignore_client_bort off;
上下文:http、server、location
来源:CSDN
作者:ruiurrui
链接:https://blog.csdn.net/u010982507/article/details/104051506