Nginx 简介

在动手装环境之前,我们先搞清楚三个问题:Nginx 是什么、它是怎么诞生的、为什么它能把 Apache 按在地上摩擦了十几年。理解了背景,后面学配置的时候才不会一头雾水。

Nginx 是什么?

Nginx(发音同 "Engine-X")是一款开源的高性能 Web 服务器,同时也能做反向代理、负载均衡、邮件代理、HTTP 缓存。它由 C 语言编写,2004 年首次发布,目前(2024 年)是全网最流行的 Web 服务器——根据 W3Techs 的统计,全球所有网站里有超过 34% 在用 Nginx,比 Apache 还高。

一句话总结它的价值:把流量廉价、稳定、快速地分发给后端应用。无论你用的是 Node.js、Python Flask、Java Spring Boot 还是 PHP,生产环境几乎都会在前面挡一层 Nginx。

诞生故事:俄罗斯程序员的"业余作品"

Nginx 的作者叫 Igor Sysoev(伊戈尔·赛索耶夫),一位俄罗斯工程师。故事的关键节点:

一个人写的"业余作品"影响了整个互联网二十年——这是 Nginx 最传奇的地方。

为什么 Nginx 这么快?

答案可以用一句话概括:事件驱动 + 异步非阻塞 + 多路复用。但这句话不解释清楚等于没说,我们拆开看:

1. Apache 的模型:每连接一个线程

Apache 传统的 Prefork/Worker 模式,每来一个连接就分配一个线程去处理。线程是操作系统级别的资源——每个线程默认要占几 MB 内存,1 万个连接就是几十 GB 内存,再加上线程切换的 CPU 开销,机器很快就扛不住。

2. Nginx 的模型:一个 worker 跑一个事件循环

Nginx 的 worker 进程用 epoll(Linux)或 kqueue(Mac/BSD)系统调用,一个 worker 可以同时管理数千个连接。它的工作方式是:

打个比方:Apache 是给每个客人配一个服务员,客人发呆服务员也跟着等;Nginx 是一个服务员同时盯 1000 桌,谁举手就过去处理一下,处理完马上回来。同样的硬件,Nginx 能承载的并发是 Apache 的 10~100 倍。

3. 进程模型:master + worker

Nginx 启动后是这样的结构:

# Nginx 的进程模型:1 个 master + N 个 worker
# 用 ps 命令可以清楚看到这种结构
ps -ef | grep nginx

# 输出大致如下:
# root     1234  1  0 10:00 ?  00:00:00 nginx: master process /usr/sbin/nginx
# www-data 1235 1234  0 10:00 ?  00:00:00 nginx: worker process
# www-data 1236 1234  0 10:00 ?  00:00:00 nginx: worker process
# www-data 1237 1234  0 10:00 ?  00:00:00 nginx: worker process
# www-data 1238 1234  0 10:00 ?  00:00:00 nginx: worker process

# master 负责:读配置、绑定端口、fork 出 worker
# worker 负责:真正的请求处理,每个 worker 能扛数千连接

这种设计的妙处:worker 挂了 master 会立刻重启一个,对外完全无感;配置改了只需 reload,master 会平滑地让老 worker 处理完现有连接再退出,新 worker 接管新连接——零停机部署就是靠这个。

Nginx vs Apache:核心差异

维度NginxApache
并发模型事件驱动、异步非阻塞每连接一个线程(Prefork/Worker)
万级并发单机轻松数万连接通常千级就吃力
内存占用极低(worker 数固定)随连接数线性增长
静态文件极快(sendfile 零拷贝)略慢
动态内容需反向代理到后端可内嵌 PHP/Python 模块
配置风格指令式、嵌套块指令式、.htaccess 分布式
典型场景反向代理、负载均衡、静态资源传统 LAMP、共享主机

注意:Apache 不是不好,它在 2.4 之后也引入了 Event MPM(事件模型),但生态惯性已经形成——云原生时代 Nginx 是事实标准。

Nginx 都用在哪?典型应用场景

社区与生态:开源版 vs Plus 版

该不该学 Nginx?

如果你的方向是后端开发、运维、DevOps、SRE、云原生,Nginx 是必修课。哪怕你只是个前端,要把个人项目部署上线,也绕不开它。学完本系列,你能:

← 返回 Nginx 教程目录

下一篇 Nginx 安装

✈️💬