首页 > 系统相关 >Envoy与Nginx的八大对比

Envoy与Nginx的八大对比

时间:2023-04-16 22:35:52浏览次数:35  
标签:插件 八大 配置 Envoy Nginx 内存 进程

Envoy与Nginx架构层面的对比Nginx是Envoy出现之前网络通信中间件领域非常有代表性的开源系统,功能强大,性能出色,扩展性很强,已经形成了强大的生态,成为HTTP流量管理领域事实上的标杆。Envoy作为后起之秀,虽然定位和目标上与Nginx有不少差异,但架构设计层面,Envoy和Nginx都有很多的可取之处,下面会从功能定位、整体网络模型、连接处理、请求解析、插件机制、配置管理、部署和运维、管理方式等诸多维度,对Envoy和Nginx进行详细剖析和比较,通过与Nginx功能和架构层面的全方位对比,大家也可以对Envoy的架构设计有更立体的认识。

一、功能与定位

Nginx最核心的功能是Web服务器和反向代理服务器,Web服务器完成对HTTP请求协议的解析和以HTTP协议格式响应请求、缓存、日志处理这些基本Web服务器功能;反向代理服务器完成对请求的转发、负载均衡、鉴权、限流、缓存、日志处理等代理常用功能。Nginx还支持普通的TCP、UDP反向代理功能,同时以stream方式支持通用的基于4层协议的反向代理,比如MySQL代理、Memcached代理等。

Envoy定位是透明接管微服务之间的通信流量,将通信和服务治理功能从微服务中解耦,通过Envoy可以方便地增加对自定义协议的支持。

Nginx的关键词是Web服务器和反向代理,是显式调用;Envoy是透明接管流量,是隐式调用,更加体现对流量的控制和掌控力。

二、网络模型

网络模型上,Nginx采用的是经典的多进程架构,由master进程和worker进程组成。其中,master进程负责对worker进程进行管理,worker进程负责处理各种网络事件,各个worker进程之间相互独立。

Envoy采用了多线程的网络架构,Envoy一般会根据当前CPU核数创建相同个数的worker线程,所有worker线程同时对Envoy配置的监听器进行监听,接受新的连接,为每个新连接实例化相应的过滤器处理链,处理该连接上的所有请求。

三、连接处理

Nginx通过worker_connections参数来控制每个worker能够建立的最大连接数,从Nginx网络模型可以看出,客户端连接到来时,所有空闲的进程都会去竞争这个新连接。对连接进行精细化管理,Nginx采取的方式是各工作进程根据自身的忙闲程度,动态调整获取新连接的时机。

Envoy也会遇到和Nginx类似的负载不均问题,Envoy当前发展很快,同时需要解决的问题很多。后续会根据具体情况对这个问题进行讨论和解决。

四、插件机制

Nginx拥有强大的插件扩展能力,基于Nginx的插件扩展机制,业务可以非常方便地完成差异化和个性化定制,Nginx插件通过模块的方式提供,具体来说,Nginx主要提供如下几种形式的插件扩展:

1)通过stream机制进行协议扩展,比如增加memcached协议代理和负载均衡等;

2)以Handler方式处理HTTP请求;

3)对HTTP请求和响应消息进行过滤,比如可以修改和定制消息内容等;

4)访问Upstream时的负载均衡,可以提供自定义的负载均衡机制。

Envoy也提供了强大的插件扩展机制,当前使用最多的地方是监听过滤插件和网络处理过滤插件。和Nginx相比,Envoy网络插件定位在协议层面,以HTTP协议为例,Envoy并没有那么细粒度的插件扩展机制,如果想对Envoy的HTTP协议处理进行扩展,当前并没有提供特别多的扩展点。

Envoy的插件当前采用的是静态注册的方式,插件代码和Envoy代码一块进行编译,和Nginx不同,Envoy从最开始就支持插件的动态加载,Envoy通过独特的XDS API设计,可以随时对Envoy的XDS插件进行定制修改,Istio将修改后的XDS配置通过Grpc的方式推送给Envoy动态加载和生效。

五、配置管理

Nginx的配置格式使用自定义的方式,配置结构和配置解析过程都非常复杂。配置组织上,Nginx采用层层嵌套的方式,最外层是核心模块的配置,主要包括events事件模块、http模块和stream模块。对于最复杂的http模块来说,下面会嵌套着server子模块,负责监听和管理http请求,server子模块下还会嵌套着一到多个location,用于描述具体的路由规则。Nginx的配置解析代码可以说是Nginx整个源码体系中最晦涩难懂的部分,配置解析的核心代码在ngx_conf_file.c中,通过层层嵌套解析,形成了一棵树状的配置信息结构。

Envoy的配置管理部分设计得就比较优雅,配置格式直接使用了Protobuf 3,复用了Protobuf 3的数据描述能力和自动代码生成机制,完全省去了配置解析的过程,并且也非常方便对配置格式的有效性进行验证。Nginx的配置都是静态配置,不支持任何形式的动态配置能力。动态配置能力是Envoy相比Nginx最核心的竞争力,通过动态配置,可以在线修改流量路由和链路治理策略,实现策略配置修改的即时生效。

六、内存管理

Nginx内存管理通过Nginx内存池实现,通过内存池的良好设计,使用内存池进行内存管理时,不需要关注内存什么时候释放,连接销毁时会回收连接对应的内存资源;同时通过内存池可以减少内存碎片,通过内存对齐、内存分页等机制,可以有效减少缓存未命中(Cache Miss),提高内存访问的效率。

Envoy在内存管理方面的支持还很粗糙,直接基于原生的内存管理库,内存释放时机管理通过智能指针管理内存的生命周期。和Nginx相比,Envoy在内存管理方面提供的支持不多,完全依赖智能指针机制,对使用者的要求比较高,同时无法满足对性能的极致要求。

七、部署与运维

从运维上说,Nginx采用多进程的通信架构,主进程负责维护工作进程的状态,主要有以下两方面。一方面,监控工作进程的状态,状态异常时会对工作进程进行重启;另一方面,主进程也可以接收外界的管理信号,通知工作进程完成相应的操作。

Envoy是通过控制平面组件Pilot Agent和Sidecar-injection进行管理,Pilot Agent负责管理Envoy的运行状态,当Envoy状态有问题时,Pilot Agent会将Envoy重启,如果重启仍然不能解决问题,会尝试将Envoy调度到其他环境下;Sidecar-injection负责Envoy的自动注入。因此,从架构上看Nginx是自运维的,Envoy是借助控制平面来完成Envoy运行状态的管理,运维上比Nginx方便。

从架构上看Nginx是自运维的,Envoy是借助控制平面来完成Envoy运行状态的管理,运维上比Nginx方便。

八、观测与诊断

从服务的可观测以及诊断上说,Envoy投入了大量的精力,已经全面支持Log、Metric、Trace等可观测机制,并且每种观测方式均提供相应的扩展机制,Nginx在这方面相对逊色很多,可观测以及诊断支持上相对弱一些,当前可能是为了和商业版进行区分,Nginx商业版有完善的运维和问题诊断支持。

标签:插件,八大,配置,Envoy,Nginx,内存,进程
From: https://blog.51cto.com/key3feng/6193815

相关文章

  • k8s ingress-nginx
    apiVersion:v1kind:Namespacemetadata:name:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/instance:ingress-nginx---#Source:ingress-nginx/templates/controller-serviceaccount.yamlapiVersion:v1kind:ServiceAccount......
  • 搭建nginx反向代理实现动静态分离
    一、实现高可用动静分离1、部署目的2、部署拓扑3、实现静态页面4、实现lvs负载均衡5、实现动态网页功能 6、 实现nginx反向代理7、静态结果展示 8、动态结果展示   一、实现高可用动静分离1、部署目的①用户访问业务时访问虚拟ip由lvs负责转发请求到业务上,采用......
  • Nginx之数据流代理stream模块简介和使用
    转自 http://t.csdn.cn/RV4Hi一、stream模块简介  stream模块一般用于TCP/UDP数据流的代理和负载均衡,通过stream模块我们可以代理转发tcp报文。ngx_stream_core_module模块从1.9.0版开始提供。默认情况下,此模块不是构建的,应该使用–withstream配置参数启用它,即我们需要使用.......
  • nginx中的proxy_pass配置
    Nginx是最常用的反向代理工具之一,一个指令proxy_pass搞定反向代理,对于接口代理、负载均衡很是实用,但proxy_pass指令后面的参数很有讲究,通常一个/都可能引发一个血案。通常nginx配置proxy_pass指令时,如果proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的......
  • nginx自定义负载均衡及根据cpu运行自定义负载均衡
    转载请注明出处:1.nginx如何自定义负载均衡在Nginx中,可以通过配置文件自定义负载均衡策略。具体步骤如下:首先,在Nginx配置文件中定义一个upstream模块,并设置负载均衡策略和后端服务器列表,例如:upstreammyapp{serverbackend1.example.comweight=3;server......
  • Nginx常用配置
    前言Nginx是一款高性能的Web服务器和反向代理服务器,广泛应用于互联网领域。在使用Nginx时,我们需要对其进行配置,以满足不同的需求和场景。本篇博客将介绍Nginx的常用配置。静态文件服务静态文件服务是Nginx最基本的功能之一,它可以通过配置实现对静态资源的访问。例如:server{......
  • 通过nginx proxy manager解决https站点访问http接口资源报错问题
    浏览器控制台报MixedContent:Thepageat'<URL>'wasloadedoverHTTPS,butrequestedaninsecureXMLHttpRequestendpoint'<URL>'.Thisrequesthasbeenblocked;thecontentmustbeservedoverHTTPS.这说明你的网站部署上服务器已经启用了ssl证书默认......
  • 如何设置nginx的文件上传大小限制
    编辑nginx配置文件1、打开Nginx配置文件,通常为/etc/nginx/nginx.conf。2、在http块中添加以下代码:http{...client_max_body_size50M;...}重启nginx服务systemctlrestartnginx......
  • curl 命令访问双向认证的Nginx
    curl命令访问双向认证的Nginx#这里一定要使用证书相对路径或绝对路径,不能写成--certclient.crt....这种形式curl-k--cert./client.crt--key./client.keyhttps://10.10.10.11 ......
  • 个人部署【未实现Nginx前端资源部署】
    【未在Nginx上实现静态资源部署】虚拟机A作为服务器A:安装Nginx、安装Mysql作为主库虚拟机B作为服务器B:安装能采用shell脚本部署项目所需软件:jdkgitmavenjar、安装Mysql作为从库、安装Redis作为缓存。服务器B操作:第一步:使用gitclone命令将远程仓库的代码克隆下来第二步:上......