1、正向代理与反向代理理解
1.1、正向代理
正向代理是代理客户端去请求到服务器
比如我们想访问某个海外站点,但是被墙了无法直接访问,这个时候我们就会采用vpn代理了,它会帮我们去请求该海外站点,然后再将网页资源返回我们。
1.2、反向代理
反向代理是代理服务器接受客户端的请求
比如我们在机房部署了一套系统(多台机),为了稳定性和安全性,我们通常会使用nginx或F5产品,它会帮我们接收客户端的请求,然后均匀负载分发到不同的后端机器,处理完后再将结果响应给客户端。这样既可以减轻服务端的压力,也不用直接暴露服务器给外部。
2、反向代理配置
反向代理需要注意两个关键配置,upstream
和proxy_pass
,upstream 用来指定需要真实访问的地址,my_server是自定义命名。proxy_pass 配置为 http://my_server,意思会把客户访问www.mytest123.com的请求,转给upstream my_server{}处理。简单理解,其实就是nginx中的server代理了地址为192.168.66.77:8080的服务。当然,upstream
和proxy_pass
都可以配置多个。
http {
upstream my_server{
server 192.168.66.77:8080;
}
# 服务一
server {
listen 8085;
server_name www.mytest123.com;
location / {
proxy_pass http://my_server;
index index.html index.htm;
}
.....
}
}
3、负载均衡配置
3.1、概念理解
负载
指服务器承担的客户端请求压力,均衡
指将这些压力均匀的分摊到各个服务上面。那么合在一起,负载均衡( Load Balance)
就是指将客户端的请求压力均匀的分摊到多个服务上进行执行,从而增加吞吐量,提高网络的灵活性和可用性。
nginx常见负载均衡策略有3种:轮询、指定权重和ip_hash
3.2、轮询方式(默认)
负载均衡通过upstream
来配置,需要将请求分发到几台机器,就在upstream中指定几个server。下面示例指定的两台采用默认轮询策略
,即每个请求按时间顺序逐一分配到不同的后端服务器,比如第一个请求77处理,那第二个就会让78处理,第三个77…这样顺序轮询。如果某一台服务器 down 掉了,则会自动被剔除。
http {
upstream my_server{
server 192.168.66.77:8080;
server 192.168.66.78:8080;
}
# 服务一
server {
listen 8085;
server_name www.mytest123.com;
location / {
proxy_pass http://my_server;
index index.html index.htm;
}
.....
}
}
3.3、指定权重
比如我们希望性能好的机器能够多处理请求,那么可以通过weight
指定轮询权重,weight 值大的被轮询的几率更高,承担的请求任务更多,如下配置77轮询的几率会比78的高。
http {
upstream my_server{
server 192.168.66.77:8080 weight=5;
server 192.168.66.78:8080 weight=2;
}
# 服务一
server {
listen 8085;
server_name www.mytest123.com;
location / {
proxy_pass http://my_server;
index index.html index.htm;
}
.....
}
}
3.4、ip_hash方式
ip_hash通常用来解决session一致性问题
。
我们假设一个常见的场景,比如有一个用户第一次访问登录时是通过77服务来处理,如果不加ip_hash配置,则会采用默认轮询方式,那么该用户第二次访问站点时很可能会由78服务处理,但是77和78两个服务之间session并没有共享机制,那么这个用户的登录状态就会丢失,这显然不符合我们实际需求。
所以,这个时候就需要ip_hash出马了,它会根据每个请求ip的hash结果进行分配处理,让每个访客固定访问一个后端服务器,这样就能解决session的问题。当然,关于session共享问题还有很多其它方案,比如sso、redis等等,我们这里讲的是nginx本身支持的session一致性问题解决方案。
http {
upstream my_server{
ip_hash;
server 192.168.66.77:8080;
server 192.168.66.78:8080;
}
# 服务一
server {
listen 8085;
server_name www.mytest123.com;
location / {
proxy_pass http://my_server;
index index.html index.htm;
}
.....
}
}