nginx 负载均衡(默认算法)
使用 nginx 的upstream模块只需要几步就可以实现一个负载均衡;
在 nginx 配置文件中添加两个server
server {
listen ;
server_name 192.168.1.129;
root /var/www/html1;
}
server {
listen ;
server_name 192.168.1.129;
root /var/www/html2;
}
使用upstream把这两个 server 绑定到一个负载sever上提供统一入口;
upstream myservers {
server 192.168.1.129: weight= max_fails= fail_timeout=;
server 192.168.1.129: weight= max_fails= fail_timeout=;
}
weight 是权重 max_fails 请求多少次失败后把这台服务器标记为失效 fail_timeout 请求超时时间 更多参数可以通过nginx官方文档查看;
server {
listen ;
server_name 192.168.1.129;
location / {
index index.html;
proxy_pass http://myservers;
}
}
在 /var/www/html1/ 和/var/www/html2下分别建立index.html 文件 内容分别为 html111 , html2222;
然后重启nginx,访问 192.168.1.129 浏览器会显示 html111和html222交替变换,两个内容的出现概率和权重有关;
这里有两个问题:
用户访问过程中是先到达 192.168.1.129:80 然后被均匀转发给 81和82端口,如果你在81端口中的php代码里面获取 remote_addr会
发现是 192.168.1.129而不用户的地址,也就是说81和82就收到的远程信息是 81和82前面的代理服务器的,用户的真实信息被丢掉了;
解决办法: 如果通过apt方式安装的nginx 在 /etc/nginx/proxy_params 中会有几个例子参考;
通过 proxy_set_header 可以设置相关头信息
server {
listen ;
server_name 192.168.1.129;
location / {
index index.html;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://myservers;
}
}
这样在81/82端口收到的remote就是我们设置真实ip地址了;
还有个问题:在处理带状态的情况下 这种方式是不可行的,比如用户发送登录请求到82端口,82
端口保存了用户的登录session数据,但是当用户请求主页时,又被随机转发到81端口去了,81端口的后台根本就没有用户的session状态;
于是告诉用户你没有登录;
目前想到有两个办法:
(1)改变nginx的负载均衡算法,改为一致性哈希,可以根据用户ip地址来决定 该去访问那个端口,只要用户ip地址不变,就始终会被转发到指定端口;
(2)服务器不保存用户状态,用户每次请求附带状态信息
第一种方式还存在一个缺陷,比如用户用手机流量登录了系统,然后进入wifi环境,ip地址就变了,状态又会失效。第二种方式更适应性更加广泛;而且更适合做
restful 接口;
nginx 负载均衡(默认算法)的更多相关文章
- 面试题:Nginx负载均衡的算法怎么实现的?为什么要做动静分离?
面试题 Nginx负载均衡的算法怎么实现的?Nginx 有哪些负载均衡策略?Nginx为什么要做动静分离? 面试官心理剖析 主要是看应聘人员对Nginx的基本原理是否熟悉,需要应聘人员能够根据实际业务 ...
- Nginx 负载均衡一致性算法
一般Hash负载算法都是%算法 比如key-5 如果有5台服务器 那么5%5=0 那么请求将落在server 0 上,当有服务器宕机或者添加新服务器时,hash算法会引发大量路由更改,可能导致缓存大 ...
- nginx负载均衡中常见的算法及原理有哪些?
一.nginx负载均衡常用算法 1.1 轮询 轮询,nginx默认方式.一次将请求分配给各个后台服务器. upstream backserver { server 10.0.0.7; server 1 ...
- Load Balancing with NGINX 负载均衡算法
Using nginx as HTTP load balancer Using nginx as HTTP load balancer http://nginx.org/en/docs/http/lo ...
- Nginx 负载均衡算法
Nginx 负载均衡算法 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响. upstream tomcat_server { ...
- Nginx负载均衡的max_fails和fail_timeout的默认配置问题
今天发现一个奇怪的现象,前端请求后端服务多次后会超时一次,经过多次验证确定是大概10s左右就会超时一次,检查后端服务,发现其中一个节点已经夯死. 但是我们的nginx负载均衡策略是轮询机制,按照配置来 ...
- 解析nginx负载均衡
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://baidutech.blog.51cto.com/4114344/1033718 ...
- nginx 负载均衡相关知识
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...
- Nginx 负载均衡-加权轮询策略剖析
本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...
- 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)
1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...
随机推荐
- python之type函数
python 的type 函数 的介绍的 下面就是此函数的参数 三个参数的意义 '''type(class_name, base_class_tuple, attribute_dict)cla ...
- Java NIO2:NIO概述
一.概述 从JDK1.4开始,Java提供了一系列改进的输入/输出处理的新特性,被统称为NIO(即New I/O).新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对原j ...
- CentOS下安装Apache
CentOS下安装Apache,首先在用户状态下使用su root命令切换到超级管理员界面,让后开启终端,进行apache的安装过程. [root@localhost centos]# yum ins ...
- Java虚拟机垃圾收集器
一.判断对象存活的算法 1.引用计数(Reference Counting)算法 给对象添加一个引用计数器,每当有一个地方引用时,计数器加1.当引用失效时,计数器减1.当计数器的值为0的时候说该对象不 ...
- Sql Server利用游标批量清空数据表
先吐槽一下,由于公司要为新客户部署一个全新的系统,然而公司并没有空库,所以只能把正在线上运行的数据库给备份,然后清空相关数据 下面分享一下我在做清空数据库时写的一个批量清空数据表的方法 思路:查询出该 ...
- mybatis-高级结果映射之一对多
目录 1 数据准备 1.2 实体类, 接口和XML 2 一对多映射 2.1 collection集合映射 2.1.1 创建结果实体类 2.1.2 创建结果集 2.1.3 创建对应的方法和XML 2.1 ...
- ASP.Net Core2.1中的HttpClientFactory系列二:集成Polly处理瞬态故障
前言:最近,同事在工作中遇到了使用HttpClient,有些请求超时的问题,辅导员让我下去调研一下,HttpClinet的使用方式已经改成了之前博客中提到的方式,问题的原因我已经找到了,就是因为使用了 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(90)-EF 扩展操作
上一篇讲了EF直接执行SQL与存储过程的用 法 这次我们来看 EntityFramework-Plus(免费开源) 库的用法相比其他扩展库,这个更加新并且用法更加简单 这是一个对Entity Fram ...
- python之间的基础
编程第一步 print('hello,world!') 变量名的命名的规则: 1:变量由字母,数字,下划线组成 2:变量不能以数字开头 3:禁止使用python中的关键字,如 'alse', 'Non ...
- [loadrunner]通过检查点判定事务是否成功
//检查点设置语句 //tmp在此时为临时参数 web_reg_find("SaveCount=tmp", "Text=xxx", LAST); ...