文章目录
- 一、什么是负载均衡
- 二、负载均衡器如何选择要转发的后端服务器?
- 三、Nginx作为负载均衡的优点
- 四、Nginx的缺点
- 五、nginx配置http负载均衡
- nginx upstream 名称下划线问题
- 六、参考
一、什么是负载均衡
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
负载均衡器的管理员能主要为下面四种主要类型的请求设置转发规则:
- HTTP
- HTTPS
- TCP
- UDP
二、负载均衡器如何选择要转发的后端服务器?
负载均衡器应当只选择能正常做出响应的后端服务器,因此就需要有一种判断后端服务器是否「健康」的方法。为了监视后台服务器的运行状况,**运行状态检查服务会定期尝试使用转发规则定义的协议和端口去连接后端服务器。**如果,服务器无法通过健康检查,就会从池中剔除,保证流量不会被转发到该服务器,直到其再次通过健康检查为止。
三、Nginx作为负载均衡的优点
常见负载均衡的优点和缺点对比(Nginx、HAProxy、LVS)
参考URL:
- 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。
- Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大。
- Nginx安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来。
- 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。
- Nginx可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点。
- Nginx社区活跃,第三方模块非常多。
四、Nginx的缺点
- Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
- 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。
五、nginx配置http负载均衡
nginx 实现负载均衡用到了 proxy_pass 代理模块核心配置, 将客户端请求代理转发至一组 upstream 虚拟服务池。
a、使用upstream定义web服务器池,包含web1、web2节点。
b、proxy_pass把访问请求转发给之前定义的web服务器池。
- 编辑nginx的配置文件
vi nginx/conf/nginx.conf
http {
upstream upstream_name{
server 192.168.0.28:8001;
server 192.168.0.28:8002;
}
#定义服务池
upstream apollo-configservice-pools-dev {
server 192.168.0.100:8080 weight=1;
server 192.168.0.101:8080 weight=1;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://apollo-configservice-pools-dev;
}
location /test {
proxy_pass http://upstream_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
在http下添加 upstream upstream_name {} 来配置要映射的服务器。
其中的upstream_name大家可以指定为服务的域名或者项目的代号。
nginx upstream 名称下划线问题
nginx upstream 中带下划线bug,前端会报400错误
参考URL:
经过测试,发现nginx 在配置upstream的时候,
如果名字带有下划线,会导致前端返回400错误。
原因分析:
带有下划线的Host的http请求,tomcat认为是有问题
那为什么之前版本的tomcat是正常的呢?
新版本的tomcat对这个头部进行了校验,旧版本没有校验。
好了,到这里我们就知道了,其实对于带有下划线的Host,tomcat是遵循的RFC1-1034的规范的,所以tomcat的处理是正确的。
但是tomcat在处理某些其他合法的Host的时候历史上出现过bug,但是对于下划线的处理一直是正确的。
所以,以后nginx在配置upstream的时候不能使用带有下划线的名称
nginx在没有配置proxy_set_header HOST $host 的时候,在转发http请求的时候会默认把upstream的名称作为Host头部的内容。
也就是说新版的tomcat在接收Host为sc_java(带有下划线)的http请求报了400错误
proxy_set_header HOST $host
这个配置是啥意思?
这个配置的主要是在nginx在转发htp请求的时候会加上实际的Host请求头。如http请求是 http://abc.com/hello,那么nginx在转发http请求的时候会原封不动的把host请求头(Host:abc.com)转发给后台服务。对于nginx而言,如果没有配置proxy_set_header HOST $host的时候会默认修改Host为upstream的名称。
六、参考
Nginx 负载均衡(简单配置)
参考URL: https://blog.51cto.com/bilibili/2059677
使用 Nginx 配置负载均衡
参考URL: https://www.jianshu.com/p/19b1fdc3a469