- 反向代理服务器介于用户和真实服务器之间,提供请求和响应的中转服务
- 对于用户而言,访问反向代理服务器就是访问真实服务器
- 反向代理可以有效降低服务器的负载消耗,提升效率
upstream模块
定义上游服务器的连接信息,请求控制之类的基本信息。
| 指令 | 含议 |
|---|---|
| upstream | 段名,以{开始, }结束,中间定义上游服务URL |
| server | 定义上游服务地址 |
| zone | 定义共享内存,用于跨worker子进程 |
| keepalive | 对上游服务启用长连接 |
| keepalive_ requests | 一个长连接最多请求个数 |
| keepalive_timeout | 空闲情形下,一个长连接的超时时长 |
| hash | 哈希负载均衡算法 |
| ip_hash | 依据IP进行哈希计算的负载均衡算法 |
| least_conn | 最少连接数负载均衡算法 |
| least_time | 最短响应时间负载均衡算法 |
| random | 随机负载均衡算法 |
上游服务器server 配置参数
| weight=number | 权重值,默认为1 |
|---|---|
| max_conns= number | 上游服务器的最大并发连接数 |
| fail_timeout= time | 服务器不可用的判定时间 |
| max_fails= number | 服务器不可用的检查次数 |
| backup | 备份服务器仅当其他服务 器都不可用时 |
| down | 标记服务器长期不可用,离线维护 |
默认已被编译进Nginx 禁用须通过--without-http_upstream_module
配置示例
就是说在10秒内有两次请求失败 就会认为服务器不可用
upstream 名称{server 代理地址 weight=3 max_conns= 1000 fail_timeout=10s max_fails=2;keepalive 32; # 上游空闲长连接最大数量keepalive_requests 50; # 单个长连接可以处理的最多http请求个数keepalive_timeout 30s; # 空闲长连接超过这个时间没请求就销毁}upstream 与 server一个层级
负载均衡配置示例
nginx默认是轮询server
upstream 名称{server 代理地址;server 代理地址;#------不考虑上游服务器处理能力来负载hash $变量名;# 这个就是单纯客户端配置以什么算hash值来负载ip_hash; #单纯以ip算hash值#------考虑上游服务器能力 怎么维护服务器的信息,是多个worker子进程通过共享内存zone 内存名称 10M; # 通过共享内存维护上游服务器信息least_conn; #挑选服务器处理连接数最少的,如果都一样 退化轮询;least_time; #最短响应时间}
当上游服务器错误
当 upstream上游服务器出错后请求转发到 proxy_next_upstream
语法:proxy_next_upstream error| timeout|invalid_header|http_500| http_502|http_503|http_504|http_403| http_404| http_429|no_idempotent|off# no_idempotent: 对非幂等请求失败是否需要转发 加上就会重试转发默认值: proxy_next_upstream error timeout ;上下文:http、server、 location需要配置 proxy_next_upstream_timeout 等待时间 proxy_next_upstream_tries 重试转发次数两个参数 默认都是0proxy_intercept_errors on|off #上游返回响应码大于300 是直接响应还是按照error_page处理默认on打开会使用error_page 关闭会直接返回上游信息需要增加配置 error_page 503 /503.html也可以error_page 503 =200 /503.html 这样用户看到的就是200状态码
proxy_pass指令
默认已被编译进Nginx 禁用须通过--without-http_proxy_module
语法: proxy_ pass URL url必须http或者https开头上下文: location、 if、limit_except
upsteam back_end {server 192.168.184.20:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;keepalive 32;keepalive requests 80;keepalive timeout 20s;}server{listen 80;server_name proxy.kutian.edu;location /proxy/ {proxy_pass http://back_end/proxy;}## proxy_pass http://back_end/proxy/## 尾部带反斜线nginx会更改url删除location后面地址## 不带反斜线会原封不动请求到上游服务器
客户端请求代理服务器请求信息
客户端超过这些规则 会返回413
location /proxy/ {proxy_pass http://back_end/proxy; #上游服务器proxy_request_buffering on; # 打开缓冲默认打开。请求接收完在转发:nginx处理比较快,上有服务器处理比较低 利用缓存来提升吞吐量client_max_body_size 250k; #最大body大小client_body_buffer_size 100k;#客户端缓冲大小client_body_temp_path test_body_path;#当大于缓冲大小 小于body大小 会把请求持久化到磁盘的位置client_body_in_file_only on; #不管请求体多大 都会把请求持久化到磁盘 默认off处理完成会删除client_body_in_single_buffer on;#连续存储磁盘空间 默认off不连续client_body_timeout 30; #链接超时时间}
代理更改请求上游服务器
location /proxy/ {proxy_pass http://back_end/proxy; #上游服务器proxy_method PUT; #请求方式修改proxy_http_version 1.1;# http版本 要支持长连接 必须是1.1 并且要与上游服务器使用长连接还需要设置headerproxy_pass_request_headers off; #默认打开 全部转发上游服务器proxy_pass_request_body off; #默认打开proxy_set_body "body信息"; # 上面关闭不影响proxy_set_header test "header参数信息"; # 向头部插入信息 上面关闭不影响}注意 proxy_set_header 默认重定义两个 Header 头字段,proxy_set_header Host $proxy_host;proxy_set_header Connection close;Host 初始值 $proxy_host,这是因为 HTTP/1.1 必须包含 Host 字段以指定主机;至于 $proxy_host 跟 $host 的区别,前者是 backend 即后端的主机名,后者是 frontend 即自身的主机名。该字段要不要改成 $host 或 $http_host,视后端会不会校验域名和端口而定Connection 初始值 close,也是因为在 HTTP/1.1 中所有连接都是长连接 (keep-alive),除非声明 close 表示不需要,而后端的 Web 应用程序 (HTTP/1.0 或更古早的) 未必支持连接复用,所以统统设成 close 以免出错。跟后端通讯真需要用到 keep-alive,先配置一组 upstream (上游服务器),回头再清空 Connection 字段即可。即 proxy_set_header Connection "";
连接指令
proxy_connect_timeout 60s; # 连接超时时间,比如3次握手 适用于http、server、locationproxy_socket_keepalive on|off;#默认off;通过socket 替换长连接 适用于http、server、locationproxy_send_timeout time;#默认值60s; 发送超时时间的超时时间 适用于http、server、locationproxy_ignore_client_bort on|off; #是否忽略客户端请求退出,on表示如果客户端断开连接,nginx到上游服务器也会断开连接;off表示如果客户端断开连接,nginx到上游服务器会到请求响应结束后再断开 默认关闭
