1. NGINX实现负载均衡功能

1.1 nginx负载均衡概述

  • 负载均衡的作用

    负载均衡,load balance,指的是将用户的应用请求进行平衡,分摊到多个应用节点进行处理。

    负载均衡增加了应用的服务能力和可用性。

    当单台web服务器为直接为用户提供服务时,在面对超大并发量的用户请求时服务器性能难以承受,因此我们会进行横向扩展,使用多台WEB服务器组成WEB服务集群为用户提供服务,这样前端就需要有一个负载均衡设备,按照一定的算法为后端服务器集群分发用户请求,从而实现提升整体性能和系统的容灾能力。

  • 负载均衡与代理的区别

    • 代理一般只代理一台服务器;
    • 负载则是代理一个服务器集群,并且按照一定的算法将流量分发给后端服务器集群;
  • 负载均衡分类

    负载均衡根据代理的层次可以分为四层负载均衡和七层负载均衡。

    • 四层负载均衡

      在传输层进行负载均衡,仅需要对客户端的请求在TCP/UDP层进行包转发就可以实现。

      四层负载均衡的性能极好,因为只需要在TCP层进行处理,无需解析应用层,理解应用层复杂的逻辑。

    • 七层负载均衡

      在应用层进行负载均衡,需要解析应用层报文,根据应用层信息进行负载。七层负载均衡可以完成应用方面的协议请求,比如nginx实现的http层负载,可以实现http头信息的改写,安全应用规则控制,URI匹配控制,rewrite等功能。

      七层负载均衡相比四层性能会比较差,因为需要解析应用层信息。

1.2 nginx实现http的负载均衡

1.2.1 nginx基于http负载均衡场景配置

nginx实现http负载均衡功能由ngx_http_upstream_module模块提供。

实验场景中用到的服务器和地址如下图:

  • 客户端:192.168.20.17
  • nginx负载均衡:主机名:nginx01,地址:192.168.20.20
  • WEB集群有三台WEB主机:
    • WEB01:使用nginx服务器,主机名:nginx02,ip地址:192.168.20.22
    • WEB02:使用nginx服务器,主机名:nginx03,ip地址:192.168.20.23
    • WEB03:使用apache服务器作为备用WEB服务器,主机名:Apache01,ip地址:192.168.20.21

1.2.1.1 负载均衡相关参数
  • upstream

    定义后端服务器组,会引入一个新的上下文,默认调度算法是wrr(加权轮询),服务器可以监听不同的端口,监听TCP和UNIX域套接字的服务器可以混合使用。

    配置语法:upstream name { ... }

    name用于对此服务器组的调用。

    配置环境:http

  • server

    在upstream上下文中定义后端服务器成员,以及相关的参数;

    配置环境:upstream

    配置语法:server address [parameters]

    • address有三种表示格式:

      1、unix:/PATH/TO/SOME_SOCK_FILE

      2、IP[:PORT]

      3、HOSTNAME[:PORT]

    • parameters相关参数:

      • weight=number:定义服务器的权重,默认为1;

      • max_conns=number: 设置连接后端报务器最大并发活动连接数,默认为0表示没有限制,1.11.5后支持;

      • max_fails=number:设置对后端服务器失败连接尝试最大次数;超出此处指定的次数时,server将被标记为不可用,默认为1;在fail_timeout设定的时间内,与服务器的连接失败达到max_fails则认为服务器不可用。

      • fail_timeout=time:后端服务器通信失败后,探测节点是否可用的周期;

        例如server 192.168.20.22:80 weight=1 fail_timeout=5s max_fails=3;表示如果后端节点5秒内出现3次不可用情况,判定该节点不可用。判定不可用后5秒内请求不会转发到此节点,直到5秒后重新检测节点健康情况。

        在两个节点都可用的情况下,突然有一个节点挂掉,客户端请求过来后哪怕请求到了不可用的节点,此次请求也不会失败,因为Nginx会把此次请求转发到另外一个可用节点,再把结果返回给客户端。

        当一个节点挂掉,Nginx不知道节点是否恢复的时候,会把客户端的请求同时转发到两个节点,判断节点健康情况。

      • backup: 将服务器标记为“备用”,即所有服务器均不可用时才启用此服务器;

      • down: 把后端服务器标记为“不可用”,调度服务器就不会将请求发送至标记的后端服务器,可以用来实现服务器维护或灰度发布;

      • resolve:当server定义的是主机名的时候,当A记录发生变化时会自动应用新的IP地址而不是重启nginx;

    配置示例:

    upstream webserver {
    server 192.168.20.22:80 weight=1 fail_timeout=5s max_fails=3;
    server 192,168.20.23:80 weight=2 fail_timeout=5s max_fails=3;
    server 192.168.20.21:80 weight=1 fail_timeout=5s max_fails=3 backup;
    }
  • keepalive

    为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗,当超过此数字时,最近使用最少的连接将被关闭。

    配置格式:keepalive connections;

    配置环境:upstream

    示例:keepalive 32;

1.2.1.2 WEB集群部署

注意:在实际生产中后端服务器的数据必须完全一致,此处为了实验效果故意把后端服务器的页面内容设置的不一样。

  • nginx02部署

    #1.nginx的配置文件如下:
    [root@nginx02 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
    server {
    listen 80 default_server;
    server_name node01.xuzhichao.com;
    access_log /var/log/nginx/access_xuzhichao.log access_json;
    charset utf-8,gbk; location / {
    root /data/nginx/xuzhichao;
    index index.html;
    }
    } [root@nginx02 ~]# vim /etc/nginx/nginx.conf
    ......
    log_format access_json '{ "@timestamp": "$time_iso8601", '
    '"remote_addr": "$X-Forwarded-For", '
    '"referer": "$http_referer", '
    '"request": "$request", '
    '"status": $status, '
    '"bytes":$body_bytes_sent, '
    '"agent": "$http_user_agent", '
    '"x_forwarded": "$http_x_forwarded_for", '
    '"upstr_addr": "$upstream_addr",'
    '"upstr_host": "$upstream_http_host",'
    '"upstreamtime": "$upstream_response_time" }'; #2.建立nginx工作目录:
    [root@nginx02 ~]# mkdir -p /data/nginx/xuzhichao
    [root@nginx02 ~]# chown nginx:nginx /data/nginx/xuzhichao
    [root@nginx02 ~]# echo "node1.xuzhichao.com page" > /data/nginx/xuzhichao/index.html
    [root@nginx02 ~]# echo "node1.xuzhichao.com main page" > /data/nginx/xuzhichao/main.html #3.重启nginx服务:
    [root@nginx02 ~]# systemctl reload nginx.service #4.访问测试:
    [root@nginx01 ~]# curl http://192.168.20.22/
    node1.xuzhichao.com page
  • nginx03部署

    #1.nginx的配置文件如下:
    [root@nginx03 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
    server {
    listen 80 default_server;
    server_name node02.xuzhichao.com;
    access_log /var/log/nginx/access_xuzhichao.log access_json;
    charset utf-8,gbk; location / {
    root /data/nginx/xuzhichao;
    index index.html;
    }
    } [root@nginx03 ~]# vim /etc/nginx/nginx.conf
    ......
    log_format access_json '{ "@timestamp": "$time_iso8601", '
    '"remote_addr": "$X-Forwarded-For", '
    '"referer": "$http_referer", '
    '"request": "$request", '
    '"status": $status, '
    '"bytes":$body_bytes_sent, '
    '"agent": "$http_user_agent", '
    '"x_forwarded": "$http_x_forwarded_for", '
    '"upstr_addr": "$upstream_addr",'
    '"upstr_host": "$upstream_http_host",'
    '"upstreamtime": "$upstream_response_time" }'; #2.建立nginx工作目录:
    [root@nginx03 ~]# mkdir -p /data/nginx/xuzhichao
    [root@nginx03 ~]# chown nginx:nginx /data/nginx/xuzhichao
    [root@nginx03 ~]# echo "node2.xuzhichao.com page" > /data/nginx/xuzhichao/index.html
    [root@nginx03 ~]# echo "node2.xuzhichao.com main page" > /data/nginx/xuzhichao/main.html #3.重启nginx服务:
    [root@nginx03 ~]# systemctl reload nginx.service #4.访问测试:
    [root@nginx01 ~]# curl http://192.168.20.23/
    node2.xuzhichao.com page
  • apache01部署

    #1.apache的配置文件:
    [root@apache01 ~]# cat /etc/httpd/conf.d/vhost.conf
    <VirtualHost 192.168.20.21:80>
    ServerName apache.xuzhichao.com
    DocumentRoot "/data/apache/xuzhichao"
    #LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined1
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined1
    #CustomLog "logs/apache.xuzhichao.log" combined
    CustomLog "logs/apache.xuzhichao.log" combined1
    <Directory "/data/apache/xuzhichao">
    options none
    allowoverride none
    Require all granted
    </Directory>
    </VirtualHost> #2.apache相关的工作目录:
    [root@apache01 ~]# cat /data/apache/xuzhichao/index.html
    <h1>apache.xuzhichao.com</h1> #3.重启httpd服务:
    [root@apache01 ~]# systemctl reload httpd.service #4.访问测试:
    [root@nginx01 ~]# curl http://192.168.20.21/
    <h1>apache.xuzhichao.com</h1>
1.2.1.3 nginx负载均衡服务器部署
#1.nginx配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
server 192.168.20.22 weight=1 fail_timeout=5s max_fails=3;
server 192.168.20.23 weight=2 fail_timeout=5s max_fails=3;
server 192.168.20.21 weight=1 fail_timeout=5s max_fails=3 backup;
} server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json; location / {
root /data/nginx/html/xuzhichao;
index index.html index.php; valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
} location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。 proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
} #2.重启nginx服务:
[root@nginx01 ~]# systemctl reload nginx.service #3.客户端轮询访问,按照配置的服务器权重对客户端请求进行分配:
[root@xuzhichao ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page [root@xuzhichao ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/main.html; sleep 1 ;done
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page #4.后端服务器访问日志,可以显示客户端真实IP和经过的代理服务器地址:
[root@nginx02 ~]# tail -f /var/log/nginx/access_xuzhichao.log
{ "@timestamp": "2021-06-28T20:17:42+08:00", "remote_addr": "192.168.20.17, 192.168.20.20", "referer": "-", "request": "GET // HTTP/1.0", "status": 200, "bytes":25, "agent": "curl/7.29.0", "x_forwarded": "192.168.20.17", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" } [root@nginx03 ~]# tail -f /var/log/nginx/access_xuzhichao.log
{ "@timestamp": "2021-06-28T20:17:48+08:00", "remote_addr": "192.168.20.17, 192.168.20.20", "referer": "-", "request": "GET // HTTP/1.0", "status": 200, "bytes":25, "agent": "curl/7.29.0", "x_forwarded": "192.168.20.17", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }
1.2.1.4 测试启用备份web服务器

当两台主用的web服务器nginx02和nginx03出现故障时,会自动启用backup的web服务器,nginx02和nginx03恢复时请求又会重新调度到这两台服务器中。

#1.nginx03停止nginx服务
[root@nginx03 xuzhichao]# systemctl stop nginx.service #2.把nginx02的状态设置为down
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
server 192.168.20.22 weight=1 fail_timeout=5s max_fails=3 down;
server 192.168.20.23 weight=2 fail_timeout=5s max_fails=3;
server 192.168.20.21 weight=1 fail_timeout=5s max_fails=3 backup;
} [root@nginx01 ~]# systemctl reload nginx.service #3.客户端的访问测试情况如下,服务未出现中断:
[root@xuzhichao ~]# for i in {1..120}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page <==nginx03停止服务
node1.xuzhichao.com page
node1.xuzhichao.com page
node1.xuzhichao.com page
node1.xuzhichao.com page
<h1>apache.xuzhichao.com</h1> <==nginx02也停止服务
<h1>apache.xuzhichao.com</h1>
<h1>apache.xuzhichao.com</h1> #4.恢复nginx02和nginx03时,服务仍未出现中断
[root@xuzhichao ~]# for i in {1..120}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
<h1>apache.xuzhichao.com</h1>
<h1>apache.xuzhichao.com</h1>
<h1>apache.xuzhichao.com</h1>
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page

1.2.2 nginx负载均衡调度算法

1.2.2.1 轮询调度算法

轮询调度算法的原理是将每一次用户的请求,轮流分配给后端的服务器。

轮流调度算法的优点是比较简单,无需记录当前所有的连接状态,是一种无状态调度。

配置示例:

upstream webserver {
server 192.168.20.22 fail_timeout=5s max_fails=3 down;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
}
1.2.2.2 加权轮询调度算法

轮流调度算法没有考虑后端每台服务器的处理能力,在实际情况中,由于每台服务器的配置,安装的业务应用不同,其处理能力也不一样,所以我们根据服务器的处理能力,为每个服务器分配不同的权重值,使其能够接受相应权重值的服务请求。

配置示例如下,调度效果见上一节示例:

upstream webserver {
server 192.168.20.22 weight=1 fail_timeout=5s max_fails=3 down;
server 192.168.20.23 weight=2 fail_timeout=5s max_fails=3;
server 192.168.20.21 weight=1 fail_timeout=5s max_fails=3 backup;
}
1.2.2.3 ip_hash调度算法

ip_hash是基于客户端的IP地址,对该IP进行hash运算,根据hash运算的值,将请求分配到后端特定的一台节点进行处理。该算法会始终将同一个客户端ip调度到同一个服务器中,实现会话绑定。缺陷在于局域网中使用同一个公网IP,导致调度不合理。

ip_hash算法实现公式:hash(client_ip) % node_counts = index

ip_hash算法原理如下图:把客户端的IP地址hash成一个数值,同一个客户端IP所hash的数值是相同的,后端如果有三台服务器,为这三台服务器分别编号为0、1、2,Ip的hash值对3取余数,余数则是调度到后端服务器的编号。

ip_hash算法存在两个问题:

  • 如果有大量的来自于同一IP的请求会造成某个后端节点流量过大,其他节点流量较少,流量分配不均匀。
  • 如果临时下线后端一台服务器,会出现所有建立连接的客户端重新计算hash值,从而造成大量的用户被转移到其他的节点进行处理,重新建立会话。官方建议把下线的主机标记为down状态,以保留客户端IP地址的当前hash值。

ip_hash的配置示例如下:

#1.nginx配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
ip_hash;
server 192.168.20.22 fail_timeout=5s max_fails=3;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
} server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json; location / {
root /data/nginx/html/xuzhichao;
index index.html index.php; valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
} location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。 proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
} #2.重启nginx服务:
[root@nginx01 ~]# systemctl reload nginx.service #3.客户端访问测试,同一个客户端固定分配到一个后端服务器:
[root@xuzhichao ~]# for i in {1..120}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
......
1.2.2.4 一致性hash调度算法原理

一致性hash调度算法是为了解决上述问题而诞生的。一致性Hash算法也是使用取模的方法,但不是对服务器节点数量进行取模,而是对2的32次方取模。即,一致性Hash算法将整个Hash空间组织成一个虚拟的圆环,Hash函数的值空间为0 ~ 2^32 - 1(一个32位无符号整型)

整个圆环以顺时针方向组织,圆环正上方的点代表0,0点右侧的第一个点代表1,以此类推。

选择服务器的IP或主机名作为关键字对每个服务器按照上述方式进行哈希,这样每台服务器就确定在了哈希环的一个位置上,比如我们有三台机器,使用它们的IP地址哈希后在环空间的位置如图所示:

用户数据访问时,将客户端指定的数据Key使用相同的Hash函数计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针查找,遇到的服务器就是其应该定位到的服务器。

例如,现在有ObjectA,ObjectB,ObjectC三个数据对象,经过哈希计算后,在环空间上的位置如下:

根据一致性算法,Object -> NodeA,ObjectB -> NodeB, ObjectC -> NodeC

  • 一致性hash的容错性

    假设Node C宕机了,图中可以看到,A、B不会受到影响,只有Object C对象被重新定位到Node A。所以在一致性Hash算法中,如果一台服务器不可用,受影响的数据仅仅是此服务器到其环空间前一台服务器之间的数据(这里为Node C到Node B之间的数据),其他不会受到影响。

  • 一致性hash的扩展性

    当集群中增加了一台服务器Node X,此时对象ObjectA、ObjectB没有受到影响,只有Object C重新定位到了新的节点X上。

    一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,有很好的容错性和可扩展性。

  • 一致性hash的数据倾斜问题

    在一致性Hash算法服务节点太少的情况下,容易因为节点分布不均匀面造成数据倾斜,即被缓存的对象大部分缓存在某一台服务器上,如下图:

这时我们发现有大量数据集中在节点A上,而节点B只有少量数据。

为了解决数据倾斜问题,一致性Hash算法引入了虚拟节点机制,即根据服务器的权重对每一个服务器节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。

虚拟节点生成原理:假设ABC三台缓存服务器的权重分别为10/20/30,权重为10,就做9次(后端服务器IP哈希值+随机数)/2^32,得到9个虚拟节点,依次类推。

所以加入虚拟节点之后,即使在服务节点很少的情况下,也能做到数据的均匀分布。

1.2.2.5 hash调度算法

使用请求字段中指定的key的hash值来实现对请求的调度,key可以直接文本、变量或二者组合,使用consistent参数,将使用ketama一致性hash算法。

例如:hash $request_uri consistent

表示根据用户请求的URL进行hash取模,根据hash结果使用一致性hash算法将请求分配到后端服务器中。

适用于后端是Cache服务器(如varnish)的情况:

用户请求nginx负载均衡器,nginx将请求调度到后面一台缓存服务器cache1中,cache1去后端获取数据,返回数据,将数据缓存在本地,当其他客户端请求这个URL时,会被同样调度到这台cache1服务器中,cache1直接调用自身缓存数据响应客户端即可,大幅提升网站的响应。

使用示例如下:

#1.nginx的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
hash $request_uri consistent; <==使用一致性hash算法对用户请求的url进行hash后调度。
#hash $uri consistent; <==两种写法都可以。
server 192.168.20.22 fail_timeout=5s max_fails=3;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
} server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json; location / {
root /data/nginx/html/xuzhichao;
index index.html index.php; valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
} location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。 proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
} #2.重启nginx服务:
[root@nginx01 ~]# systemctl reload nginx.service #3.客户端测试,访问同一个url会被调度到同一台后端服务器中:
[root@xuzhichao ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
...... #使用不同的客户端访问相同的URL还是调度到同一台服务器中。
[root@apache01 ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
......
1.2.2.6 least_conn调度算法

最少连接调度算法,哪台节点连接数少就把请求调度到这个节点。

当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接。

配置示例如下:

#1.nginx的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
least_conn;
server 192.168.20.22 fail_timeout=5s max_fails=3;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
} server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json; location / {
root /data/nginx/html/xuzhichao;
index index.html index.php; valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
} location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。 proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}

WEB服务与NGINX(22)- nginx的七层负载均衡功能的更多相关文章

  1. Windows Azure支持七层负载均衡--Application Gateway

    一直以来Windows Azure的负载均衡(Loadbalancer)功能一直被客户诟病,无法其竞争对手(特别是国内的云厂商)匹敌. Windows Azure的负载均衡器是四层的,前期的版本不支持 ...

  2. nginx 七层负载均衡

    [tcp] nginx 七层负载均衡 nginx负载均衡概述 当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组成集群,前端使用Nginx负载均衡, ...

  3. 13、Nginx七层负载均衡

    1.Nginx负载均衡基本概述 1.1为什么需要使用负载均衡 当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡, ...

  4. Linux架构之Nginx 七层负载均衡

    第50章 Nginx七层负载均衡 一.Nginx负载均衡基本概述 1)为什么要使用负载均衡 当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷.使用多台Web服务器组成集群, ...

  5. 第十五章 nginx七层负载均衡

    一.Nginx负载均衡 1.为什么做负载均衡 当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到 ...

  6. 四层和七层负载均衡的特点及常用负载均衡Nginx、Haproxy、LVS对比

    一.四层与七层负载均衡在原理上的区别 图示: 四层负载均衡与七层负载均衡在工作原理上的简单区别如下图: 概述: 1.四层负载均衡工作在OSI模型中的四层,即传输层.四层负载均衡只能根据报文中目标地址和 ...

  7. Nginx七层负载均衡的几种调度算法

      Nginx是一款轻量级的高性能web服务器,同时也是一款非常优秀的负载均衡器和反向代理服务器.由于支持强大的正则匹配规则.动静分离.URLrewrite功能及安装配置简单且对网络稳定性依赖非常小等 ...

  8. Nginx实现七层负载均衡配置指导

    本文描述了如何使用Nginx实现在应用层实现7层负载均衡功能,Nginx支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查功能.废话不多说,详细 ...

  9. Web负载均衡学习笔记之四层和七层负载均衡的区别

    0x00 简介 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. ...

  10. windows第七层负载均衡--基于IIS的ARR负载均衡

    载均衡有很多种方法,有硬件负载均衡,软件负载均衡,还可以从域名解析下手. 不过,今天只讲软件负载均衡 软件负载均衡一般分两种,从网络协议来讲(tcp/ip),主要集中在第四层和第七层进行负载均衡. 第 ...

随机推荐

  1. SqlServer的实用且高级玩法.md

    1.常见表表达式(CTEs) 如果您想要查询子查询,那就是CTEs施展身手的时候 - CTEs基本上创建了一个临时表. 使用常用表表达式(CTEs)是模块化和分解代码的好方法,与您将文章分解为几个段落 ...

  2. C++设计模式 - 解析器模式(Interpreter)

    领域规则模式 在特定领域中,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案. 典型模式 Interpreter Interpre ...

  3. #区间dp#CF1114D Flood Fill

    题目 有一个长度为\(n\)的颜色序列,在游戏前选择一个固定的位置, 若当前轮该位置的颜色为\(x\),那么可以将所有颜色为\(x\)的连通块改为任意颜色, 问最少进行多少轮使得区间\([1,n]\) ...

  4. 组合数学——Min-Max容斥

    Min-Max 容斥,即 $$\max(S)=\sum_{T\in S,T\neq\emptyset}(-1)^{|T|-1}\min(T)$$ 接下来证明上面那个式子是对的.定义 \(S\) 中共有 ...

  5. SQL FOREIGN KEY 约束- 保障表之间关系完整性的关键规则

    SQL FOREIGN KEY 约束 SQL FOREIGN KEY 约束用于防止破坏表之间关系的操作.FOREIGN KEY 是一张表中的字段(或字段集合),它引用另一张表中的主键.具有外键的表称为 ...

  6. sql注入--基础注入判断方法(构造闭合)

    在我们拿到一个sql注入的题目之后,在确定了注入点之后,接下来要做的事情就是进行基础注入判断. 在开始前,我们需要理解一个SQL注入中最常用的词汇 -- 构造闭合 . 对于SQL处理语句后台的写法: ...

  7. 攻防世界Reverse三星题 zorropub

    题目 分析过程 丢到PE里面,无壳,64bit 丢到IDA里面,查看mian函数 1 int __fastcall main(int a1, char **a2, char **a3) 2 { 3 s ...

  8. centos8 \CentOS 9 Stream rpm 安装mysql8.0.28

    centos8 rpm 安装mysql8.0.28 检查 检测系统是否自带安装 MySQL 命令如下: rpm -qa | grep mysql 如果如下存在已安装的包,就需要卸载 mysql80-c ...

  9. C++ 默认参数与引用传递:语法、用法及示例

    C++ 默认参数 默认参数概述 在 C++ 中,函数参数可以拥有默认值.这意味着,在调用函数时,如果省略了某个参数,那么将使用为该参数指定的默认值. 设置默认参数 默认参数值使用等号 = 符号进行设置 ...

  10. Ajax 原理是什么?如何实现?

    一.是什么 AJAX全称(Asynchronous Javascript And XML) 即异步的JavaScript 和XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情 ...