客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完成后,再将结果返回到客户端。如果是一个普通单一的项目,并发请求量小这么做比较合适。
    image.png

    但是实际的开发中,随着业务的增大,数据量和访问量的增长,这样的模式会造成服务器的处理缓慢或者奔溃,出现一系列的性能问题。
    如果解决?
    1、提高服务器的配置(无法从根本上解决问题)
    2、负载均衡

    负载均衡就是增加服务器的数量,然后将请求分发到各个服务器上,将原来请求集中到单个服务器上的情况改为请求到多个服务器上,将负载分发到不同的服务器上,这就是负载均衡。
    image.png

    Nginx 的负载均衡依赖于 upstream 模块,该模块放在 http 模块内部:

    1. http {
    2. upstream backend {
    3. #表示使用 ip 的哈希值决定转发到哪个服务器上
    4. ip_hash;
    5. # 每一个 server 都是一个服务器地址
    6. server backend.example.com;
    7. server backend2.example.com;
    8. }
    9. location / {
    10. proxy_pass http://backend;
    11. }
    12. }

    该案例表示 / 的时候,Nginx 会由 upstream 按照某种特定的规则进行轮流服务。

    Nginx 负载均衡的五种算法:
    1、round robin 轮询(默认)
    按照时间顺序依次将请求分配到各个后台服务器中,挂掉的服务器自动从列表中删除:

    1. upstream backend {
    2. server 192.168.0.1 down;
    3. server 192.168.0.2;
    4. }

    2、 weight 轮询权重
    weight 的值越大分配到的访问概率就越高,主要用于后端服务器性能不均衡的情况下,或在主机默认情况下设置不同的权值,达到合理有效的利用主机资源。

    1. upstream backend {
    2. server 192.168.0.1 weight=20;
    3. server 192.168.0.2 weight=10;
    4. }

    3、ip_hash
    每个请求按照访问 IP 的哈希结果进行分配,使来自同一个 IP 的访客固定访问一台后端服务器。并且可以有效的解决动态网页存在 session 共享的问题。

    1. upstream backend {
    2. ip_hash;
    3. server 192.168.0.1;
    4. server 192.168.0.2;
    5. }

    4、url_hash
    按照访问的 url 的哈希结果来分配请求,使每个 URL 定向到同一台服务器,可以进一步提高后端服务器缓存的效率。
    Nginx 本身不支持 url_hash,需要按照 Nginx 的 hash 软件包。

    1. upstream backend {
    2. server 192.168.0.1; #使用 url_hash 的时候,不能再使用 weight 等其他参数
    3. server 192.168.0.2;
    4. hash $request_uri;
    5. hash_method crc32; #使用 hash 算法
    6. }

    5、fair 算法
    可以根据页面大小和加载时间长短智能的进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。
    Nginx 本身不支持 fair,要安装 upstream_fair 模块才能使用。

    1. upstream backend {
    2. fair;
    3. server 192.168.0.1;
    4. server 192.168.0.2;
    5. }