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

代理

大家都知道,我们平时开发,都是在公司的内网(局域网)中,即不能与外网(互联网)交互,也就是不能上网,所以要想使开发机或服务器能够访问外网,就不得不通过代理服务器转发请求了。这里自然而然的就想到了使用Nginx做代理了,那什么是代理呢?我们就先了解一下代理的基本概念吧。

代理一词被我们在生活中所熟知,印象中的“代理”指的是以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。这是百度百科解释的代理一词的意思。通俗点说就是“代别人处理”,举个生活中常见的例子,你去办车检,需要排队办理,也有很多表格要填,还要等待很久,办下来差不多要一天。有些人嫌麻烦,浪费时间,不愿意干,这个时候“代理车检”这一职业就诞生了。你授权代理人帮你处理一些列繁琐的事情,并支付一定的费用,你只需要关心结果,有没有办成功,其他的你不需要关心。这样,你就从这一事务中脱离出来,交给专业的人去做。代理人执行的这一动作就叫做代理。

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

Nginx反向代理与负载均衡-LMLPHP

在这个图中,计算机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中的哪一台呢?怎么选择访问那一台服务器呢?为了解决这个问题反向代理因运而生。
那为什么叫反向代理呢?因为前面已经有了一个代理,所以为了区分另一种代理这种代理就叫做反向代理,往往把上面那种称作正向代理。
Nginx反向代理与负载均衡-LMLPHP

如上图,应用以集群模式部署在服务器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),便于客户端访问,保护实际处理请求的服务器信息。

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

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

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

问题延伸

同一台机器既充当正向代理服务器又充当反向代理服务器吗?

答案是肯定的。
Nginx反向代理与负载均衡-LMLPHP

举个例子,例如上图,淘宝和物流系统是两个不同的系统,属于两个公司,各自的服务独立集群部署。淘宝为用户提供网购服务,此时淘宝是服务端;当用户点击查看淘宝里的商品物流信息时,淘宝的服务器需要访问第三方物流系统,对物流系统来说它为淘宝提供查询物流服务,此时淘宝是客户端,物流系统是服务端。

所以,淘宝的代理服务器即是正向代理服务器又是反向代理服务器。反向代理面向用户访问淘宝服务器,正向代理面向淘宝的内部服务器访问三方物流系统。物流系统的代理服务器在这个例子中仅充当反向代理服务器。

错误代码502、504、 400

1、502 Bad Gateway,偶现502
比如我刚刚打开博客园的一篇文章时,等了一会出现这样的画面。
Nginx反向代理与负载均衡-LMLPHP

【502 错误的网关 代理服务器收到来自上游服务器的无效响应。】

意思是报这个错并不一定不是博客园的服务器已关闭,这个时候就要看一下多次访问是不是都会报错。

回到我们的问题上,我们访问别人的接口时,偶尔报这个错,可能是由于对方服务没有正常返回响应造成的,为什么没有正常返回响应?原因可能是对方服务接口限流导致拒绝访问,总之就是对方服务在某些情况下为了保护自身系统而没有正常响应数据。如果是一直502而不是偶现,可以参考这篇https://www.cnblogs.com/ibigboy/p/11248343.html,如果还不行那就需要对方看了。

2、504 Gateway Time-out
一般是网不通,可Telnet,可ping,但还是报504,此时先考虑自己的正向代理服务是不是正常,主要看能不能访问别的三方接口,看看是不是配置成了只能代理http或https的,代理配置是否正确,其次再考虑对方服务是不是没有启动,或对方把网关了(在实际开发中遇到过,国庆期间对方把网封了),需对方协助解决。

3、400 Bad Request
参数传错了,不符合对方要求,参数名和实体类不对应,或前端没有传json。具体看这篇https://www.cnblogs.com/ibigboy/p/11242776.html


原文首发于公众号编程大道,欢迎关注

10-12 22:58