• 反向代理服务器介于用户和真实服务器之间,提供请求和响应的中转服务
  • 对于用户而言,访问反向代理服务器就是访问真实服务器
  • 反向代理可以有效降低服务器的负载消耗,提升效率

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秒内有两次请求失败 就会认为服务器不可用

  1. upstream 名称{
  2. server 代理地址 weight=3 max_conns= 1000 fail_timeout=10s max_fails=2;
  3. keepalive 32; # 上游空闲长连接最大数量
  4. keepalive_requests 50; # 单个长连接可以处理的最多http请求个数
  5. keepalive_timeout 30s; # 空闲长连接超过这个时间没请求就销毁
  6. }
  7. upstream server一个层级

负载均衡配置示例

nginx默认是轮询server

  1. upstream 名称{
  2. server 代理地址;
  3. server 代理地址;
  4. #------不考虑上游服务器处理能力来负载
  5. hash $变量名;# 这个就是单纯客户端配置以什么算hash值来负载
  6. ip_hash; #单纯以ip算hash值
  7. #------考虑上游服务器能力 怎么维护服务器的信息,是多个worker子进程通过共享内存
  8. zone 内存名称 10M; # 通过共享内存维护上游服务器信息
  9. least_conn; #挑选服务器处理连接数最少的,如果都一样 退化轮询;
  10. least_time; #最短响应时间
  11. }

当上游服务器错误

当 upstream上游服务器出错后请求转发到 proxy_next_upstream

  1. 语法:
  2. proxy_next_upstream error| timeout|
  3. invalid_header|http_500| http_502|http_503|http_504|http_403| http_404| http_429|no_idempotent|off
  4. # no_idempotent: 对非幂等请求失败是否需要转发 加上就会重试转发
  5. 默认值: proxy_next_upstream error timeout ;
  6. 上下文:httpserver location
  7. 需要配置 proxy_next_upstream_timeout 等待时间 proxy_next_upstream_tries 重试转发次数
  8. 两个参数 默认都是0
  9. proxy_intercept_errors on|off #上游返回响应码大于300 是直接响应还是按照error_page处理
  10. 默认on打开会使用error_page 关闭会直接返回上游信息
  11. 需要增加配置 error_page 503 /503.html
  12. 也可以error_page 503 =200 /503.html 这样用户看到的就是200状态码

proxy_pass指令

默认已被编译进Nginx 禁用须通过--without-http_proxy_module

  1. 语法: proxy_ pass URL url必须http或者https开头
  2. 上下文: location iflimit_except
  1. upsteam back_end {
  2. server 192.168.184.20:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
  3. keepalive 32;
  4. keepalive requests 80;
  5. keepalive timeout 20s;
  6. }
  7. server{
  8. listen 80;
  9. server_name proxy.kutian.edu;
  10. location /proxy/ {
  11. proxy_pass http://back_end/proxy;
  12. }
  13. ## proxy_pass http://back_end/proxy/
  14. ## 尾部带反斜线nginx会更改url删除location后面地址
  15. ## 不带反斜线会原封不动请求到上游服务器

客户端请求代理服务器请求信息

客户端超过这些规则 会返回413

  1. location /proxy/ {
  2. proxy_pass http://back_end/proxy; #上游服务器
  3. proxy_request_buffering on; # 打开缓冲默认打开。请求接收完在转发:nginx处理比较快,上有服务器处理比较低 利用缓存来提升吞吐量
  4. client_max_body_size 250k; #最大body大小
  5. client_body_buffer_size 100k;#客户端缓冲大小
  6. client_body_temp_path test_body_path;#当大于缓冲大小 小于body大小 会把请求持久化到磁盘的位置
  7. client_body_in_file_only on; #不管请求体多大 都会把请求持久化到磁盘 默认off处理完成会删除
  8. client_body_in_single_buffer on;#连续存储磁盘空间 默认off不连续
  9. client_body_timeout 30; #链接超时时间
  10. }

代理更改请求上游服务器

  1. location /proxy/ {
  2. proxy_pass http://back_end/proxy; #上游服务器
  3. proxy_method PUT; #请求方式修改
  4. proxy_http_version 1.1;# http版本 要支持长连接 必须是1.1 并且要与上游服务器使用长连接还需要设置header
  5. proxy_pass_request_headers off; #默认打开 全部转发上游服务器
  6. proxy_pass_request_body off; #默认打开
  7. proxy_set_body "body信息"; # 上面关闭不影响
  8. proxy_set_header test "header参数信息"; # 向头部插入信息 上面关闭不影响
  9. }
  10. 注意 proxy_set_header 默认重定义两个 Header 头字段,
  11. proxy_set_header Host $proxy_host;
  12. proxy_set_header Connection close;
  13. Host 初始值 $proxy_host,这是因为 HTTP/1.1 必须包含 Host 字段以指定主机;至于 $proxy_host $host 的区别,前者是 backend 即后端的主机名,后者是 frontend 即自身的主机名。该字段要不要改成 $host $http_host,视后端会不会校验域名和端口而定
  14. Connection 初始值 close,也是因为在 HTTP/1.1 中所有连接都是长连接 (keep-alive),除非声明 close 表示不需要,而后端的 Web 应用程序 (HTTP/1.0 或更古早的) 未必支持连接复用,所以统统设成 close 以免出错。跟后端通讯真需要用到 keep-alive,先配置一组 upstream (上游服务器),回头再清空 Connection 字段即可。即 proxy_set_header Connection "";

连接指令

  1. proxy_connect_timeout 60s; # 连接超时时间,比如3次握手 适用于http、server、location
  2. proxy_socket_keepalive on|off;#默认off;通过socket 替换长连接 适用于httpserverlocation
  3. proxy_send_timeout time;#默认值60s; 发送超时时间的超时时间 适用于httpserverlocation
  4. proxy_ignore_client_bort on|off; #是否忽略客户端请求退出,on表示如果客户端断开连接,nginx到上游服务器也会断开连接;off表示如果客户端断开连接,nginx到上游服务器会到请求响应结束后再断开 默认关闭