该程序员从互联网降薪来银行,本以为可以凭借自己的技术能力和优势可以在银行 IT 岗位混的风生水起。
没想到的是,这简直就是从“代码海”跳进了“政治江湖”,从每天跟 bug 对话,到现在得跟各种“宫斗剧”角色打交道。我这不是自降身价,简直是“技术自杀”,哈哈!
以前在互联网,虽然加班多,但至少还能在技术上刷刷存在感,钱也给的多。
现在好了,每天就像是在玩一个“上班族版”的《权力的游戏》,谁都想坐上那把“铁椅子”,结果呢,我只能在角落里默默地当个“技术小透明”,每天的工作就是:背锅、背锅、再背锅。
我们来看下各位网友的评论,精彩绝伦。
接下来是今天的面试跳槽加薪面试题:Nginx 核心架构设计和实现原理
Nginx 是一个免费的、开源的、高性能 Http 服务器和反向代理。Nginx 的架构设计是为了提供高性能、稳定性和可扩展性。
以下是 Nginx 的主要架构组件和工作原理:
Master 进程:
工作进程:
事件驱动模型:
Nginx 核心模块:
工作流程:
当 Nginx 启动时,它会生成两种类型的进程:主进程(master)和工作进程(worker)。
主进程并不处理网络请求,而是负责调度工作进程,包括加载配置、启动工作进程以及进行非停升级。
因此,当 Nginx 启动后,查看操作系统的进程列表,至少会有两个 Nginx 进程。
服务器实际 处理网络请求 及 响应 的是 工作进程(worker),在类 unix 系统上,Nginx 可以配置 多个 worker,而每个 worker 进程 都可以同时处理 数以千计 的 网络请求。
每个工作进程在启动时都会复制主进程的配置信息和相关资源,但它们彼此之间是相互独立的,这意味着它们可以并行地处理请求,互不影响。
此外,每个工作进程还会维护一个事件驱动的事件循环,通过事件驱动机制处理来自客户端的连接请求、数据读取和响应发送,这种异步非阻塞的 I/O 模型确保了 Nginx 的高性能和低资源消耗。
Nginx 的 worker 进程分为核心模块和功能性模块。
核心模块主要负责维持一个运行循环(run-loop),在其中执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。
Nginx 的代码采用了模块化设计,这使得我们可以根据需要选择和修改功能模块,然后编译成具有特定功能的服务器。
Nginx 实现了高并发、高性能的关键在于其基于异步及非阻塞的事件驱动模型。
这种模型使得 Nginx 能够高效地处理大量并发请求,而不会因为阻塞等待而降低性能。
此外,Nginx 还充分利用了 Linux、Solaris 以及类 BSD 等操作系统内核中提供的事件通知和 I/O 性能增强功能,如 kqueue、epoll 以及 event ports,进一步提升了其性能表现。
Nginx 作为高性能的代理服务器,其代理原理是其设计的核心之一。无论是针对 HTTP 还是其他协议(如 FastCGI、Memcache、Redis 等)的网络请求或响应,Nginx 都采用了代理机制来实现数据的转发和处理。
Nginx 的代理原理主要基于以下几个关键点:
接收请求:当 Nginx 接收到客户端的请求时,根据配置文件中的代理设置,确定是否需要进行代理转发。如果需要代理转发,则根据配置选择合适的代理方式。
建立连接:Nginx 会与目标服务器建立连接,可以是与远程服务器建立 TCP 连接,也可以是与本地应用程序之间建立的 Unix Socket 连接,取决于代理目标的具体情况。
数据传输:一旦连接建立成功,Nginx 会将客户端的请求数据转发给目标服务器,并且在接收到目标服务器的响应后,再将响应数据返回给客户端。这个过程可以是全双工的,意味着 Nginx 可以同时接收客户端请求和目标服务器响应,然后进行相应的转发和处理。
代理缓存:为了进一步提高性能,Nginx 还支持代理缓存功能。它可以将经常请求的数据缓存在本地,避免每次请求都要向后端服务器发起请求,从而减少响应时间和网络负载。
负载均衡:对于需要代理转发的请求,Nginx 还支持负载均衡功能,可以根据一定的策略将请求分发到多个后端服务器上,以实现负载均衡和高可用性。
博主简介
码哥,9 年互联网公司后端工作经验,InfoQ 签约作者、51CTO Top 红人,阿里云开发者社区专家博主,目前担任后端架构师主责,擅长 Redis、Spring、Kafka、MySQL 技术和云原生微服务。
喜欢的可以给个关注,也可以在公众号后台回复“资料”下载我原创 300 多页的《Redis 高手心法》
往期推荐
原文作者:码哥跳动;如有侵权,请联系管理员删除。