Nginx(11)_Nginx反向代理

你说的曾经没有我的故事 提交于 2020-01-23 16:13:10

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!