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 10:20
下一篇 2016-11-07 10:25

相关推荐

  • 网络管理(二)之IP地址划分子网、多块网卡共用单一IP

    网络管理(二)IP地址   一、认识学习IP地址的组成: 1、它们可唯一标识IP 网络中的每台设备 2、IP地址由两部分组成: 网络ID:标识网络;每个网段分配一个网络ID 主机ID:标识单个主机;由组织分配给各设备 3、点分十进制计法表示IPv4地址: 4、如下图,将系统中的IP地址用二进制表示,再通过转换合成的十进制数,使用ping命令可得出:…

    Linux干货 2016-09-05
  • 一键编译安装httpd服务

    一键编译安装httpd服务 背景: httpd服务是一个常用的web服务,所以很多地方会用到,这里写一个一键编译安装httpd服务的脚本。 环境: 系统:centos6.9和centos7.3(应该所有的6和7的版本都可以使用) httpd源代码版本:httpd-2.2.34.tar.bz2和httpd-2.4.27.tar.bz2 。下载网址官网:http…

    2017-09-16
  • httpd 基础

      http(1) 开启httpd服务,注意selinux 和防火墙设置。出现错误查看系统日志和http错误日志。 进程间通信:IPC socket:套接字 IP:PORT Client <–> Server     Server: listen  &nb…

    Linux干货 2016-11-01
  • HA cluster应用—CoroSync+Pacemaker

    HA cluster应用——CoroSync v2 (quorum system)+Pacemaker (standalone daemon)+ crmsh/pcsh corosync简述: Corosync是OpenAIS发展到Wilson版本后衍生出来的开放性集群引擎工程。可以说Corosync是OpenAIS工程的一部分。OpenAIS从openais…

    2016-11-27
  • 马哥教育网络班22期+第11周课程练习

    week11 1、详细描述一次加密通讯的过程,结合图示最佳。 2、描述创建私有CA的过程,以及为客户端发来的证书请求进行颁发证书。 3、描述DNS查询过程以及DNS服务器类别。 4、搭建一套DNS服务器,负责解析magedu.com域名(自行设定主机名及IP)   (1)、能够对一些主机名进行正向解析和逆向解析;   …

    Linux干货 2016-11-07
  • 马哥教育网络20期+第8周练习博客

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:链接层设备,基于MAC地址过滤。 集线器:物理层设备,基本都属于半双工模式。集线器与网桥在现在的局域网中基本都不用了。 二层交换机:基本MAC转发数据,功能齐全的可支持VLAN等功能。常见的有100/1000M、16口/24口/48口。 三层交换机:功能齐全的交换机,具备都…

    Linux干货 2016-08-01