Nginx-LVS-反向代理-realip-四层七层负载均衡

代理

正向代理:正向代理作用在客户端,我们访问一个网站比如只能在校园访问的校园网站,校外访问不了,但是我们可以通过一个代理服务器,比如一台在校内的服务器,校内服务器可以访问到校园网站,那么我们连上这个服务器,让它请求我们需要的网站,再返回给我们,这就是正向代理。

反向代理:反向代理是作用在服务器端的,对于用户的一个请求,会转发到多个后端处理器中的一台来处理该具体请求,但是用户并不知道自己的数据被转发到其他处理器。常见的DNS解析和负载均衡就是反向代理。

Nginx支持反向代理,可以做内容缓冲和负载均衡器。
CDN内容分发网络就使用了Nginx反向代理,缓存网站的静态内容。

作用

1.在搭建VPN时,只要用到Nginx反向代理功能搭建,那么VPN速度会大大提高。原因就是Nginx反向代理做了内容缓冲。
2.负载均衡,解决容错,用户访问量过大,支持更高并发请求。

基于七层交换技术的负载均衡

负载均衡算法

Nginx org官方文档
Nginx Plus 官方文档

  • 轮循(Round Robin):把来自用户的请求轮流分配给内部的服务器,从服务器1开始,直到服务器N,然后重新开始循环

  • 加权轮询:不同的服务器配置,抗压能力,负载不同的时候,约定权重,根据权重进行轮询。

  • 最少连接数(Least Connection):轮询法不能识别在给定的时间里保持了多少连接,因此可能发生,服务器B服务器收到的连接比服务器A少但是它已经超载,比如B服务器虽然收到的连接数少,但是都保持连接,没有断开,A服务器虽然收到的连接数多,但是实际大都断开连接,这时候就需要优先选择活跃连接数最少的服务器。

  • 源IP哈希(Source IP Hash):根据客户端IP地址进行转发。保证某个特定的客户端最终会访问到同一个服务器主机,服务器需要保存用户信息的时候经常使用这种算法。

  • 通用哈希(Generci Hash):根据一个 自定义键值确定最终转发的目的地,该键值可以是字符串,变量或者组合如源 IP 和端口号

  • 最短响应时间(Least Time):NGINX Plus选择具有最低平均延迟和最低活动连接数的服务器

  • 随机(Random):随机选择服务器(NGINX Plus)

session和cookie

首先讲HTTP协议是无状态的协议,但是服务端需要记录用户的状态,所以就产生了session和cookie,cookie相当于你拿着学生证让门卫进行确认,这样就能从学生证上确认学生身份了,学生证由学生本人保存,里面存放了学生的个人信息,同理cookie是客户端浏览器保存用户信息的地方。
session相当于你告诉门卫你的名字,去学校后台数据库查找有没有这个学生,是在服务器端保存用户信息的地方

实验配置

1.轮询
在这里插入图片描述

负载均衡服务端配置

cp nginx.conf.default  nginx.conf #覆盖默认配置
 http {
    
    
 	upstream myapp1 {
    
    
        server 192.168.2.218;
        server 192.168.2.188;
        server 192.168.2.178;
    }
	 server {
    
    
        listen 80;

        location / {
    
    
        	# root   html; 需要注释
            # index  index.html index.htm; 需要注释
            proxy_pass http://myapp1;
        }
    }
}

后端配置
如果后端都没有安装nginx,报502错误,负载均衡器正常,后端故障。

健康检测:nginx 被动健康检测来自特定服务器的响应,如果失败错误,nginx 会将此服务器标记为失败,并会在一段时间内尝试避免选择此服务器用于后续的入站请求。
都安装好nginx,负载均衡器将采用轮询方式,轮流访问目的IP。

2.加权轮询

upstream myapp1 {
    
    
    server 192.168.2.218 weight=3;
    server 192.168.2.188;
    server 192.168.2.178;
}

3.最小连接数

 upstream myapp1 {
    
    
        least_conn;
		server 192.168.2.218;
        server 192.168.2.188;
        server 192.168.2.178;
    }

4.IP哈希

upstream myapp1 {
    
    
       ip_hash;
	   server 192.168.2.218;
       server 192.168.2.188;
       server 192.168.2.178;
}

5.Genric哈希

upstream myapp1 {
    
    
       hash $request_uri consistent;
	   server 192.168.2.218;
       server 192.168.2.188;
       server 192.168.2.178;
}

6.最短响应时间

upstream myapp1 {
    
    
       least_time header;
	   server 192.168.2.218;
       server 192.168.2.188;
       server 192.168.2.178;
}

7.随机Random

upstream myapp1 {
    
    
       random;
	   server 192.168.2.218;
       server 192.168.2.188;
       server 192.168.2.178;
}

Realip模块使用获取用户真实IP地址

FULLNAT:将返回的数据包源地址改为自己(SNAT),目的地址改为客户端(DNAT),源地址和目的地址都变。nginx负载均衡就是使用了FULLNAT模式

问题:Nginx反向代理无法获取到用户客户端的真实IP地址,因为FULLNAT模式已经将源地址和目的地址都修改了。

解决方法

1.X-REAL-IP

  • .在负载均衡器上修改http请求报文字段,添加一个X-REAL-IP字段,X-Real-IP这个变量可以自定义,不区分大小写。

    location / {
          
          
               # root   html;
               # index  index.html index.htm;
               proxy_pass http://myapp1;
               proxy_set_header   X-Real-IP        $remote_addr;
     }
    
  • 在后端conf/nginx.conf添加这个字段$http_x_real_ip取消注释

    log_format  main  '$remote_addr - $http_x_real_ip $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log  logs/access.log  main;
    
    nginx -s reload #刷新
    tail -f /logs/access.log #查看日志
    

    真实地址为192.168.2.14
    在这里插入图片描述

2.使用realip模块

  • 在编译安装前,使用 --with-http_realip_module 启用此模块

  • 在后端conf/nginx.conf location添加一行set_real_ip_from 负载均衡器IP地址;

      location / {
          
          
                root   html;
                set_real_ip_from  192.168.2.5;
                index  index.html index.htm;
            }
    
    nginx -s reload #刷新
    tail -f /logs/access.log #查看日志
    

    真实地址为192.168.2.14
    在这里插入图片描述

基于四层交换技术的负载均衡

四层、七层负载均衡区别

七层即应用层,就是基于 URL 等应用层信息的负载均衡。只支持http
四层即传输层,就是基于IP和端口的负载均衡。支持http,mysql,dns,ftp

LVS和Nginx负载均衡区别

  • 层数:LVS只工作在第四层传输层,支持http,mysql,dns,ftp,Nginx还可以工作在七层,针对域名、目录结构分流。
  • LVS效率高,LVS内核内置
  • LVS配置性低,没有太多可配置的选项,所以工作稳定
  • LVS缺乏持续的更新,Nginx被F5收购,有源源不断的支持。

实验配置

官方文档

worker_processes auto;
error_log /usr/local/scwangyutao99/logs/error.log info;
events {
    
    
    worker_connections  1024;
}
stream {
    
    
    upstream backend {
    
    
       # hash $remote_addr consistent;
        server 192.168.2.178:80 weight=5;
        server 192.168.2.218:80 weight=5;
        server 192.168.2.188:80 weight=5;
    }
    upstream dns {
    
    
       server 192.168.0.1:53;
       server 192.168.0.3:53;
    }
    server {
    
    
        listen 80;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }
    server {
    
    
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }
}  

猜你喜欢

转载自blog.csdn.net/weixin_46415378/article/details/123749834