Nginx反向代理与负载均衡

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月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


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
26天前
|
负载均衡 算法 搜索推荐
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
112 59
|
5天前
|
存储 负载均衡 中间件
Nginx反向代理配置详解,图文全面总结,建议收藏
Nginx 是大型架构必备中间件,也是大厂喜欢考察的内容,必知必会。本篇全面详解 Nginx 反向代理及配置,建议收藏。
Nginx反向代理配置详解,图文全面总结,建议收藏
|
17天前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
nginx配置反向代理404问题
|
1月前
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
147 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
|
22天前
|
负载均衡 算法 应用服务中间件
Nginx 常用的负载均衡算法
【10月更文挑战第22天】不同的负载均衡算法各有特点和适用场景。在实际应用中,需要根据具体的业务需求、服务器性能和网络环境等因素来选择合适的算法。
26 3
|
26天前
|
负载均衡 监控 应用服务中间件
除了 Nginx,还有以下一些常见的负载均衡工具
【10月更文挑战第17天】这些负载均衡工具各有特点和优势,在不同的应用场景中发挥着重要作用。选择合适的负载均衡工具需要综合考虑性能、功能、稳定性、成本等因素。
|
1月前
|
负载均衡 应用服务中间件 nginx
Nginx的6大负载均衡策略及权重轮询手写配置
【10月更文挑战第9天】 Nginx是一款高性能的HTTP服务器和反向代理服务器,它在处理大量并发请求时表现出色。Nginx的负载均衡功能可以将请求分发到多个服务器,提高网站的吞吐量和可靠性。以下是Nginx支持的6大负载均衡策略:
145 7
|
1月前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
1月前
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
67 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
1月前
|
开发框架 负载均衡 前端开发
Nginx负载均衡
Nginx负载均衡