nginx四层负载均衡

本文介绍了nginx的四层负载均衡,强调了它基于传输层协议的特性,并通过stream模块进行配置,用于端口转发如SSH、MySQL等。内容包括四层负载均衡的配置、日志记录以及如何在负载均衡中传递真实IP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.四层负载均衡

基于传输层协议包来封装的(TCP/IP),七层负载均衡是应用层协议,组装在四层负载均衡之上。两者都指的是OSI网络模型。

  1. 实现端口的转发,ssh,mysql等都是TCP协议请求,连接的服务也可使用四层负载均衡。
  2. 四层结合七层实现大规模集群架构(四层仅识别端口实现转发)
    七层负载均衡连接有限,需要接入多台七层负载均衡。
    四层可以保证七层负载均衡的高可用性。
  3. 四层负载均衡仅能转发TCP/IP协议、UDP协议,通常用来转发端口:如 tcp/80 tcp/443 tcp/3306 tcp/22 udp/53
2.配置及使用
  1. nginx四层语法:stream模块实现,不能出现在http {} 里面
stream {
    upstream backend {
        hash $remote_addr consistent;
        server backend1.example.com:12345 weight=5;
        server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }
}

注意:nginx默认的去掉

gzip /etc/nginx/conf.d/default.conf
  1. 配置四层均衡负载服务器
#用户请求四层负载均衡80,调度到后端七层负载均衡  (与http{}同级)
stream {
	upstream lb {
		server 172.16.1.5:80 weight=3 max_fails=2 fail_timeout=10s;
		#server 172.16.1.6:80 weight=3 max_fails=2 fail_timeout=10s;
	}
	server {
		listen 80;
		proxy_pass lb;
		proxy_connect_timeout 3s;
		proxy_timeout 3s;
	}
}
  1. 配置四层负载均衡 :基于端口转发( 22端口,3306端口 )
#用户请求四层负载均衡80,调度到后端七层负载均衡
stream {
	upstream lb {
		server 10.0.0.5:80;
		#server 172.16.1.6:80 weight=3 max_fails=2 fail_timeout=10s;
	}

	server {
		listen 80;
		proxy_pass lb;
		proxy_connect_timeout 100s;
		proxy_timeout 100s;
	}
	upstream ssh {
		server 172.16.1.51:22;
	}
	upstream mysql {
		server 172.16.1.51:3306;
	}

	server {
		listen 5555;
		proxy_pass ssh;
	}
	server {
		listen 6666;
		proxy_pass mysql;
	}
}

测试:ssh root@10.0.0.4 -p5555

3.四层的记录日志
vim /etc/nginx/nginx.conf
--------------/etc/nginx/nginx.conf------------------
user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

#用户请求四层负载均衡80,调度到后端七层负载均衡
stream {
	#定义日志的格式
log_format  proxy '$remote_addr -  [$time_local]  $status $protocol'
                ' "$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';
	#调用日志
	access_log /var/log/nginx/tcp_access.log proxy;
	upstream lb {
		server 10.0.0.5:80;
		#server 172.16.1.6:80 weight=3 max_fails=2 fail_timeout=10s;
	}
	server {
		listen 80;
		proxy_pass lb;
		proxy_connect_timeout 100s;
		proxy_timeout 100s;
	}
###
	upstream ssh {
		server 172.16.1.51:22;
	}
	upstream mysql {
		server 172.16.1.51:3306;
	}

	server {
		listen 5555;
		proxy_pass ssh;
	}
	server {
		listen 6666;
		proxy_pass mysql;
	}
}
-------------/etc/nginx/nginx.conf结束----------------
4.负载均衡如何传真实IP

四层添加proxy_protocol协议(传递信息携带一个新的tcp头部,包含源IP、源端口等)。七层需要支持proxy_protocol,在listen 80添加proxy_protocol,排除七层前面代理的IP地址,set_real_ip_from,同时将proxy_protocol协议提取真实IP地址复制给 $remote_addr变量通过x-forwarded-for携带到后端。

  1. 四层配置
vim /etc/nginx/nginx.conf
-------------/etc/nginx/nginx.conf-------------------
stream {
    upstream web {
        server 172.16.1.5:80;
    }

    server {
        listen 80;
        proxy_pass web;
        proxy_protocol on;  #开启proxy_protocol协议
    }
}
-------------/etc/nginx/nginx.conf结束----------------
  1. 七层(如果有多个配置第一个七层即可)
vim /etc/nginx/conf.d/proxy_ip_oldxu.com.conf
upstream ip {
    server 172.16.1.7:80;
}

server {
    server_name ip.oldxu.com;
    listen 80 proxy_protocol;        #添加proxy_protocol
    set_real_ip_from 172.16.1.0/24;  #添加七层负载前经过的代理IP地址
    real_ip_header proxy_protocol;   #将proxy_protocol获取的IP赋值给$remote_addr


    location / {
        proxy_pass http://ip;
        proxy_set_header Host $http_host;
        #将proxy_protocol真实客户端的IP地址赋值给X-Forwarded-For变量携带至后端
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
    }
}
  1. web服务器
vim /etc/nginx/conf.d/ip.oldxu.com.conf
server {
	listen 80;
	server_name ip.oldxu.com;
	root  /php;

	#web前端所有的代理服务器地址,一个都不能少
	set_real_ip_from 10.0.0.5;
	set_real_ip_from 10.0.0.7;
	set_real_ip_from 172.16.1.4;
	real_ip_header X-Forwarded-For;	
	real_ip_recursive on;	

	location /  {
		index index.php;
	}

	location ~ \.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include  fastcgi_params;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值