nginx反向代理负载均衡集群配置详解

反向代理负载均衡集群配置详解

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时站在服务器角度来看,代理服务器对外就表现为一个反向代理服务器。

对反向代理服务器的攻击并不会使得后端内网Web服务器上网页信息遭到破坏,增强了Web服务器的安全性。

ngx _ http _ proxy _ module模块:http/https协议反向代理

1、proxy_pass URL; :定义反向代理到的路径

适用范围:location, if in location, limit_except上下文中;URL为完整的路径
注意:
    匹配location后传递给后端请求路径情况解析( REMOTE-IP:后端主机IP地址):
    1) proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy  http://REMOTE-IP[:port];
            }
            ...
        }

    此时传递给后端的请求路径为:http://REMOTE-IP/uri/,直接补充在REMOTE-IP之后;
        http://HOSTNAME/uri --> http://REMOTE-IP/uri

    2)proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy http://REMOTE-IP/new_uri/;
            }
            ...
        }

    此时客户端请求被location的/uri/匹配到,跳转到后端请求路径将由/new uri/替换/uri/;
        http://HOSTNAME/uri/ --> http://REMOTE-IP/new_uri/

    3)如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri;
        server {
            ...
            server_name HOSTNAME;
            location ~|~* /uri/ {
                proxy http://REMOTE-IP;
            }
            ...
        }

    此时客户端请求时传递的uri将直接附加代理到的服务的之后;
        http://HOSTNAME/uri/ --> http://host/REMOTE-IP/

2、proxysetheader field value;用于proxy server向后端服务主机发请求报文时,将某请求首部重新赋值,或在原有值后面添加一个新的值; 也可以添加自定义首部;用于http, server, location配置段中

示例:
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部;

3、缓存相关的选项(缓存需要要先定义,再调用)

1)proxy_cache_path
    path [levels=levels]  [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
    定义缓存,可用上下文为http; (与fastcgi的缓存定义相似)

2)proxy_cache zone | off;
    指明要调用的缓存,或关闭缓存机制;用于http, server, location 上下文

3)proxy_cache_key string;
    缓存中用于“键”的内容;默认值为:proxy_cache_key $scheme$proxy_host$request_uri;

4)proxy_cache_valid [code ...] time;
    定义对特定响应码的响应内容的缓存时长;

    缓存定义示例:
        (定义在http上下文)
        proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
    调用缓存定义示例:
        定义在需要调用缓存功能的配置段,例如server{...};
        proxy_cache pxycache;
        proxy_cache_key $request_uri;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 1m;

5)proxy_cache_use_stale
    定义当代理服务器与后端主机通信出现故障时在哪种情况下,可以向客户端直接用缓存中缓存项响应给客户端;如下;
    proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

6)proxy_cache_methods GET | HEAD | POST ...;
    定义为哪种请求方法使用缓存;默认GET|HEAD 其他的不建议使用

7)proxy_buffering on | off;
    是否启用代理服务器对后端服务器的发送缓冲和接收缓冲
    默认proxy_buffering on;

8)proxy_buffers number size;
    定义启用代理服务器对后端服务器的发送缓冲和接收缓冲的buffer的数量和每个buffer的类型
    默认proxy_buffers 8 4k|8k;
    用于http,server,locaton上下文

9)proxy_buffer_size size;
    定义代理服务器对后端服务器的发送缓冲和接收缓冲的每个buffer的大小
    默认proxy_buffer_size 4k|8k;

4、proxy _ hide _ header field;

指明要隐藏响应给客户端header,默认情况下nginx是不传递header的

5、proxy _ connect _ timeout time;

定义代理服务器与后方服务器建立连接时的超时时长;默认是60s,最大不能超过75s

6、 连接相关的选项

当客户端请求,而后端服务器过于繁忙会返回给客户端502(BadGateway)服务器端错误,在例如此类情况下,肯能需要调整服务器端关于连接时长相关的选项

1)proxy_connect_timeout time;
    定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s;

2)proxy_send_timeout time;
    把请求发送给后端服务器的超时时长(定义两次请求报文之间时间间隔);默认为60s;

3)proxy_read_timeout time;
    等待后端服务器发送响应报文的超时时长;默认为60s;可以稍微长点.

ngx _ http _ headers _ module模块:管理header功能的模块

向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值;
用于http,server,location,if in location上下文

1、add_header name value [always];

添加自定义首部;
示例:
    add_header X-Via  $server_addr;
    add_header X-Accel $server_name;

2、expires [modified] time;用于定义Expire或Cache-Control首部的值;

expires epoch | max | off;允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值;
注释:
    Cache-Control:缓存控制机制
    Expires:用于改变原始服务器定义的响应报文的缓存时长

ngx _ http _ upstream _ module模块;用于把后端服务器定义成服务器组,实现负载均衡功能

1、upstream NAME { … }NAME为组名称

定义后端服务器组,会引入一个新的上下文;用于http上下文
    upstream httpdsrvs {
        server ...
        server...
        ...
    }

2、server address [parameters];在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;

address的表示格式:

unix:/PATH/TO/SOME_SOCK_FILE:只限用于本地通信
IP[:PORT]
HOSTNAME[:PORT]

常用参数(PARAMETERS):

weight=number:定义服务器权重,默认为1
max_fails=number:失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用;
fail_timeout=time:设置将服务器标记为不可用状态的超时时长;默认为10s,这是一个累计时长,而不是单次时长。
max_conns:当前的服务器的最大并发连接数;
backup:将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用;
down:标记为“不可用”;不再处理任何用户请求
示例:
    第一步:在http上下文中定义upstream服务器组
        upstream websrvs {
            server 192.168.25.129 weight=2 max_fails=2 fail_timeout=6s;
            server 192.168.25.130 weight=1 max_fails=2 down;
            server 192.168.25.130:8080 backup
        }                                
    第二步:在反向代理http段中(proxy_pass,fastcgi_pass, ...)进行调用;
        server {
            listen 80;
            server_name  www.ali.com;
            root /data/www;
            location  / {
                proxy_pass http://websrvs/;
            }
        }

3、least _ conn;

最少连接调度算法,当server拥有不同的权重时其为wlc;(当各server权重不同时,即为加权最少连接);最少连接算法通常只适用与那些长连接的协议。

4、ip _ hash;

源地址hash调度方法;把来自同一个ip地址的请求始终发往同一个backendserver,除非此backend server不可用;

5、hash key [consistent];基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;

作用:将请求分类,同一类请求将发往同一个upstream server;
示例:
    hash $request_uri consistent;
    hash $remote_addr;
    hash  $remote_addr相当于ip_hash;

常用的hash key:
     1) $cookie_name:
        将一个用户的请求始终发往同一个backendserver,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username;
     2) $request_uri:
        将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;

6、match NAME { … };此项配置只适用于nginxplus

对backendserver做健康状态检测时,定义其结果判断机制;只能用于http上下文;
常用的参数:
    status code[code ...]:期望的响应状态码;
    header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
    body:期望响应报文的主体部分应该有的内容;

7、health _ check [PARAMETERS];此项配置只适用于nginxplus

健康状态检测机制;只能用于location上下文;
常用参数:
    interval=#:检测的频率,默认为5秒;
    fails=#:判定服务器不可用的失败检测次数;默认为1次;
    passes=#:判定服务器可用的失败检测次数;默认为1次;
    uri=uri:做健康状态检测测试的目标uri;默认为/;
    match=NAME:健康状态检测的结果评估调用此处指定的match配置块;

8、keepalive connections;

为每个worker进程保留的空闲的长连接数量;

ngx _ stream _ core _ module模块;用于非http协议请求的分发功能。此功能在1.9以后的版本中才有

模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器;

1、stream { … }

定义stream相关的服务;Context:main
stream {
    upstream sshsrvs {
        server 192.168.22.2:22; 
        server 192.168.22.3:22; 
        least_conn;
    }

        server {
            listen 10.1.0.6:22022;
            proxy_pass sshsrvs;
        }
}

2、listen:结合与stream配置段中的监听地址

listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/58145

(0)
M20-1马星M20-1马星
上一篇 2016-11-07
下一篇 2016-11-07

相关推荐

  • AWK(一)

    本章内容:awk介绍;awk基本用法;awk变量;awk格式化;awk操作符;awk条件判断;awk循环;awk数组;awk函数;调用系统命令

    2018-01-01
  • Zabbix介绍、安装配置

    Zabbix介绍、安装配置 我们为什么需要监控? 常用的开源监控系统有哪些? Zabbix架构 Zabbix的安装和配置 总结 前言 本篇文章转自我的个人博客 http://anyisalin.com 欢迎大家访问 我们为什么需要监控? 没有监控就将系统上线, 就是在耍流氓; 在生产环境中, 监控是必不可少的, 因为我们需要实时了解业务的…

    2016-05-13
  • 磁盘分区管理之磁盘基础知识1

    1、磁盘基础知识 1.1 磁头 磁头是利用气流漂浮在盘片上,并没有接触到盘片,因而可以在各轨间高速来回移动,但如果磁头距离盘片太高,读取的信号就会太弱;太低又会磨到盘片表面,所以盘片表面必须相当光滑平整,任何异物和尘埃均会使得磁头摩擦到表面而造成数据永久性损坏。 硬盘读写磁头为了能在磁盘表面高速来回移动读取数据,则需漂浮在磁盘表面上,但是不能接触,接触就会造…

    Linux干货 2016-09-07
  • ansible基础应用

    ansible基础 一、运维主要工作 ansible聚集以上功能于一身,能够完整轻易的实现应用部署和批量命令功能,适用于主机数量不太多,再大的用puppet。 二、ansible特性 (1)模块化:调用特定的模块,完成特定任务; (2)基于python语言实现,由paramiko,PYYAML和JINJa2三个关键模块组成 (3)部署简单:agentless…

    Linux干货 2017-01-04
  • 网络基础知识札记

    Linux网络属性管理(1)     Bell(AT&T), PARC(Xerox)        以太网     计算机网络:共享底层通信信道         CSMA/CD算法      &nbsp…

    Linux干货 2016-09-06