资讯动态

一台 Nginx,凭什么能同时扛住几万个请求?——反向代理、负载均衡与它“快“的底层逻辑

发布时间:2026/10/11 0:36:37 来源:尧图企业网站定制
你打开一个网站背后可能不是一台服务器在干活而是几十台。可你访问的永远只是那一个域名、那一个入口。谁在中间接客、分发、扛压答案大概率是Nginx——这个互联网世界里最常见的门神。Nginx 的名气大到几乎成了服务器的代名词但很多人其实说不清它到底干了什么、又凭什么那么快。这篇就把 Nginx 的两大看家本领——反向代理和负载均衡以及它快的底层逻辑一次讲透。先分清正向代理 vs 反向代理要理解 Nginx先得搞清一个容易混的概念。正向代理Forward Proxy是替客户端出头。你上不了外网就找一台代理服务器替你访问目标网站——代理站在你这边帮客户端去访问服务器。VPN、科学上网就是正向代理。反向代理Reverse Proxy是替服务器出头。客户端访问一个入口这个入口Nginx再帮你去访问后面的真实服务器——代理站在服务器这边帮服务器接客、分流。一句话记住方向正向代理代理的是客户端反向代理代理的是服务器。客户端知不知道背后是谁是区分两者的关键——正向代理里服务器不知道真实客户端反向代理里客户端不知道真实服务器。反向代理到底解决了什么问题有了反向代理这层中间人后端架构一下子被盘活了。它解决的可不止一件事隐藏后端客户端只看到 Nginx永远不知道后面有几台服务器、是什么机器、跑什么端口。安全性和架构的灵活性都上来了统一入口不管后端有多少个服务、多少个端口对外只暴露一个 80/443 端口由 Nginx 按路径、按域名分发一个很实用的能力负载均衡。这就是我们下面要重点说的。负载均衡把活分给兄弟们一个网站单台服务器扛不住流量了最自然的做法是加机器。可加了机器问题就来了请求来了该分给哪台这就是**负载均衡Load Balancing**要干的事——把海量的请求合理、均匀地分摊到多台后端服务器上。Nginx 内置了几种经典的分配策略逐个看1. 轮询Round Robin最简单——按顺序一台一台轮流来。请求 1 给服务器 A请求 2 给 B请求 3 给 C循环往复。公平但有个盲区它默认每台服务器能力一样也默认每个请求耗时一样可现实往往不是。2. 加权轮询Weighted Round Robin给每台服务器配一个权重能力强配置高的多分点能力弱的少分点。比如 A 权重 3、B 权重 1那每 4 个请求里A 分 3 个、B 分 1 个。这解决了机器性能不一的问题。3. IP 哈希IP Hash按客户端的 IP 算一个哈希值同一个 IP 的请求永远打到同一台服务器。这有什么用保持会话session——用户的登录状态、购物车存在某台服务器上如果下次请求被分到另一台状态就丢了。IP 哈希保证同一个用户始终找同一台机器。4. 最少连接Least Connections谁当前手里的活最少新请求就给谁。这比轮询更聪明——它照顾到了有的请求耗时短、有的耗时长的现实把请求优先分给最闲的那台。Nginx 的配置也简单得令人发指一个upstream块就搞定了upstream backend { server 192.168.1.10 weight3; # 权重 3 server 192.168.1.11 weight1; # 权重 1 server 192.168.1.12 backup; # 备用其他都挂了才顶上 } server { listen 80; location / { proxy_pass http://backend; # 转发给上面的 upstream } }就这么几行Nginx 就开始替你在多台后端之间分活了。它凭什么快单线程 事件驱动说了半天干什么现在回到那个最让人好奇的问题Nginx 为什么能扛住几万并发这跟它早期对手 Apache 的对比最能说明问题。Apache 早期用的是一个连接一个进程/线程的模型——每来一个请求fork 一个进程或开一个线程去伺候。请求一多进程/线程数量爆炸内存和上下文切换的开销把机器拖垮这就是著名的C10K 问题一万并发就把服务器压垮。Nginx 反其道而行之用了一个异步、事件驱动的架构一个 master 进程 多个 worker 进程master 负责读配置、管 workerworker 才是干活的每个 worker 都是单线程但一个 worker 就能扛住成千上万连接worker 单线程 I/O 多路复用每个 worker 不阻塞地同时盯着海量连接——这正是上一篇《epoll 与 I/O 多路复用》里讲的那个思想一个管理员同时监视一堆连接谁有数据来了就处理谁。所以 Nginx 快的秘诀一句话就能概括它不靠开很多线程来扛并发而是靠一个线程用 epoll 同时盯很多连接。省掉了海量线程的内存和切换开销单机几万并发就水到渠成了。这里也顺便解释了一个常见疑问为什么 Nginx 处理静态文件特别快因为它还用了零拷贝——把文件从磁盘直接搬到网卡中间不经过用户态的多次拷贝少了好几次没必要的内存搬运。这也是别在无谓的地方浪费资源这一思想的又一次体现。Nginx 的角色其实不止反向代理聊到这儿得说句公道话Nginx 远不止反向代理和负载均衡。它还常扮演静态资源服务器直接对外提供 HTML、图片、JS、CSS快到飞起反向代理 网关把请求按路径转发给不同的后端服务微服务里常见的 API 网关玩法HTTPS 终结在 Nginx 这层做 TLS 加解密把明文的内网通信留给后端省心又省资源。但无论它扮演哪个角色底层那套单线程 epoll 事件驱动的引擎都是它快的根基。结语架构的智慧藏在分工里把 Nginx 这件事想透了你会发现它教给我们的是一个关于分工的道理让擅长的人干擅长的事。Nginx 擅长接客、分流、扛并发那就让它专职当门神后端服务擅长算业务逻辑那就专心算业务。中间用一层清晰的分工把海量并发的压力和业务逻辑的复杂度隔离开。而它快的底层更是反复印证了那句话真正的高性能从来不是硬扛而是别把资源浪费在等待和无谓的拷贝上。epoll 是零拷贝是Nginx 的整个设计都是。想真正理解 Nginx 背后的并发和事件驱动底层是操作系统和数据结构的基本功。推荐 B站【408实验室】的《数据结构》把队列、树、以及高并发背后的那些基础结构吃透再看 Nginx、Redis 这些系统都会豁然开朗。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑