Nginx反向代理与负载均衡

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: Nginx反向代理与负载均衡

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


代理

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

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

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

在这个图中,计算机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中的哪一台呢?怎么选择访问那一台服务器呢?为了解决这个问题反向代理因运而生。

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

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

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

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

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

问题延伸

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

答案是肯定的。

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

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

错误代码502、504、 400

1、502 Bad Gateway,偶现502

比如我刚刚打开博客园的一篇文章时,等了一会出现这样的画面。

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

502 Bad Gateway是指错误网关,无效网关;在互联网中表示一种网络错误。表现在WEB浏览器中给出的页面反馈。

含义:这通常并不意味着上游服务器已关闭(无响应网关/代理) ,而是上游服务器和网关/代理使用不一致的协议交换数据。鉴于互联网协议是相当清楚的,它往往意味着一个或两个机器已不正确或不完全编程。--百度百科

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

回到我们的问题上,我们访问别人的接口时,偶尔报这个错,可能是由于对方服务没有正常返回响应造成的,为什么没有正常返回响应?原因可能是对方服务接口限流导致拒绝访问,总之就是对方服务在某些情况下为了保护自身系统而没有正常响应数据。如果是一直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


相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
负载均衡 网络协议 算法
一文读懂什么是Nginx?它能否实现IM的负载均衡?
Nginx(及其衍生产品)是目前被大量使用的服务端反向代理和负载均衡方案,从某种意义上来讲,Nginx几乎是低成本、高负载Web服务端代名词。 如此深入人心的Nginx,很多人也想当然的认为,在IM或消息推送等场景下是否也能使用Nginx来解决负载均衡问题? 另外,即时通讯网的论坛和QQ群里也经常有人问起,Nginx是否能支持TCP、UDP、WebSocket的负载
95 4
|
1月前
|
负载均衡 算法 应用服务中间件
Nginx长连接负载均衡详细说明以及案例
本文详细介绍了Nginx长连接负载均衡的配置与原理。长连接(Keepalive)允许客户端和服务器保持连接,减少建立和关闭连接的开销。Nginx支持多种负载均衡算法,如轮询、IP哈希等。通过在Nginx配置文件中使用`upstream`模块和`keepalive`指令,可以实现长连接负载均衡,从而提高系统的性能和响应速度。示例配置展示了如何设置后端服务器组、长连接数及HTTP/1.1协议,确保连接复用,降低延迟。
136 5
|
1月前
|
负载均衡 应用服务中间件 nginx
如何使用nginx实现负载均衡?
如何使用nginx实现负载均衡?
|
3月前
|
缓存 负载均衡 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇
通过使用Nginx的反向代理功能,可以有效地提高Web应用的性能、安全性和可扩展性。配置过程中需要注意不同场景下的具体需求,如负载均衡、SSL终止和缓存策略等。正确配置和优化Nginx反向代理可以显著提升系统的整体表现。
607 20
|
5月前
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
315 61
|
5月前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
349 60
|
5月前
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
436 60
|
5月前
|
缓存 负载均衡 安全
Nginx的反向代理具体是如何实现的?
Nginx的反向代理具体是如何实现的?
|
4月前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
255 11
|
4月前
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
376 9

热门文章

最新文章