基础介绍
Nginx是一个高性能的HTTP服务和反向代理的Web服务器,核心特点是占用内存少,并发能力强。
缘起与发展里程碑
- 诞生: Nginx(“engine-x”)由俄罗斯工程师 Igor Sysoev 于 2004 年首次公开,用事件驱动 + 非阻塞 I/O 模式解决当时 Apache 在高并发场景下的”C10K”难题。
- 生态壮大: 2011 年商业公司 Nginx Inc. 成立;2019 年被 F5 以 6.7 亿美元收购,开源版本继续由社区维护,商业版更名 NGINX Plus,补充了 WAF、主动健康检查、图形监控等企业级功能。
- 最新动态: 2025-04-23 发布 1.28.0 稳定版,引入 QUIC 性能提升、上游主机名自动重解析、OCSP Stapling for Stream 等特性,是目前推荐的生产版本。
核心架构剖析
Nginx 采用 “Master + Worker” 多进程模型:
- Master 负责加载配置、监听端口、管理 Worker。
- Worker 采用 epoll/kqueue 等高效事件轮询,每个 Worker 独立、无锁共享句柄,充分利用多核。
- 热加载: 通过 nginx -s reload 可在毫秒级完成无损滚动升级。
- 资源效率: 10,000 条 keep-alive 连接仅占约 2.5MB 内存,极易支撑万级并发。
这一架构带来低内存占用、优雅重载、高连接并发和可拔插模块化(静态/动态模块)三大优势。
核心功能
- HTTP 服务器: 静态文件、索引/列目录、Gzip、Range、XSLT、SSI、HTTP/2、HTTP/3/QUIC
- 反向代理 & 缓存: proxy_pass、多级缓存、proxy_cache、带宽限速、后端健康检查
- 负载均衡: upstream 支持 RR、IP 哈希、最少连接、慢启动,支持会话保持与主动/被动健康检查
- 流量治理: 限流 (limit_req/conn)、灰度发布 (split_clients)、A/B 测试、镜像请求
- 多协议代理: TCP/UDP、FastCGI、uwsgi、SCGI、gRPC、WebSocket
- 脚本扩展: 内置 njs / Perl,可按需动态逻辑
常见落地场景
- 静态资源服务器:博客、前端 SPA、下载镜像分发
- 反向代理 + 缓存层:给后端 Java/Spring、Go、Python 服务加速,削峰填谷
- API 网关 / BFF:与 Lua、OpenResty、Kong 等结合,实现鉴权、限流、服务编排
- Kubernetes Ingress:官方 NGINX Ingress Controller;亦可用 NGINX Gateway Fabric 实现 Gateway API
- 多协议服务枢纽:MQTT、WebSocket、gRPC、数据库隧道等 L4/L7 统一入口
- 直播 / 点播:HLS、DASH、FLV、MP4 切片与时间移位,边缘缓存
应用场景
HTTP服务器
性能非常高,注重效率,高负载。支持5万个并发连接数,不仅如此,CPU和内存的占用很低。
反向代理服务器
- 正向代理: 在浏览器中配置代理服务器的相关信息,通过代理服务器访问目标网站,代理服务器收到目标网站的响应之后,会把响应的信息返回给我们自己的浏览器客户端。
- 反向代理: 浏览器客户端发送请求到反向代理服务器(比如Nginx),由反向代理服务器选择原始服务器提供服务获取结果响应,最终再返回给客户端浏览器。
基础配置示例
worker_processes auto;
events { worker_connections 10240; }
http {
include mime.types;
server {
listen 80 default_server;
server_name _;
root /var/www/html;
location / { try_files $uri $uri/ =404; }
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
}
}
反向代理配置
http {
upstream backend {
server 10.0.0.1 max_fails=3 fail_timeout=10s;
server 10.0.0.2 max_fails=3 fail_timeout=10s;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
运维优化要点
- 资源限制: worker_rlimit_nofile & ulimit 同步调大;reuseport 在 Linux 3.9+ 提升多核利用率
- TLS 调优: 优先开启 TLS 1.3,合理配置 ssl_session_cache、ssl_buffer_size、OCSP Stapling(1.28 支持 Stream 模块)
- 日志与监控: JSON 格式输出 + Fluent Bit / Loki;或启用 Nginx Amplify、Grafana Agent 收集指标
- 安全强化: headers_more 添加 HSTS / CSP;使用 ModSecurity 或商业 WAF
- 容器化/K8s: 只暴露必要端口,利用 readinessProbe + status 模块;在 sidecar 中注入日志收集与证书刷新