Lvs-Nginx-HAproxy

    三大主流软件负载均衡器对比(LVS、Nginx、HAproxy) LVS: 1. 抗负载能力强,性能高,能达到F5的60%,对内存和CPU资源消耗比较低 2. 工作在网络4层,通过VRRP协议(仅作代理之用),具体的流量是由linux内核来处理,因此没有流量的产生。 3. 稳定,可靠性高,自身有完美的热备方案(Keepalived+lvs) 4. 不支持正则处理,不能做动静分离。 5. 支持多种负载均衡算法:rr(轮询),wrr(带权轮询)、lc(最小连接)、wlc(带权最小连接) 6. 配置相对复杂,对网络依赖比较大,稳定性很高。 7. LVS工作模式有4种: (1) nat 地址转换 (2) dr 直接路由 (3) tun 隧道 (4) full-nat Nginx: 1. 工作在网络7层,可以针对http应用做一些分流的策略,比如针对域名,目录结构 2. Nginx对网络的依赖较小,理论上能ping通就能进行负载功能 3. Nginx安装配置比较简单,测试起来很方便 4. 也可以承担较高的负载压力且稳定,nginx是为解决c10k问题而诞生的 5. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测 6. Nginx对请求的异步处理可以帮助节点服务器减轻负载压力 7. Nginx仅能支持http、https和Email协议,这样就在适用范围较小。 8. 不支持Session的直接保持,但能通过ip_hash来解决。对Big request header的支持不是很好。 9. Nginx还能做Web服务器即Cache功能。 第6点补充: 什么是nginx的异步处理: squid同步处理:浏览器发起请求,而后请求会立刻被转到后端,于是在浏览器和后台之间就建立了一个通道。从请求发起直到请求完成,这条通道都是一直存在的。 nginx异步处理:浏览器发起请求,请求不会立刻转到后端,而是请求数据(header)先收到nignx上,然后nginx再把这个请求发到后端,后端处理完成后把数据返回到nginx上,nginx将数据流发到浏览器。 使用异步处理的好处: 1. 假设用户执行一个上传文件操作,因为用户网速又比较慢,因此需要花半个小时才能把文件传到服务器。squid的同步代理在用户开始上传后就和后台建立了连接,半小时后文件上传结束,由此可见,后台服务器连接保持了半个小时;而nginx异步代理就是先将此文件收到nginx上,因此仅仅是nginx和用户保持了半小时连接,后台服务器在这半小时内没有为这个请求开启连接,半小时后用户上传结束,nginx才将上传内容发到后台,nginx和后台之间的带宽是很充裕的,所以只花了一秒钟就将请求发送到了后台,由此可见,后台服务器连接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,可见优化 程度很大。 2. 在上面这个例子中,假如后台服务器因为种种原因重启了,上传文件就自然中断了,这对用户来说是非常恼火的一件事情,想必各位也有上传文件传到一半被中断的 经历。用nginx代理之后,后台服务器的重启对用户上传的影响减少到了极点,而nginx是非常稳定的并不需要常去重启它,即使需要重启,利用kill -HUP就可以做到不间断重启nginx。 3. 异步传输可以令负载均衡器更有保障,为什么这么说呢?在其它的均衡器(lvs/haproxy/apache等)里,每个请求都是只有一次机会的,假如用 户发起一个请求,结果该请求分到的后台服务器刚好挂掉了,那么这个请求就失败了;而nginx因为是异步的,所以这个请求可以重新发往下一个后台,下一个 后台返回了正常的数据,于是这个请求就能成功了。还是用用户上传文件这个例子,假如不但用了nginx代理,而且用了负载均衡,nginx把上传文件发往 其中一台后台,但这台服务器突然重启了,nginx收到错误后,会将这个上传文件发到另一台后台,于是用户就不用再花半小时上传一遍。 4. 假如用户上传一个10GB大小的文件,而后台服务器没有考虑到这个情况,那么后台服务器岂不要崩溃了。用nginx就可以把这些东西都拦在nginx上,通过nginx的上传文件大小限制功能来限制,另外nginx性能非常有保障,就放心的让互联网上那些另类的用户和nginx对抗去吧。 用异步传输会造成问题: 后台服务器有提供上传进度的功能的话,用了nginx代理就无法取得进度,这个需要使用nginx的一个第三方模块来实现。 第8点补充: Nginx upstream支持的分配策略及原理: 1.

    Nginx-param-and-sign

    官方文档:http://nginx.org/en/docs/control.html nginx参数和信号 nginx参数 COMMAND ILLUSTRATE -c 为 Nginx 指定一个配置文件,来代替缺省的。 -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。 -v 显示 nginx 的版本。 -V 显示 nginx 的版本,编译器版本和配置参数。 nginx信号 Master进程能够接收并处理如下的信号: COMMAND ILLUSTRATE ERM, INT (快速退出,当前的请求不执行完成就退出) QUIT (优雅退出,执行完当前的请求后退出) HUP (重新加载配置文件,用新的配置文件启动新worker进程,并优雅的关闭旧的worker进程) USR1 (重新打开日志文件) USR2 (平滑的升级nginx二进制文件) WINCH (优雅的关闭worker进程) Worker进程也可以接收并处理一些信号: COMMAND ILLUSTRATE TERM, INT (快速退出) QUIT (优雅退出) USR1 (重新打开日志文件) nginx 启动、停止、重启命令 nginx启动 sudo /usr/local/nginx/nginx (nginx二进制文件绝对路径,可以根据自己安装路径实际决定) nginx从容停止命令,等所有请求结束后关闭服务 ps -ef |grep nginx kill -QUIT nginx主进程号 nginx 快速停止命令,立刻关闭nginx进程 ps -ef |grep nginx kill -TERM nginx主进程号 如果以上命令不管用,可以强制停止