客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完成后,再将结果返回到客户端。如果是一个普通单一的项目,并发请求量小这么做比较合适。
但是实际的开发中,随着业务的增大,数据量和访问量的增长,这样的模式会造成服务器的处理缓慢或者奔溃,出现一系列的性能问题。
如果解决?
1、提高服务器的配置(无法从根本上解决问题)
2、负载均衡
负载均衡就是增加服务器的数量,然后将请求分发到各个服务器上,将原来请求集中到单个服务器上的情况改为请求到多个服务器上,将负载分发到不同的服务器上,这就是负载均衡。
Nginx 的负载均衡依赖于 upstream 模块,该模块放在 http 模块内部:
http {
upstream backend {
#表示使用 ip 的哈希值决定转发到哪个服务器上
ip_hash;
# 每一个 server 都是一个服务器地址
server backend.example.com;
server backend2.example.com;
}
location / {
proxy_pass http://backend;
}
}
该案例表示 / 的时候,Nginx 会由 upstream 按照某种特定的规则进行轮流服务。
Nginx 负载均衡的五种算法:
1、round robin 轮询(默认)
按照时间顺序依次将请求分配到各个后台服务器中,挂掉的服务器自动从列表中删除:
upstream backend {
server 192.168.0.1 down;
server 192.168.0.2;
}
2、 weight 轮询权重
weight 的值越大分配到的访问概率就越高,主要用于后端服务器性能不均衡的情况下,或在主机默认情况下设置不同的权值,达到合理有效的利用主机资源。
upstream backend {
server 192.168.0.1 weight=20;
server 192.168.0.2 weight=10;
}
3、ip_hash
每个请求按照访问 IP 的哈希结果进行分配,使来自同一个 IP 的访客固定访问一台后端服务器。并且可以有效的解决动态网页存在 session 共享的问题。
upstream backend {
ip_hash;
server 192.168.0.1;
server 192.168.0.2;
}
4、url_hash
按照访问的 url 的哈希结果来分配请求,使每个 URL 定向到同一台服务器,可以进一步提高后端服务器缓存的效率。
Nginx 本身不支持 url_hash,需要按照 Nginx 的 hash 软件包。
upstream backend {
server 192.168.0.1; #使用 url_hash 的时候,不能再使用 weight 等其他参数
server 192.168.0.2;
hash $request_uri;
hash_method crc32; #使用 hash 算法
}
5、fair 算法
可以根据页面大小和加载时间长短智能的进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。
Nginx 本身不支持 fair,要安装 upstream_fair 模块才能使用。
upstream backend {
fair;
server 192.168.0.1;
server 192.168.0.2;
}