一、反向代理
1、什么是代理
代理一词往往并不陌生, 该服务我们常常用到如(代理理财、代理租房、代理收货等等)
正向代理:客户端去找服务端
反向代理:代理去找服务端
1.区别在于形式上服务的”对象”不一样
2.正向代理代理的对象是客户端,为客户端服务
3.反向代理代理的对象是服务端,为服务端服务
2、Nginx代理服务常见模式
Nginx作为代理服务,按照应用场景模式进行总结,代理分为
1.正向代理
2.反向代理
3、正向代理
正向代理:客户端去找服务端
4、反向代理
反向代理:代理去找服务端
格式:
upstream [链接池名称] {
server [ip]:[端口] [分发策略];
}
proxy_pass http://[连接处名称];
[root@lb01 conf.d]# cat game.conf
upstream game {
server 172.16.1.8:80;
server 172.16.1.7:80;
}
server {
server_name game.test.com;
listen 80;
location / {
proxy_pass http://game;
}
}
1、添加发往后端服务器的请求头信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $http_host;
proxy_set_header Connection close;
Context: http, server, location
通过负载均衡访问web服务,由于通过IP访问,导致负载均衡错误。
解决:
将域名携带到后端的web服务器中去。
# 用户请求的时候HOST的值是game.test.com, 那么代理服务会像后端传递请求的还是game.test.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
lb01:
web02:
windows:
配置:
lb01:
web02:
现在正常了:
2、代理到后端的TCP连接、响应、返回等超时时间
#nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
#nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
#后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
3、proxy_buffer代理缓冲区
#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
#设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
#proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
4.配置代理优化文件
[root@lb01 conf.d]# cd /etc/nginx
[root@lb01 nginx]# vim proxy_params
[root@lb01 conf.d]# cat ../proxy_params
# 用户请求的时候HOST的值是game.test.com, 那么代理服务会像后端传递请求的还是game.test.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# nginx代理与后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 10s;
# nginx代理等待后端服务器的响应时间
proxy_read_timeout 10s;
# 后端服务器数据回传给nginx代理超时时间
proxy_send_timeout 10s;
# nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户
proxy_buffering on;
# 设置nginx代理保存用户头信息的缓冲区大小
proxy_buffer_size 8k;
# proxy_buffers 缓冲区
proxy_buffers 8 8k;
# 状态标记
proxy_next_upstream http_404 http_500 http_502 http_503 http_504 http_403 http_429;
5.代理调用优化文件
[root@lb01 nginx]# cat /etc/nginx/conf.d/game.conf
upstream game {
server 172.16.1.8:80;
# server 172.16.1.7:80;
}
server{
server_name game.test.com;
listen 80;
location / {
proxy_pass http://game;
include proxy_params;
}
}
二、负载均衡
1、什么是负载均衡
1、平均分配
2、权重大小分配
通过反向代理实现多台web服务器共同工作。
负载均衡是由反向代理来实现的。
负载均衡就是将流量按照一定的方式分配给web机器,将请求平均的分配给后端服务器。
选择使用Nginx来搭建负载均衡服务器
2、四层负载均衡
四层负载均衡是基于TCP/IP协议的
所谓四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑
3、七层负载均衡
七层负载均衡是基于HTTP协议的
七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡SLB
4、四层和七层负载均衡的区别
四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发、由此可以看出,七层负载均衡效率没有四负载均衡高。
但七层负载均衡更贴近于服务,如:http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。
注意:四层负载均衡不识别域名,七层负载均衡识别域名
所以,一般使用七层负载均衡来负载web服务。
5、公有云中常见的负载均衡
1.SLB #阿里云产品
2.LB #青云产品
3.CLB #腾讯云产品
4.ULB #Ucloud产品
6、负载均衡模块
# ngx_http_upstream_module
#语法
Syntax: upstream name { ... }
Default: —
Context: http
#例子
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
... ...
location / {
proxy_pass http://backend;
}
}