深入浅出Nginx的基本原理和配置指南「负载均衡篇」
作者:mmseoamin日期:2023-12-11

6 nginx负载均衡

深入浅出Nginx的基本原理和配置指南「负载均衡篇」,第1张

6.1 四层负载均衡

6.1.1 四层负载均衡与七层负载均衡的区别

四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的要高。四层负载均衡不识别域名,而七层负载均衡识别域名。

6.1.2 四层负载均衡配置

注意stream模块的位置,要在http模块上方,同时proxy_pass的书写方式也有不同。

深入浅出Nginx的基本原理和配置指南「负载均衡篇」,第2张

6.2 七层负载均衡

Nginx提供负载均衡的模块是:

ngx_http_proxy_module        proxy代理模块,用于把请求抛给后端的服务器节点,或是upstream服务器池
ngx_http_upstream_module    负载均衡模块,实现服务器的负载均衡节点配置,以及健康检查
6.2.1 nginx的负载均衡语法

 

http {
     upstream [你的负载均衡机制名称,随便设置一个就好] {
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
 }
 server {
	 listen [nginx监听端口];
	 server_name [head中的host对应的值]
	 location / {
	   proxy_pass http:// [你的负载均衡机制名称,对应上面upstream的值];
         }
    }
}
6.2.2 nginx的负载均衡策略
1.轮询(默认)

        每个请求按照请求时间顺序分配到不同的后端服务器,如果后端服务器挂了,则自动剔除

 2.权重

        指定轮询的频率,weight和访问率成正比,用于后端服务器性能不均匀的情况

 http {
	upstream ipHashLoadBalanceServer {
        ip_hash;
        server www.address1.com weight=3;// 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com; // default weight=1
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}
3.ip_hash

        客户端ip地址被用作hash key来判断客户端请求应该发送到哪个服务器,这种方法保证了来自相同客户端的请求总是发送到相同服务器(如果服务器可用的话

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
4.最少连接

        nginx会尽量不让负载繁忙的应用服务器上负载过多的请求,相反的,会把新的请求发送到比较不繁忙的服务器。

upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
}
6.2.3 故障下线和备份服务设置
1.down

        假如有一台主机是出了故障,或者下线了,要暂时移出,那可以把它标为down,表示请求是会略过这台主机的。

upstream downServer {
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com down;
}
2.backup

        backup是指备份的机器,相对于备份的机器来说,其他的机器就相当于主要服务器,只要当主要服务器不可用的时候,才会用到备用服务器。

upstream backupServer {
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com backup;
}
3.max_fails和fail_timeout

        默认情况下,max_fails的值为1,表示的是请求失败的次数,请求1次失败就换到下台主机。另外还有一个参数是fail_timeout,表示的是请求失败的超时时间,在设定的时间内没有成功,那作为失败处理。

upstream backupServer {
        server www.address1.com max_fails=2; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com backup;
}
6.2.4 proxy_pass参数

参数

作用解释

proxy_set_header

设置反向代理向后端发送的http请求头信息,如添加host主机头部字段,让后端服务器能够获取到真实客户端的IP信息等

client_body_buffer_size

指定客户端请求主体缓冲区大小

proxy_connect_timeout

反向代理和后端节点连接的超时时间,也是建立握手后等待响应的时间

proxy_send_timeout

表示代理后端服务器的数据回传时间,在规定时间内后端若数据未传完,nginx会断开连接

proxy_read_timeout

设置Nginx从代理服务器获取数据的超时时间

proxy_buffer

设置缓冲区的数量大小

7 nginx的URL地址重写

7.1 rewrite

Nginx rewrire技术主要是实现URL地址重写,且支持正则表达式的规则。

语法

rewrite ^/(.*) http://192.168.178.134/ permanent;
rewrite是指令,开启一个跳转规则
^/(.*) 表示匹配所有,匹配成功后跳转到后面的url地址
 表示取出前面正则括号里的内容
permanent表示 301 重定向的标记
7.1.1 rewrite的结尾参数 flag标记

标记

解释a

last

规则匹配完成后,继续向下匹配新的Locaiton

break

本条规则完成匹配后,立即停止

redirect

返回302临时重定向,浏览器地址栏显示跳转后的URL

permanent

返回301永久重定向,浏览器地址显示跳转后的URL

last和break用于实现URL重写,浏览器地址栏不发生变化

redirect和permanent用于实现URL跳转,浏览器地址栏跳转新的URL

7.1.2 rewrite使用场景
  1. 地址跳转,用户访问URL时,会将其定向至一个新域名
  2. 协议跳转,将用户通过http的请求协议重新跳转至https协议
  3. URL静态化,减少动态URL对外暴露过多参数,减少服务器负担
7.1.3 案例
例:用户使用手机设备访问,则跳转定义好的文件夹下

深入浅出Nginx的基本原理和配置指南「负载均衡篇」,第3张

网站维护期间,仅指定ip可以访问,其他ip跳转维护页面

深入浅出Nginx的基本原理和配置指南「负载均衡篇」,第4张

7.2 return

7.2.1 http跳转https
server {
    listen       80;
    server_name  yzb.lsp.com;
    location / {
      return     301 https://$server_name$request_uri;
    }
}
server {
    listen       443 ssl;
    server_name  yzb.lsp.com;
    include /opt/env/nginx/servs/ssl.settings;
    location / {
      root /opt/apps/front-yzb;
      index serve.html index.html index.htm;
   }
    include /opt/env/nginx/servs/yzb.locations;
}