http upstream配置参数:

ngx_http_upstream_module模块
将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用

upstream name { ... }

定义后端服务器组,会引入一个新的上下文;
默认调度算法是wrr:

Context: http
upstream httpdsrvs {
server ...
server...
...
}

server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。

server支持的parameters如下:

weight=number #设置权重,默认为1。
max_conns=number #给当前server设置最大活动链接数,默认为0表示没有限制。
max_fails=number #对后端服务器连续监测失败多少次就标记为不可用。
fail_timeout=time #对后端服务器的单次监测超时时间,默认为10秒。
backup #设置为备份服务器,当所有服务器不可用时将重新启用次服务器。
down #标记为down状态。
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx。

实现nginx反向代理调度功能:

A主机:192.168.37.27   nginx服务器

B主机:192.168.37.17  httpd服务器

C主机:192.168.37.37  httpd服务器

nginx服务器上配置文件:

1、修改nginx配置文件,关联后端httpd服务,进行调度。

[root@centos27site1]#vim /etc/nginx/nginx.conf
upstream websrv{
server 192.168.37.17:80;
server 192.168.37.37:80;
}

 vim  /etc/nginx/conf.d/test.conf

server  {
listen 80;
server_name www.magedu.net;
root /data/site1;
index index.html;
location / {
proxy_pass http://websrv;
}
}

在两个后端httpd后端服务创建文件

[root@centos17~]#echo 192.168.37.17 > /var/www/html/index.html
[root@centos17~]#systemctl start httpd
[root@centos37site1]#systemctl start httpd
[root@centos37site1]#echo 192.168.37.37 > /var/www/html/index.html

在客户端进行调度测试

[root@centos7~]#while true;do  curl www.magedu.net;sleep 0.5;done
192.168.37.17
192.168.37.37
192.168.37.17
192.168.37.37
192.168.37.17

实现宕机功能:

修改nginx主配置文件即可,在监听的80端口后面加上down,就会将此服务器进行宕机:vim  /etc/nginx/nginx.conf

http {
upstream websrv{
server 192.168.37.17:80;
server 192.168.37.37:80 down; 加入down,就会将此主机进行宕机处理。
}

在客户端进行测试效果,此时nginx很巧妙的只调度17的主机,不会在显示37宕机的效果,可以对后端服务器进行健康检查。

[root@centos7~]#while true;do  curl www.magedu.net;sleep 0.5;done
192.168.37.17
192.168.37.17
192.168.37.17

实现道歉功能:

将nginx服务器端的配置文件进行修改:vim /etc/nginx/nginx.conf,80端口被占用,最好不要指定80端口。

      upstream  websrv{
server 192.168.37.17:80;
server 192.168.37.37:80;
server 127.0.0.1:8080 backup;
}

在vim /etc/nginx/conf.d/test.conf配置文件中修改配置文件,当后端httpd都宕机之后,就会显示/data/site2里边的文件,作为道歉显示。

server  {
listen 8080;
#server_name www.magedu.org;
root /data/site2/;
ssl_certificate /etc/nginx/ssl/magedu.org.crt;
ssl_certificate_key /etc/nginx/ssl/magedu.org.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
access_log /var/log/nginx/magedu_org.access_json.log main;
valid_referers none block server_names *.magedu.com ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403 "Forbidden Access";
}
}

 在nginx服务端的data/site2目录下新建一个html文件。

[root@centos27site1]#mkdir /data/site2
[root@centos27site1]#echo /data/site2/test.html > /data/site2/index.html

 将httpd两个后端服务都停掉。

[root@centos37site1]#systemctl stop httpd

 在客户端进行测试效果,由于后端服务器都宕机,此时就会显示nginx宕机道歉的文件信息。

[root@centos7~]#while true;do  curl www.magedu.net;sleep 0.5;done
/data/site2/test.html
/data/site2/test.html

调度算法

ip_hash 源地址hash调度方法,基于的客户端的remote_addr(源地址)做hash计算,以实现会话保持。
least_conn 最少连接调度算法,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接,调度到最少连接的后端服务器上。 hash key [consistent] 基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合。
作用:将请求分类,同一类请求将发往同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用。所谓取模运算,就是计算两个数相除之后的余数,比如10%7=3, 7%4=3 hash $request_uri consistent; #基于用户请求的uri做hash,一致性hash算法
hash $remote_addr;
hash $cookie_name; #key为name的cookie
keepalive 连接数N;
为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗

一致性hash算法

原理:对于下图来看,节点数越少,越容易出现节点在哈希环上的分布不均匀,导致各节点映射的对象数量严重不均衡(数据倾斜);相反,节点数越多越密集,数据在哈希环上的分布就越均匀。

设计哈希函数 Hash(key),要求取值范围为 [0, 2^32)

在对IP地址进行hash运算的结果进行取模(2^32),针对每个全服务器的权重不同,都将IP地址进行hash算法运算,然后进行取模(2^32)。

原理诠释:

varnish   1(权重)   hash(192.168.37.37)%2^32

varnish   2(权重)   hash(192.168.37.47+random1)%2^32    hash(192.168.37.47+random2)%2^32    权重有两个,对IP地址进行两次hash运算。

varnish   3(权重)   hash(192.168.37.57+random1)%2^32    hash(192.168.37.57+random2)%2^32   hash(192.168.37.57+random3)%2^32   权重有三个,就对IP地址进行三次hash运算。

以上展示,由于在hash环上只有六个随机环,有可能分部在一起,会导致分布不均匀,此时有可能就只有外部两个nginx服务器在工作,中间的四个环不会工作,造成两个环负荷过大。

解决办法:在保持权重占比的情况下,可以将三个varnish的权重分别乘以1000,如1*1000、2*1000、3*1000,此时相对的权重占比不变,环的数量增加,会将环的数量增加,不会导致数据倾斜现象,解决了不均匀的问题。

解决不均匀的代码:hash $request_uri consistent;

实现sessionid固定保证访问一个网址

1、在nginx服务器修改主配置文件  

[root@centos27~]#vim /etc/nginx/nginx.conf
upstream websrv{
server 192.168.37.17:80;
server 192.168.37.37:80;
hash $cookie_sessionid;
}

在include指定的配置文件中添加要调用的后端httpd服务的IP地址。

[root@centos27~]#vim /etc/nginx/conf.d/test.conf
server {
listen 80;
server_name www.magedu.net;
root /data/site1;
index index.html;
location / {
proxy_pass http://websrv;
}
}

2、在客户端进行测试验证效果,说明sessionid固定后,保证固定访问一个网址。

实现工作于传输层的反代理或调度器(用法不多)

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

stream { ... }
定义stream相关的服务;Context:main

示例:

stream {
upstream mysqlsrvs {
server 192.168.8.2:3306;
server 192.168.8.3:3306;
least_conn;
}
server {
listen 10.1.0.6:3306;
proxy_pass mysqlsrvs;
}
}

  各参数含义:

ngx_stream_proxy_module模块
可实现代理基于TCP,UDP (1.9.13), UNIX-domain sockets的数据流 proxy_pass address;
指定后端服务器地址 proxy_timeout timeout;
无数据传输时,保持连接状态的超时时长
默认为10m proxy_connect_timeout time;
设置nginx与被代理的服务器尝试建立连接的超时时长
默认为60s

1、在nginx服务器主配置文件中添加TCP和UDP协议。

[root@centos27~]#vim /etc/nginx/nginx.conf
stream {
upstream mysqlsrvs {
server 192.168.37.17:3306; mysql1数据库
server 192.168.37.37:3306; mysql2数据库
least_conn;
}
server {
listen 192.168.37.27:3306; nginx服务器
proxy_pass mysqlsrvs;
}
}

2、在两个mysql数据库创建相同用户账号及数据库,便于测试验证

[root@centos17~]#yum install mariadb-server
[root@centos17~]#systemctl start mariadb
[root@centos17~]#mysql -e "grant all on *.* to test@'192.168.37.%' identified by 'centos'"
[root@centos17~]#mysql -e "create database db17" 17数据库
[root@centos37~]#mysql -e "grant all on *.* to test@'192.168.37.%' identified by 'centos' "
[root@centos37~]#mysql -e "create database db37" 37数据库

3、在mysql客户端进行测试验证反向代理效果,每次访问的数据库不一定一样。

tcp负载均衡配置参数

stream { #定义stream
 upstream backend { #定义后端服务器
  hash $remote_addr consistent; #定义调度算法
  server backend1.example.com:12345 weight=5; #定义具体server
  server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
  server unix:/tmp/backend3;
 } upstream dns { #定义后端服务器
  server 192.168.0.1:53535; #定义具体server
  server dns.example.com:53;
 } server { #定义server
  listen 12345; #监听IP:PORT
  proxy_connect_timeout 1s; #连接超时时间
  proxy_timeout 3s; #转发超时时间
  proxy_pass backend; #转发到具体服务器组
 } server {
  listen 127.0.0.1:53 udp reuseport;
  proxy_timeout 20s;
  proxy_pass dns;
} server {
  listen [::1]:12345;
  proxy_pass unix:/tmp/stream.socket;
}
}

  

  

  

 

  

 

 

  

  

  

nginx反向代理实现均衡负载及调度方法的更多相关文章

  1. Nginx反向代理实现Tomcat负载均衡

    这篇短文主要介绍Tomcat的集群和用Nginx反向代理实现Tomcat负载均衡. 1.首先需要对一些知识点进行扫盲(对自己进行扫盲,囧): 集群(Cluster) 简单来说就是用N台服务器构成一个松 ...

  2. nginx 反向代理 和lvs负载均衡

    nginx反向代理:用户请求nginx代理服务器然后代理服务器将用户请求转为服务器再由nginx代理服务器将服务器的响应反应给用户. lvs负载均衡:用户请求nginx代理服务器然后代理服务器将用户请 ...

  3. Nginx反向代理 实现Web负载均衡

    实现负载均衡的方式有很多种,DNS.反向代理.LVS负载均衡器(软件实现).F5(负载均衡器,硬件,非常昂贵)这里我们只提到基于DNS,以及反向代理的方式来实现负载均衡Web服务       DNS服 ...

  4. Nginx反向代理及简单负载均衡配置

    nginx配置文件主要分为六个区域:main section.events section.http section.sever section.location section.upstream s ...

  5. nginx反向代理mysql及负载

    下载地址: http://nginx.org/packages/mainline/centos/7/x86_64/RPMS/nginx-1.15.9-1.el7_4.ngx.x86_64.rpm 安装 ...

  6. 使用docker化的nginx 反向代理 docker化的GSCloud 的方法

    1. 首先将nginx 的image pull 下来. docker pull nginx 2. 将最近的可用的 参数文件 复制过来当一个目录 mkdir /nginx ssh root@linuxs ...

  7. iperf测试流量转发(nginx反向代理tcp/udp)

    一.准备工作 服务器1:192.168.33.102     搭建nginx服务,作为反向代理的中转站 服务器2:192.168.33.103    nginx要反向代理的服务器 服务器3:192.1 ...

  8. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  9. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

随机推荐

  1. Docker 安装 redis 并实现配置文件启动,数据文件本地持久化

    1,笔者使用的是 Linux 的 Centos7 版本  2,安装 Docker,不会安装可以移步 Docker 在 Linux 平台的安装 以及一些常见命令 3,下载 docker 镜像 3.1,首 ...

  2. LODOP打印超文本有边距不居中的情况2

    之前的博文:LODOP打印项水平居中.之前的博文有介绍超文本和纯文本的居中方式,设置超文本打印项居中时,注意打印内容要在打印项本身宽度里居中.之前的博文超文本用的是个表格,而且表格本身没有margin ...

  3. [LeetCode] 21. Merge Two Sorted Lists 合并有序链表

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  4. Component 'TABCTL32.OCX'错误的处理方法

    错误:Component 'TABCTL32.OCX' or one of its dependencies not correctyly registered:a file is missing o ...

  5. GitLab数据备份与恢复

    创建备份 $ sudo gitlab-rake gitlab:backup:create 执行完备份命令后会在/var/opt/gitlab/backups目录下生成备份后的文件,如150080913 ...

  6. mybatis对实体的引用必须以 ';' 分隔符结尾

    今天在使用 generate 时(问题起源),由于扫描了mysql所有库下的user表,因此添加参数 nullCatalogMeansCurrent=true 添加改参数解决的原因 查看 但是添加后出 ...

  7. .net webapi跨域 web.config配置

    <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...

  8. 如何配置STP

    一.搭建本次实验的拓扑结构 两台s5700交换机模拟核心交换,两台s3700交换机模拟接入交换机,核心上配置eth-trunk   二.开启所有交换机的stp功能 开启stp [S1]stp enab ...

  9. 史上最详细bitbucket入门手册,手把手操作指南

    老大要我去调研一下有什么好用的免费软件版本管理工具,有利于小团队开发的.我第一个想到的就是git,经常在git下东西,听说它的代码仓库好用,于是就注册了一个github的账号,创建仓库的时候才发现只能 ...

  10. 链表习题(8)-寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下

    /*寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下*/ /* 算法思想:定义两个指针,pre指向前驱结点,p指向当前结点,当p->data == k的时候,交换 p ...