负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机和某台服务器闲置的情况。那么负载均衡的前提就是要2台以上服务器才能实现。
Nginx的优点是:
1、工作在网络的 7层之上,可以针对http应用做一些 分流的策略,比如针对域名、目录结构,它的 正则规则比HAProxy更为 强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。2、Nginx对 网络稳定性的依赖非常小,理论上 能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会;
3、Nginx 安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
3、可以承担 高负载压力且稳定,在硬件不差的情况下一般 能支撑几万次的并发量,负载度比LVS相对小些。
4、Nginx可以通过端口 检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中 缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。
5、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是 功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。
6、Nginx现在作为Web 反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。
7、Nginx可作为 中层反向代理使用, 这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有 lighttpd了,不过 lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
8、Nginx也可作为 静态网页和图片服务器,这方面的性能 也无对手。还有Nginx社区非常活跃,第三方模块也很多。
淘宝的前端使用的Tengine就是基于nginx做的二次开发定制版。
Nginx的缺点是:
1、 Nginx仅能支持http、https和Email协议,这样就在适用 范围上面小些,这个是它的缺点。
2、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。
由于没有服务器,所以本次测试直接host指定域名,服务器不够,我们用nodejs监听了三个端口(8881,8882,8888)来模拟多台服务器。nginx监听80端口作为主服务器。
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('server 8881');
}).listen(8881);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8881/');
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('server 8882');
}).listen(8882);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8882');
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('server 8888');
}).listen(8888);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
测试域名yongle.com
A服务器监听80端口(主)
B服务器监听8881端口(从)
C服务器监听8882端口(从)
D服务器监听8888端口(从)
A服务器做为主服务器,域名直接解析到A服务器( 127.0.0.1:80)上,由A服务器负载均衡到B服务器( 127.0.0.1:8881)、C服务器( 127.0.0.1:8882)和D服务器( 127.0.0.1:8888)上。
A服务器nginx.conf设置打开nginx.conf,文件位置在nginx安装目录的conf目录下。在http段加入以下代码
upstream yongle.com {
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8888;
}
server{
listen 80;
server_name yongle.com;
location / {
proxy_pass http://yongle.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存重启nginx即可完成负载均衡
我们把域名解析到A服务器,然后由A服务器转发到B服务器C服务器与D服务器,那么A服务器只做一个转发功能,现在我们让A服务器也提供站点服务。
如果添加主服务器到upstream中,那么可能会有以下两种情况发生:
1、主服务器转发到了其它IP上,其它IP服务器正常处理;
2、主服务器转发到了自己IP上,然后又进到主服务器分配IP那里,假如一直分配到本机,则会造成一个死循环。
怎么解决这个问题呢?因为80端口已经用来监听负载均衡的处理,那么本服务器上就不能再使用80端口来处理yongle.com的访问请求,必须重新监听一个新的端口。于是我们把主服务器的nginx.conf加入以下一段代码:
server {
listen 8000;
server_name yongle.com;
location / {
root html;
index index.html index.htm;
}
}
把主服务器添加到upstream中
upstream yongle.com {
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8888;
server 127.0.0.1:8000;
}
到这里我们就完成了把主服务器也加入到了负载均衡中。
- Nginx负载均衡有4种方案配置
1、轮询
轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器上
2、最少连接 least_conn;
Web请求会被转发到连接数最少的服务器上。
3、IP地址哈希 ip_hash;
前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于IP地址哈希的负载均衡方案。这样的话,同一客户端连续的Web请求都会被分发到同一服务器进行处理。
4、基于权重 weight
基于权重的负载均衡即Weighted Load Balancing,这种方式下,我们可以配置Nginx把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。
作者:LittleOne丶
链接:https://www.jianshu.com/p/ac8956f79206
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。