编程学习网 > 服务器 > Nginx > Nginx反向代理与负载均衡
2020
04-23

Nginx反向代理与负载均衡


在做需求的时候,有时候会和别的三方系统交互,如调用一个第三方系统的http接口查询商品物流信息,获得响应数据返回给我们自己系统的前端页面进行展示,整个流程会遇到什么样的问题呢,现在整理一下。


代理


大家都知道,我们平时开发,都是在公司的内网(局域网)中,即不能与外网(互联网)交互,也就是不能上网,所以要想使开发机或服务器能够访问外网,就不得不通过代理服务器转发请求了。

这里自然而然的就想到了使用Nginx做代理了。


那什么是代理呢?我们就先了解一下代理的基本概念吧。

代理一词被我们在生活中所熟知,印象中的“代理”指的是以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。这是百度百科解释的代理一词的意思。通俗点说就是“代别人处理”。

举个生活中常见的例子,你去办车检,需要排队办理,也有很多表格要填,还要等待很久,办下来差不多要一天。有些人嫌麻烦,浪费时间,不愿意干,这个时候“代理车检”这一职业就诞生了。

你授权代理人帮你处理一些列繁琐的事情,并支付一定的费用,你只需要关心结果,有没有办成功,其他的你不需要关心。

这样,你就从这一事务中脱离出来,交给专业的人去做。

代理人执行的这一动作就叫做代理。


同样,回到互联网行业,代理一词同样适用。

只不过这里的代理人和被代理人都是计算机,即计算机1要访问A站点,但是计算机1到A站点的网络不通,而计算机2到站点A的网络畅通,且计算机1和2之间能相互访问,这时候计算机1想要访问站点A,就可以通过计算机2转发请求,计算机2再把响应转发给计算机1,这时我们就说计算机1通过代理服务器(或说使用了代理)完成了站点A的访问,计算机2充当了代理服务器的角色(代理人),计算机1充当客户端的角色(被代理人)。


attachments-2020-04-LCAfRkAK5ea1387f7b8f1.jpg


在这个图中,计算机1/2/3组成一个局域网,但只有计算机2能访问外网。

假设企业的应用服务部署在计算机1和3甚至更多计算机上组成集群,如果某个功能需要调用站点A的http接口获得数据,那么部署在计算机1和3上的程序若直接请求站点A是不可行的,因为网络不通。

但此时计算机2满足访问外网的条件,所以可以通过计算机2转发计算机1和3发出的http请求,此时计算机2充当代理服务器,作为系统内部与外界交互的中间人。

代理,对外屏蔽了实际发起请求的计算机的IP。


反向代理


刚才介绍了代理,那么什么是反向代理呢?

当然,它和正向代理相对 ,刚刚介绍的代理其实就是正向代理,至少在没有反向代理之前它就叫做代理。


反向代理是怎么诞生的呢?

这和互联网和项目架构的发展有关,以前用户量少业务少,项目往往部署在单台机器上,计算机2访问站点A时明确知道站点A的IP和端口。

因为只有一台服务器,IP和端口是不变的,但随着互联网和系统业务的发展,以及用户量的增长,业务的膨胀,传统的单一架构已经支撑不了用户需求,这个时候往往会选择集群的方式增加系统的吞吐量,此时的站点A不再是部署在一台机器上,而是多个。

服务器1、2、3...组成一个应用集群对外提供服务,那现在计算机2怎么访问站点A呢?是访问服务器1、2、3中的哪一台呢?怎么选择访问那一台服务器呢?为了解决这个问题反向代理因运而生。


那为什么叫反向代理呢?

因为前面已经有了一个代理,所以为了区分另一种代理这种代理就叫做反向代理,往往把上面那种称作正向代理。


attachments-2020-04-HnRO6JWd5ea138c6d5fac.jpg


如上图,应用以集群模式部署在服务器1、2、3上,外部客户端访问时通过服务器4将请求转发到具体的应用服务器处理请求。

对客户端(计算机2)来说,只需知道服务器4的IP和端口即可,具体由哪台应用服务器处理请求是由服务器4来决定的,此时服务器4充当反向代理服务器。反向代理,对外屏蔽了具体处理请求的服务器的IP。

服务器4(反向代理)和计算机2(正向代理)就好比两个国家的外交官,代表两个国家对外发言。


Nginx


Nginx是特别受欢迎的一款产品,用来做反向代理和负载均衡,好处和优点我就不说了。


Nginx正向代理配置


如下,在nginx的配置文件nginx.conf中添加如下配置。

配置Nginx正向代理,监听30000端口。

server {
    resolver 114.114.114.114;#指定dns服务器
    listen 30000;#监听端口
        
    access_log D:/mysoft/nginx/logs/proxy_access.log;
    error_log D:/mysoft/nginx/logs/proxy_error.log;
    
    location / {
        proxy_pass $scheme://$http_host$request_uri;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $host;
        proxy_set_header X-Forwarded-For $host;
      
        proxy_buffering on;
        proxy_buffer_size 32k;
        proxy_busy_buffers_size 256k;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 30;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 301 1h;
        proxy_cache_valid any 1m;
    }
}


Nginx反向代理+负载均衡配置


反向代理配置:

1、upstream模块配置服务集群ip+端口,默认负载均衡算法是轮询(即3台机器轮流处理请求);

2、server模块监听80端口;

3、第一个 location 模块将请求后台接口的请求代理到upstream模块配置的服务集群;第二个location模块代理前端静态资源,实现前后端分离。

#服务器集群
upstream team_server {
    server 192.168.11.121:8080;
    server 192.168.11.122:8080;
    server 192.168.11.123:8080;
}
server {
    listen       80;
    server_name  192.168.11.128;

    charset utf-8;

    access_log  D:/mysoft/nginx/logs/access.log  main;
    error_log D:/mysoft/nginx/logs/error.log;

    location ~* /eroly/(.*)(/*.json|/*.do) {
        proxy_pass $scheme://team_server;#upstream的name

        proxy_redirect off;
        proxy_set_header Host                   $host;
        proxy_set_header X-Real-IP              $remote_addr;
        proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }
    location /eroly {
        root D:/static;
        rewrite ^/eroly/(.*?)$ /$1 break;
    }
}

当访问http://192.168.11.128/eroly/home/index.html,nginx会匹配到第二个location,若访问的URL中以.json或.do结尾如/eroly/login.do时,Nginx会匹配到第一个location模块,将该请求转发给upstream模块的一台服务器进行处理 。

具体转发给哪一台处理,由负载均衡算法决定。

此时服务器充当反向代理服务器。


小结


正向代理: 一般在系统内部,只有正向代理服务器能够与外界交互,为了使应用服务器在内网内能够访问外部接口,所以就需要通过正向代理服务器做一层统一转发。

作用和优点:对内网内其他不能访问外网的服务器提供转发服务,使其能通过代理发送网络请求,对外屏蔽了实际发送网络请求的服务器信息。


反向代理: 不强调在系统内部只有反向代理服务器能够访问外网(但一般也是部署在内网)。反向代理的侧重点在于,在服务器集群部署(往往需要负载均衡策略)的情况下,对外提供统一的IP和端口,便于外界访问。(毕竟集群下多个服务器对应多个IP)

作用和优点:对外提供统一的入口(IP),便于客户端访问,保护实际处理请求的服务器信息。


正向代理和反向代理的区别


对等方不同: 正向代理服务的是内网内的其他计算机;反向代理服务的是客户端,是对外服务的。

角色不同: 正向代理消费服务,向外发请求;反向代理提供服务对外处理请求。


扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取