1.四层负载均衡
基于传输层协议包来封装的(TCP/IP),七层负载均衡是应用层协议,组装在四层负载均衡之上。两者都指的是OSI网络模型。
- 实现端口的转发,ssh,mysql等都是TCP协议请求,连接的服务也可使用四层负载均衡。
- 四层结合七层实现大规模集群架构(四层仅识别端口实现转发)
七层负载均衡连接有限,需要接入多台七层负载均衡。
四层可以保证七层负载均衡的高可用性。 - 四层负载均衡仅能转发TCP/IP协议、UDP协议,通常用来转发端口:如 tcp/80 tcp/443 tcp/3306 tcp/22 udp/53
2.配置及使用
- 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
- 配置四层均衡负载服务器
#用户请求四层负载均衡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;
}
}
- 配置四层负载均衡 :基于端口转发( 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携带到后端。
- 四层配置
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结束----------------
- 七层(如果有多个配置第一个七层即可)
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;
}
}
- 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;
}
}