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

相关推荐

  • N22-第一周博客作业

    1、计算机的组成和及其功能? 计算机由硬件,操作系统,软件三大部分组成。 硬件: 计算机系统中所使用的电子线路和物理设备,主要由中央处理器( CPU )、存储器、外部设备(输入输出设备、I/O设备)及总线等组成。 a、中央处理器(CPU)的主要功能是根据存储器内的程序 ,逐条地执行程序所指定的操作。中央处理器的主要组成部分是:数据寄存器、指令寄存器、指令译码…

    Linux干货 2016-08-15
  • Nginx七层反代服务器 (Blog 20)

    http反代、fastcgi反代

    Linux干货 2017-12-20
  • Linux运维实战之5:磁盘分区、格式化

    在网络系统中,磁盘和文件系统管理是两个非常基本、同时也是非常重要的管理任务,特别是文件系统管理,因为它与用户权限和整个网络系统的安全息息相关。本次博文的主题是关于Linux系统中磁盘分区、格式化及挂载,下次博文我们再详细讨论文件系统管理。 在操作系统中,磁盘管理属于设备管理的范畴。一块硬盘安装到主机之后称为裸设备,若要能够在Linux系统中使用必须对其进行如…

    Linux干货 2016-11-26
  • Linux下编译安装httpd

    本章学习内容         ———介绍httpd         ———-rpm和yum不同   &nbs…

    Linux干货 2016-08-25
  • linux运维

    linux运维大纲,学习路线图

    Linux干货 2017-10-21
  • 初步了解计算机组成及Linux系统

    一、计算机的组成及其功能: 计算机主要由三部分组成: 输入单元:包括键盘、鼠标、卡片阅读器、扫描仪、手写板等。 输出单元使我们能够将一些数据输入到主机里,然后再由主机的功能处理成为图表或文章等信息后,将结果传输到输出设备,如屏幕或打印机上面。 中央处理器(CPU):其中包含算数逻辑、控制、记忆等单元。 CPU作为一个具有特定功能的芯片,里面含有微指令集,如果…

    Linux干货 2017-09-24