代理简介
Nginx采用C进行编写,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名,其特点是占有内存少,并发能力强。 Nginx 代理有正向和反向代理,可以基于OSI七层模型中的第四层(传输层)和第七层(应用层)进行代理 Nginx 一般支持的是7层代理,支持4层代理一般使用 lvs 或者haprox Nginx 从1.9.0 版本开始支持四层代理,但做四层代理时 源码编译需要添加 --with-stream模块, 这里的 --with-stream 是添加四层代理模块,可以用来创建其他业务集群
七层模型
四层模型
正向代理
代理客户端, 正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端的服务都被代理服务器代替请求, 例如VPN就是典型的正向代理 客户端 <-------> 代理 -----------> 服务端
反向代理
代理服务端, 反向代理的过程隐藏了真实的服务器,客户端不知道真正提供服务的是谁,客户端请求的服务都被代理服务器接收 客户端 -------> 代理 <-----------> 服务端
七层代理
OSI第7层代理是写在http模块中的, OSI第7层(应用层)协议, 主要支持的协议有http,htps,smtp,ftp,dns,pop3,dhcp等协议 OSI第7层(应用层)代理, 通常是http代理, 基于url和ip以及cookie和请求头针对web服务进行分流, 通过虚拟的 URL 或主机名接收请求,然后再分配到真实的服务器, 是基于URL等应用层信息的负载均衡 OSI第7层(应用层)代理, 可以是正向代理,也可以是反向代理
四层代理
OSI第4层(传输层)代理, 是写在stream模块中,与http模块并列,且做代理时源码编译需要添加 --with-stream 模块进行编译 OSI第4层(传输层)协议, 是基于TCP/UDP协议 OSI第4层(传输层)代理, 是基于ip和端口的转发, –with-stream 是添加四层代理模块,可以用来创建其他业务集群,比如ssh,mysql, 所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡 设备设置的服务器选择方式,决定最终选择的内部服务器,它一般走的是tcp,udp协议 OSI第4层(传输层)代理, 一般都是反向代理
正向代理示例
server {
resolver 8.8 .8.8;
location / {
proxy_pass http://$host $request_uri ;
}
}
反向代理示例
server {
location / {
proxy_pass http://localhost:8000;
}
}
服务器集群配置信息:
服务器IP 安装服务
192.168 .1.100 nginx, sshd
192.168 .1.101 nginx, sshd
4层反向代理示例
登录192.168.1.100服务器
vim /etc/nginx/conf.d/tcp_4_proxy.conf
stream {
upstream backend {
server 192.168 .1.100:22;
server 192.168 .1.101:22;
}
server {
listen 12345 ;
proxy_pass backend;
}
}
7层反向代理示例
登录192.168.1.100服务器
vim /etc/nginx/conf.d/http_7_proxy.conf
upstream web {
server 192.168 .1.100:80;
server 192.168 .1.101:80;
}
server {
listen 80 ;
location / {
proxy_pass http://web;
root html;
index index.html index.htm;
}
}
7层正向代理示例
登录192.168.1.100服务器
vim /etc/nginx/conf.d/http_7_proxy.conf
http {
server {
listen 3128 ;
location / {
proxy_pass http://192.168.1.101:22;
proxy_set_header Host $http_host ;
proxy_set_header X-Real-IP $remote_addr ;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
}
}
}
upstream模块参数
参数 说明
server 负载后面的RS配置,可以是ip或者域名
weight 请求服务器的权重。默认值为1,越大表示接受的请求比例越大
max_fails nginx 尝试连接后端主机失败的次数,需要配合proxy_net_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用
fail_timeout 在max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s
backup 热备配置,标志这台服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求
down 表示这个服务器永不可用,可配合ip_hash使用
集群常用软硬件
常用开源集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat 常用商业集群硬件有:F5, Netscaler,Radware,A10等
负载均衡算法
rr轮询(默认)
默认调度算法,每个请求按时间顺序逐一分配到不同的后端服务器,宕机的服务器会自动从节点服务器池中剔除。
upstream server_pool {
server 192.168 .1.100;
server 192.168 .1.101;
}
wrr加权轮询(weight)
在rr轮询算法的基础上加上权重,权重和用户访问成正比,权重值越大,被转发的请求也就越多, 加权轮询应用于服务器性能不等的集群中,使资源分配更加合理化
upstream server_pool {
server 192.168 .1.100 weight = 5 ;
server 192.168 .1.101 weight = 10 ;
}
ip_hash(会话保持)
每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题
upstream server_pool {
ip_hash;
server 192.168 .1.100;
server 192.168 .1.101;
}
fair(动态调度算法)
此种算法根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx 本身是 不支持 fair 的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair 模块
upstream server_pool {
server 192.168 .1.100;
server 192.168 .1.101;
fair;
}
url_hash算法(web缓存节点)
根据访问URL的hash结果来分配请求,让每个URL定向到同一个后端服务器, 同样,Nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装Nginx的hash模块软件包。
upstream server_pool {
server 192.168 .1.100;
server 192.168 .1.101;
hash $request_uri ;
hash_method crc32;
}