nginx反向代理实现均衡负载及调度方法
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反向代理实现均衡负载及调度方法的更多相关文章
- Nginx反向代理实现Tomcat负载均衡
这篇短文主要介绍Tomcat的集群和用Nginx反向代理实现Tomcat负载均衡. 1.首先需要对一些知识点进行扫盲(对自己进行扫盲,囧): 集群(Cluster) 简单来说就是用N台服务器构成一个松 ...
- nginx 反向代理 和lvs负载均衡
nginx反向代理:用户请求nginx代理服务器然后代理服务器将用户请求转为服务器再由nginx代理服务器将服务器的响应反应给用户. lvs负载均衡:用户请求nginx代理服务器然后代理服务器将用户请 ...
- Nginx反向代理 实现Web负载均衡
实现负载均衡的方式有很多种,DNS.反向代理.LVS负载均衡器(软件实现).F5(负载均衡器,硬件,非常昂贵)这里我们只提到基于DNS,以及反向代理的方式来实现负载均衡Web服务 DNS服 ...
- Nginx反向代理及简单负载均衡配置
nginx配置文件主要分为六个区域:main section.events section.http section.sever section.location section.upstream s ...
- nginx反向代理mysql及负载
下载地址: http://nginx.org/packages/mainline/centos/7/x86_64/RPMS/nginx-1.15.9-1.el7_4.ngx.x86_64.rpm 安装 ...
- 使用docker化的nginx 反向代理 docker化的GSCloud 的方法
1. 首先将nginx 的image pull 下来. docker pull nginx 2. 将最近的可用的 参数文件 复制过来当一个目录 mkdir /nginx ssh root@linuxs ...
- iperf测试流量转发(nginx反向代理tcp/udp)
一.准备工作 服务器1:192.168.33.102 搭建nginx服务,作为反向代理的中转站 服务器2:192.168.33.103 nginx要反向代理的服务器 服务器3:192.1 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
随机推荐
- Docker 安装 redis 并实现配置文件启动,数据文件本地持久化
1,笔者使用的是 Linux 的 Centos7 版本 2,安装 Docker,不会安装可以移步 Docker 在 Linux 平台的安装 以及一些常见命令 3,下载 docker 镜像 3.1,首 ...
- LODOP打印超文本有边距不居中的情况2
之前的博文:LODOP打印项水平居中.之前的博文有介绍超文本和纯文本的居中方式,设置超文本打印项居中时,注意打印内容要在打印项本身宽度里居中.之前的博文超文本用的是个表格,而且表格本身没有margin ...
- [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 ...
- Component 'TABCTL32.OCX'错误的处理方法
错误:Component 'TABCTL32.OCX' or one of its dependencies not correctyly registered:a file is missing o ...
- GitLab数据备份与恢复
创建备份 $ sudo gitlab-rake gitlab:backup:create 执行完备份命令后会在/var/opt/gitlab/backups目录下生成备份后的文件,如150080913 ...
- mybatis对实体的引用必须以 ';' 分隔符结尾
今天在使用 generate 时(问题起源),由于扫描了mysql所有库下的user表,因此添加参数 nullCatalogMeansCurrent=true 添加改参数解决的原因 查看 但是添加后出 ...
- .net webapi跨域 web.config配置
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...
- 如何配置STP
一.搭建本次实验的拓扑结构 两台s5700交换机模拟核心交换,两台s3700交换机模拟接入交换机,核心上配置eth-trunk 二.开启所有交换机的stp功能 开启stp [S1]stp enab ...
- 史上最详细bitbucket入门手册,手把手操作指南
老大要我去调研一下有什么好用的免费软件版本管理工具,有利于小团队开发的.我第一个想到的就是git,经常在git下东西,听说它的代码仓库好用,于是就注册了一个github的账号,创建仓库的时候才发现只能 ...
- 链表习题(8)-寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下
/*寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下*/ /* 算法思想:定义两个指针,pre指向前驱结点,p指向当前结点,当p->data == k的时候,交换 p ...