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

相关推荐

  • 逻辑卷的创建与移除

    一、弹性控制磁盘大小的lvm:     假如有这样一个场景,在初始安装linux系统时给 /home分区设置了一定大小,但是过了一段时间后,你发现初始分配的大小远不能满足公司的扩大,员工增加,需要分配的账号的磁盘空间也变大,这时你应该怎么办?是挂载一块更大的硬盘,将原来的小硬盘拆除掉吗?其实在linux中有lvm可动态增大文件系…

    Linux干货 2016-08-30
  • Unix发展与现状

    Unix 简史 1965年时,贝尔实验室(Bell Labs)加入一项由奇异电子(General Electric)和麻省理工学院(MIT)合作的计划;该计划要建立一套多使用者、多任务、多层次(multi-user、multi- processor、multi-level)的MULTICS操作系统。直到1969年,因MULTICS计划的工作进度太慢,该计划就…

    Linux干货 2015-09-22
  • N28-第四周:正则表达式练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。
    2、编辑/etc/group文件,添加组hadoop。
    3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop。
    4、复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。
    5、修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。
    6、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
    7、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
    8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
    9、找出/etc/passwd文件中的一位数或两位数;
    10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
    11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
    12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
    13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

    2017-12-24
  • 我的学习宣言,不忘初心

    Dear 马哥: 我相信选择马哥教育是正确的。 我将用洪荒之力的努力来成为一名合格的马帮门徒! 一定不学中国足球。 敬礼 自学生 朱宏

    Linux干货 2016-10-30
  • N25-第三周作业

    N25第三周作业 博客作业 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@ip-172-31-25-9 ~]# who|awk '{print $1}'|sort -u ec2-user [root@ip-172-31-25-9&n…

    Linux干货 2017-02-06
  • 马哥教育网络班22期+第02周课程练习

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 cp:复制命令,copy的简称 复制选项详解: 1、交互式复制:root用户默认添加-i参数,普通用户默认使用命令本身,root用户也想使用命令本身需在命令前增加"\" [root@bogon ~]# ls /tmp/ newfil…

    Linux干货 2016-09-02