从 Apache 到 Nginx 再到 Caddy:一台服务器到底能扛多少人?

1999 年程序员们被 C10K 问题折磨得够呛:一台机器同时服务一万个人,居然能把服务器干趴。本篇文章用大白话讲清楚 Apache 为什么吃内存、Nginx 为什么能一个进程管上万连接,以及 Caddy 自动 HTTPS 有多省心。看完你就知道,买便宜 VPS 时该选哪个 Web 服务器、1G 内存到底能扛多少访客。

先讲个 2004 年的真事:俄罗斯最大门户网站 Rambler 的服务器撑不住了。流量一涨,服务器里的进程就跟春天的韭菜一样疯长,内存很快被吃干抹净,网站动不动就打不开。当时有位工程师 Igor Sysoev 想,这么下去不行,我干脆自己写一个服务器好了。于是,互联网历史上最著名的"复仇者"之一——Nginx 就这么诞生了。而这一切的起点,得从 1999 年一个叫 C10K 的问题说起。

延伸阅读

更多相关攻略推荐:2G 内存无显卡 VPS 也能跑 AI!Ollama + 1.5B/Web 与数据库分在两台 VPS?跨机房 MySQL 3306 安全DDoS 攻击到底多猛?从 1.2Tbps 洪水到"高防 VPS"为2026 边缘 CDN 加速对决:Cloudflare 还是 Bun【VPS 进阶玩法精选 032】用 Headscale 在 VPS

1999 年的世纪难题:一万个人同时上网,服务器当场去世

1999 年,程序员 Dan Kegel 抛出了一个扎心的问题:一台服务器能不能同时保持 1 万个网络连接?这问题看着不大,当年却把无数团队逼到网络封锁角,江湖人称 C10K。那时候的服务器标配也就 500MHz 的 CPU 加 1G 内存,按算账其实够用:1 万个人同时在线,人均分到 100KB 内存和一点点带宽,硬件根本不缺。缺的是软件。

当时的主流做法是"一个连接配一个进程":你来了,我开个进程伺候你;他来了,我再开一个。来 1 万人,就开 1 万个进程。这里面的问题可太多了:

  • 每个进程都要占几 MB 内存,1 万个进程就是几十个 GB,2GB 内存的机器直接爆掉。
  • 进程之间来回切换要 CPU 干活,人一多,光忙活着换人就把 CPU 烧干了。
  • 系统自带的 select 接口一次最多只能盯着 1024 个连接,一万个连接根本看不过来。

打个比方:这就像一家火锅店,来一个客人就雇一个服务员贴身服务。来十个客人还行,来一万个客人,你得先开一万个服务员,光发工资就能破产,客人还饿死在门口。这个"一人一服务员"模式,就是当年所有服务器软件的通用死法。

老大哥 Apache:称霸互联网二十年,却悄悄露出疲态

这里必须给 Apache 记一功。它是 1995 年从 NCSA 服务器基础上发展起来的开源项目,靠着一个理念火遍全网:功能全、模块多、文档厚,什么都能干。在很长一段时间里,全球约七成的网站都跑在 Apache 上,说它是 Web 服务器界的"老大哥"一点不为过。

Apache 用的是多进程或多线程模式,典型的有 prefork(每个连接一个进程)和 worker(每个连接一个线程)。好处是稳定、兼容性好,装个 PHP 就能跑;坏处是内存按连接线性上涨。你想象一下,Apache 开 prefork 模式时,默认配置下每个进程能吃掉几 MB 内存,再叠加 PHP 进程,一台 1G 内存的小鸡,往往接待几百上千个连接就气喘吁吁。更尴尬的是,哪怕一个连接只是握着不松手、啥事不干,那个进程也得一直占着内存干等着。

Apache 不是不好,它更像一个全能的瑞士军刀。可互联网用户的增长速度,早就不给它慢慢优化的时间了。2000 年前后网站流量爆炸,越来越多人发现:服务器 CPU 明明是闲的,内存却先满了,网站依然卡成幻灯片。这就是典型的"软件拖了硬件的后腿"。

有人给 Apache 算过一笔账:开 prefork 模式,每个空闲连接对应的进程大约要吃掉 3 到 5MB 内存,再算上早期 Apache 默认最多只能维持 256 个进程的传统限制,1 万并发基本是做梦。后来出的 worker 模式改用线程,确实比进程轻量,可一旦要跑 PHP 这类动态语言,又绕回"一个请求占一个资源"的老路。Apache 在低并发、功能需求复杂的传统虚拟主机里依然是王者,但新时代的门槛,悄悄抬高了。

Nginx 横空出世:一个进程,管一万个连接

回到开头的 Igor Sysoev。他 2002 年开始动手写新服务器,目标就一句话:解决 C10K。他用的办法,是从操作系统借来的"异步事件驱动"——用一个进程盯住所有连接,谁有动静就处理谁,没动静的就在那安静待着,不占内存、不占 CPU。相当于火锅店改成了自助餐:门口一个服务员盯着所有客人,谁举手喊"加汤"就去加汤,其余时间一个人就够。

2004 年 10 月 4 日,Nginx 0.1.0 正式发布,选的日子还特别有心——人类第一颗人造卫星发射 47 周年。随后的剧情堪称爽文:因为静态文件性能碾压 Apache 好几倍,内存占用又小到惊人,工程师们口口相传,Nginx 先是在俄语圈流行,又一路杀向全球。2008 年,它成了全球第二大 Web 服务器;2011 年发布 1.0.0 正式版;2019 年 3 月,F5 公司砸了约 6.7 亿美元把它收入囊中。

份额上的变化更能说明问题:2019 年 4 月,Netcraft 的统计显示,Nginx 以 27.52% 的网站数量份额首次登顶,超越称霸了 18 年的 Apache。到 2026 年,公网访问量最大的前 100 万个网站里,超过三分之一跑在 Nginx 或它的衍生品上。当年 Rambler 那位"我干脆自己写一个"的工程师,就这么把整个互联网的默认选择给换掉了。

Nginx 的崛起还有个功臣:HTTP/2。2015 年 9 月 Nginx 率先支持 HTTP/2,网页加载速度肉眼可见地变快,成了无数站长从 Apache 迁移过来的理由。到了今天,Nginx 的身影早就无处不在——Cloudflare 的全球加速节点、云服务商的负载均衡、国内宝塔面板的默认引擎,背后全是它。它甚至不满足于只当 Web 服务器,反向代理、缓存、负载均衡样样在行,一个 worker 进程管着上万个连接,每个连接只花几 KB 内存。

新物种 Caddy、Traefik:把 HTTPS 和配置这些破事全包了

Nginx 虽好,配置起来还是有点劝退新手。于是 2015 年前后,一批"傻瓜式"新服务器登场,代表就是 Caddy 和 Traefik。它们的核心卖点特别戳人:

  • Caddy 的招牌是"自动 HTTPS":域名一填,证书自动申请、自动续期、自动配置,你什么都不用管。以前用 Nginx 配一次 SSL 要折腾 Certbot 加 cron 定时任务,Caddy 直接内置,两行配置搞定,还默认开启 HTTP/3。
  • HTTP/3 用的是 QUIC 协议,基于 UDP,弱网环境下比传统 TCP 快得多,尤其适合手机流量和跨国访问。Nginx 到 2023 年才正式支持 HTTP/3,Caddy 从很早就默认开启。
  • Traefik 则是为容器和微服务而生,自动发现 Docker、Kubernetes 里的服务,服务一上线,路由自动配置,完全不用手改配置文件。它 2015 年由 Emile Vauge 发布,现在 GitHub 上有六万多个 star。

打个比方:Nginx 像手动挡跑车,性能好、上限高,但得你会开;Caddy 像自动挡家用车,你只管踩油门,其余交给系统。老司机可以继续开手动挡,新手从自动挡起步,体验完全是两个世界。

这里多说一句 HTTP/3 到底强在哪:过去的 HTTP 都跑在 TCP 上,就像一条单行道,堵住就全堵住;QUIC 则建立在 UDP 之上,相当于多车道还带变道功能,遇上网络抖动能自己绕行,重传也更快。对跨国访问的网站来说,这个体验差别真的能感觉到——而 Caddy 是默认就把它开好给你的。

对你买 VPS 有什么启发?记住这三条

聊了这么多历史,落回到你的钱包上。买便宜国外 VPS 的都知道,配置通常是 1 核 1G 内存起步,这种"小鸡"选对 Web 服务器,体验差别巨大:

  • 能选 Nginx 就别选 Apache。同样 1G 内存,Apache prefork 模式跑 WordPress,可能几千个连接就把内存吃满,网站直接 502;换成 Nginx 加 PHP-FPM,同一台机器往往能扛住几万连接不喘气。国内常见的宝塔面板,默认装的也是 Nginx,就是这个道理。
  • 纯新手建议直接上 Caddy。不用记那些绕口的配置语法,不用研究证书怎么续期,填个域名它就全自动搞定。把折腾的时间省下来,多写两篇文章不香吗?
  • 先别急着追求 Traefik。除非你已经在玩 Docker 或 K8s,否则单人站用不上它的服务发现能力,反而增加学习成本。工具要匹配需求,不是越新越好。

一句话总结:服务器扛多少人,硬件说了不算,软件说了算。几十美元一年的 RackNerdVultr 小鸡,配上 Nginx 或 Caddy,撑起一个日活几万的小站绰绰有余。这就是 Web 服务器二十多年进化的意义——让普通人也用得起高性能。

再给小白补一句实在话:同样是 WordPress 站点,Apache 是"每个访问者配一个服务生全程伺候",Nginx 是"一个前台盯着所有客人,有需要才行动"。前者省心但费内存,后者省钱但要求你会配置 PHP-FPM。好在宝塔这类面板把 Nginx 加 PHP-FPM 做成了默认组合,你只需在面板里点几下,就能让一台 1G 内存的小鸡扛住数万访问,不用懂一行配置文件。

常见问题 FAQ

问:Apache、Nginx、Caddy 最大的区别是什么? Apache 用每连接一进程/线程模型,连接多了内存暴涨,容易在 C10K 下崩;Nginx 用异步事件驱动,一个 worker 进程就能管上万连接,静态文件和反向代理极快、吃内存少;Caddy 同样事件驱动,最大卖点是自动申请和续期 HTTPS 证书,新手最省心。便宜 VPS 上优先 Nginx/Caddy,别用 Apache 硬扛高并发。

问:1GB 内存的 VPS 用 Nginx 大概能扛多少访客? 纯静态或缓存命中高的站点,Nginx 在 1GB 内存上轻松扛住每天几万到十几万 PV;若是 PHP/数据库动态站,瓶颈会转到 CPU 和数据库,1GB 可能只能稳几千 PV。配合缓存、开 Gzip、限制连接数,并给数据库单独机器或加 Redis,才能把单机容量真正榨出来。

问:Caddy 适合新手吗?自动 HTTPS 真的省心吗? 非常适合。Caddy 在配置文件里写一行就能自动向 Let's Encrypt 申请证书、自动续期,不用像 Nginx 那样手动 certbot 配一大堆。对不想折腾证书、只想快点上线的人最友好。代价是生态和文档不如 Nginx 丰富,超复杂反向代理规则时还是 Nginx 更灵活,但日常建站 Caddy 足够。