反向代理的两种类型
七层代理
基于http、https、mail等七层协议的反向代理
使用场景:动静分离
特点:功能强大,但转发性能较4层偏低
7层是指应用层
配置
在http块里设置upstream后端服务器池,在server里用location匹配动态页面路径,使用proxy_pass http://服务器池名 进行7层协议(http协议)转发
http {
upstream backerserver {
server IP1:PORT1 {weight= fail=...};
server IP2:PORT2 {weight= fail=...};
....
}
server {
listen 80;
server_name xxx;
location ~ 正则表达式 {
proxy_pass http://backerserver;
.....
}
}
}
四层代理
基于IP+(tcp或者udp)端口的代理
使用场景:负载均衡器/负载调度器,做服务器集群的访问入口
特点:只能根据IP+端口转发,但是转发性能较好
在做四层代理是编译需要添加 --with-stream
4层是在网络层
配置
和http块同一层上面配置stream模块,在stream模块中的upstream模块中定义服务器组名和服务器列表,在stream模块中的server模块配置监听的ip:端口,主机名和proxy_pass服务器组名
stream {
upstream backerserver {
server IP1:PORT1 [wegiht= max_fails=...];
server IP2:PORT2 [wegiht= max_fails=...];
....
}
server {
listen 80;
server_name xxx;
location ~ 正则表达式 {
proxy_pass backerserver;
}
}
}
用户 --> 192.168.80.14:80 ---> 192.168.80.15:8080
nginx服务器 tomcat服务器
Nginx 实现负载均衡的策略 算法
配置在upstream块中
| 算法 | 详解 |
|---|---|
| 轮询(默认)rr | 每个请求按时间顺讯逐一分配到不同到后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响 |
| 加权轮询 wegiht | weight的值越大分配到权限概率越高,主要用于后端每台服务器性能不均匀情况,或者仅仅为在主从的情况下设置不同的权重值,达到合理利用主机资源 |
| 源地址哈希 ip_hash | ip_hash每个请求按访问ip的哈希结果分配,便来自同一个ip的访客固定访问一台后端服务器,并且可以有效解决动态网页存在session共享问题 |
| fair | 比weight、ip_hash更智能的负载均衡算法,根据页面大小和加载时间长短智能进行负载均衡,根据后端服务器响应时间来分配请求,nginx不支持fair,需要使用必须安装upstream_fair模块 |
| url_bash | 按访问url的哈希结果来分配请求,使每个url定向到一台后端服务器,可以进一步提高后端缓存服务器的效率例如:hash$request_uriconsistent;#局域用户请求的url做hash |
| 最小连接least_conn | 最小连接调度算法,优先将客户端请求调度带当前连接最少的服务器 |
nginx如何实现会话保持
1.ip_hash url_hash (造成负载不均)
2.使用sticky_cookie_insert基于cookie来判断
3.通过后端服务器session共享实现
sticky_cookie_insert
使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器在同一台服务器。与ip_hash不同之处在于,它不是基于ip来判断客户端的,而是基于cookie来判断,因此可以避免上述ip_hash中来自同一局域网的客户端和前段代理导致负载失衡的情况
语法:
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky_cookie_insert srv_id expires=1h domain=toxingwang.com path=/;
}
说明:
expires:设置浏览器中保持cookie 的时间
domain:定义cookie的域
path:为cookie定义路径
Nginx四层代理配置步骤
1.配置好两台Nginx七层代理服务器
2.在四层代理的Nginx服务器上做相关配置
先安装好nginx服务
在配置好的Nginx服务器上新增模块
./configure --with-stream
make 只需编译无需安装
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx -s reload ##重启
vim /usr/local/nginx/conf/nginx.conf
和http同等级:所以一般只在http上面一段设置,
stream {
upstream appserver{
server 192.168.46.40:8080 weight=1;
server 192.168.46.30:8080 weight=1;
}
server {
listen 8080;
proxy_pass appserver;
}
}
3.重启服务并进行浏览器访问
基于端口访问,会有缓存时间才会实现跳转到别的tomcat服务器上
怎么实现动静分离?
nginx使用location去正则匹配用户的访问路径的前缀或后缀去判断接受的请求是静态的还是动态的,静态资源请求在nginx本地进行响应,动态页面请求通过反向代理转发给后端应用服务器
怎么实现反向代理?
现在http块中使用upstream模块定义服务器组名和服务器列表,使用location匹配路径在用proxy_pass http://服务器组名 进行七层转发