Nginx 概念介绍
概念介绍
Nginx 是一个事件驱动(event-driven)、异步非阻塞的 HTTP 服务器与反向代理服务器。它最早是为了解决 C10K 问题(单机同时处理上万个连接)而设计的,用一个 master 进程加多个 worker 进程的模型,每个 worker 用 epoll(Linux)或 kqueue(BSD/macOS)这样的多路复用机制,在一个线程里轮询处理成千上万个连接。相比之下,Apache 传统的 prefork 模型是「一个连接一个进程」,连接数一上去内存和上下文切换就撑不住了。
在真实项目里,Nginx 通常不直接跑业务代码,而是待在所有服务的入口处,承担四件事:
- 反向代理(reverse proxy):浏览器只认识 Nginx 的地址,Nginx 再把请求转发给后面的 Node、Java、Go、Python 服务。后端服务的端口不用暴露到公网,部署位置可以随便换,前端只要改 upstream 就行。
- 负载均衡(load balancing):同一个服务起多个实例时,Nginx 按策略把请求分发到不同实例上,是水平扩容最省事的一层。
- TLS 终止(TLS termination):证书只在 Nginx 这一层配置和续期,后面所有后端服务直接跑明文 HTTP。这是实际部署中最常见的做法。
- 静态资源托管:图片、CSS、JS、字体、打包产物直接由 Nginx 从磁盘读出来发回去,不走应用进程。Nginx 发静态文件的效率远高于任何应用框架。
除此之外,Nginx 还常被用来做 gzip 压缩、响应缓存、访问限流、请求重写、灰度分流、WebSocket 长连接入口。可以说它是「Web 流量的第一道门槛」。
与 Caddy、Traefik、Apache 的区别
这几个工具定位有重叠,但重心完全不同。选型时不要只看功能列表,要看你的部署方式和运维习惯。
| 对比项 | Nginx | Caddy | Traefik | Apache httpd |
|---|---|---|---|---|
| 核心定位 | 通用 Web 服务器 + 反向代理 | 自动 HTTPS 的 Web 服务器 | 云原生边缘路由器 | 传统 Web 服务器 |
| 配置方式 | 静态配置文件,改完 reload | Caddyfile,语法极简 | 标签 / CRD / API 动态发现 | 配置文件 + .htaccess |
| 证书管理 | 需配 certbot 或 acme.sh 等外部工具 | 内置 ACME,默认自动签发续期 | 内置 ACME,按路由自动签发 | 需 mod_md 或外部工具 |
| 服务发现 | 不支持,靠改配置或模板渲染 | 有限,靠插件 | 原生支持 Docker / K8s / Consul | 不支持 |
| 动态生效 | 要 reload(平滑,但仍是变更) | 要 reload | 改标签即生效,不用重启 | 要 restart / graceful |
| 性能 | 静态与并发场景极强 | 基于 Go,够用 | 基于 Go,够用 | 并发模型偏重 |
| 适合场景 | 传统服务器、固定拓扑、追求极致性能与生态 | 单机小项目、想零配置上 HTTPS | 容器编排、服务频繁上下线 | 老系统、.htaccess 生态依赖 |
一句话选择建议:固定几台机器、拓扑不常变、要抠性能和生态,选 Nginx;容器数量天天变、服务自动上下线,Traefik 更省心;只有一台小机器、不想碰证书,Caddy 最省事。Nginx 的问题是配置是静态的、证书要自己接 ACME 客户端,代价换来的是稳定、可控、资料最多。
核心术语表
读 Nginx 配置时看到的所有东西,基本都在下面这张表里。注意 Nginx 的配置是指令(directive)树,指令写在哪个上下文里决定了它能不能用、作用范围多大。
| 术语 | 含义与作用 |
|---|---|
| server block | 一个虚拟主机,对应一个 server { } 块,通常由 listen + server_name 决定它接哪个域名和端口的流量。一台机器可以有很多个。 |
| location | server 内部的路径匹配规则,写在一个 location { } 里,决定某个 URL 前缀/正则走哪套处理逻辑。 |
| upstream | 后端服务器组的定义块,列出多个后端地址和负载均衡策略,供 proxy_pass 引用。 |
| proxy_pass | 把请求转发到指定后端的指令,是反向代理的核心。写法上有没有结尾斜杠,行为差别很大,详见后文。 |
| worker | 工作进程。master 负责读配置、管进程;worker 负责真正处理连接。数量由 worker_processes 决定。 |
| context | 指令所处的层级,如 main、http、server、location。指令写错层级会直接报错,Nginx 会告诉你「directive is not allowed here」。 |
| directive | 配置里的每一条配置项,分简单指令(以分号结尾)和块指令(带花括号)。 |
| 变量 | 以 $ 开头的内置值,如 $host、$remote_addr、$request_uri、$proxy_add_x_forwarded_for,可在配置中直接引用。 |

