nginx 是一个高性能的 http 和反向代理服务器,也是一个 imap/pop3 代理服务器。它是作为一款轻量级的服务器,专门设计用来处理高并发连接,非常适合用在资源受限的环境中。nginx 最初是为俄罗斯访问量第二的网站 yandex.ru 而开发的,现在它已经成为全球最流行的 web 服务器之一。
一、nginx介绍
nginx(发音 “engine-x”)是一款高性能的开源 web 服务器,也常用作反向代理、负载均衡和 http 缓存。
作用
| 角色 | 作用 |
|---|---|
web 服务器 | 直接对外提供静态文件(html、css、图片等) |
反向代理 | 把请求转发给后端(如 node、python、java),对外只暴露 nginx |
负载均衡 | 把流量分到多台后端服务器 |
ssl 终结 | 在入口处理 https,后端可走 http |
优点
- 高并发、低资源占用:事件驱动、异步非阻塞,适合大量连接
- 配置简单:一个
nginx.conf就能管站点、代理、限流等 - 稳定成熟:生产环境里非常普遍
典型架构
用户 → nginx(80/443)→ 静态文件
→ 或转发到后端应用(如 :3000、:8080)
核心概念
server:一个虚拟主机(域名 / 端口)location:按 url 路径匹配规则proxy_pass:反向代理到上游服务upstream:定义一组后端服务器(负载均衡用)
最小配置示例
server {
listen 80; # 监听的端口
server_name example.com; # 虚拟主机的名字
location / {
root /var/www/html;
index index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:3000/; # 反向代理
}
}含义:根路径返回静态页面;/api/ 转发给本机 3000 端口的应用。
总结:nginx 站在最前面,负责接流量、发静态、转后端、做负载和 https。
二、企业中 nginx 的使用
企业里 nginx 几乎总是放在流量入口,很少当“唯一应用服务器”。
一、用法
1. 统一入口 / 反向代理(最常见)
客户端
→ cdn / waf(可选)
→ nginx / ingress(入口)
→ 后端服务(java / go / node / 微服务)
典型职责:
- 对外只暴露 80/443
- 按域名、路径把请求转到不同服务
- 统一加 https、日志、限流、鉴权头
server {
listen 443 ssl;
server_name api.company.com;
location /user/ {
proxy_pass http://user-service;
}
location /order/ {
proxy_pass http://order-service;
}
}2. 静态资源托管
官网、运营页、前端打包产物(dist/)由 nginx 直接提供:
- html / js / css / 图片 / 字体
- 开启 gzip/brotli、缓存头、
try_files支持 spa
location / {
root /data/www/app;
try_files $uri $uri/ /index.html;
}3. 负载均衡
后端多实例时,nginx 做分发:
upstream app_backend {
least_conn;
server 10.0.1.11:8080 weight=3;
server 10.0.1.12:8080 weight=2;
server 10.0.1.13:8080 backup;
}
server {
location / {
proxy_pass http://app_backend;
}
}常见算法:round-robin、least_conn、ip_hash(会话粘滞)。
4. https / 证书终结
企业标配:
- 证书挂在 nginx(或网关)上
- 后端内网走 http / mtls
- 强制 http→https、hsts
5. 灰度 / 蓝绿 / 金丝雀
按 header、cookie、ip、百分比切流量:
# 简化示意:带灰度 cookie 的走新版本
if ($cookie_canary = "1") {
proxy_pass http://app_canary;
}更复杂场景常配合 openresty、ingress controller、service mesh。
6. api 网关轻量能力
不是完整 api gateway,但企业常让 nginx 承担一部分:
- 路径改写、header 注入
- ip 白名单 / 黑名单
- 基础鉴权(basic auth、jwt 校验多靠模块或上游)
- 限流限连
- 跨域 cors
7. 与 kubernetes 结合
- ingress-nginx / nginx ingress controller
- 每个 ingress 规则最终变成 nginx 配置
- 负责集群南北向流量
8. 内网场景
- 管理后台入口
- 跳板式反向代理(内网系统统一域名)
- 文件下载 / 大文件加速(
sendfile、断点续传)
9. 高可用部署形态
| 形态 | 说明 |
|---|---|
主备 + keepalived | vip 漂移,单机房常见 |
多机 + l4(slb/f5) | 云上很常见:slb → 多台 nginx |
容器化多副本 | k8s deployment + service |
cdn 前置 | 静态/边缘缓存,源站仍是 nginx |
二、知识体系
按优先级分层,从“能上线”到“能扛事”。
a. 基础必会
1. 进程与架构
- master / worker 模型
- worker 数与 cpu 核数关系
- 事件驱动、非阻塞 i/o 为什么能扛高并发
- 配置热加载:
nginx -t→nginx -s reload
2. 配置结构
main
└─ events
└─ http
├─ upstream
├─ map
└─ server
└─ location
要清楚:指令作用域(哪些写在 http,哪些只能在 server/location)。
3.server/location匹配规则
listen+server_name如何选虚拟主机location优先级:精确=> 前缀^~> 正则~/~*> 普通前缀rootvsaliastry_files(spa、静态站必备)
4. 反向代理核心
proxy_pass
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_set_header x-forwarded-proto $scheme;
proxy_connect_timeout
proxy_send_timeout
proxy_read_timeout
proxy_buffering
client_max_body_size
理解:
proxy_pass末尾有无/对路径改写的影响- 为什么后端拿到的 ip/协议可能不对(没传
x-forwarded-*) - 超时、缓冲、大文件上传失败怎么查
5. 静态与压缩缓存
expires/cache-controlgzip/brotlisendfile、tcp_nopush、tcp_nodelay- 静态资源版本号与长期缓存策略
6. https
- 证书、私钥、中间证书链
- tls 版本与 cipher(安全基线)
- http/2、ocsp stapling(进阶)
- 强制跳转与 hsts 风险(配错会“锁死”域名)
7. 日志与排障
access_log/error_log- 自定义
log_format(加request_id、上游耗时) - 常见状态码:
502/504(上游挂/超时)、413(上传过大)、499(客户端断开) nginx -t查看最终生效配置
b. 企业生产进阶(中高级)
8. 负载均衡与健康检查
upstream权重、backup、downip_hash/sticky(会话)- 被动失败检测:
max_fails、fail_timeout - 主动健康检查(开源版弱,商业版/openresty/ingress 更强)
9. 限流限连与防刷
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req zone=api_limit burst=20 nodelay;
limit_conn addr 20;
理解:
rate、burst、nodelay含义- 按 ip / 用户 / api 维度限流
- 与 waf、网关限流的分工
10. 安全加固
- 隐藏版本号
server_tokens off - 方法限制(禁 trace 等)
- ip allow/deny
- 危险目录禁止访问(
.git、备份文件) - 请求头大小、uri 长度限制
- ssrf / 开放代理风险(错误
proxy_pass变量) - tls 与安全响应头:
x-frame-options、csp等(常在 nginx 统一加)
11. 改写与路由
rewrite、returnmap(强烈推荐,替代一堆if)- 为什么企业规范常写:尽量少用
if
12. 变量与内部机制
$host/$http_host/$uri/$request_uri区别$remote_addrvs 真实客户端 ip(real_ip模块 + 可信代理)$upstream_addr、$upstream_status、$upstream_response_time
13. 性能调优方向
worker_processes、worker_connections- 文件描述符上限
- keepalive 到上游:
keepalivein upstream +proxy_http_version 1.1 - 缓冲与临时文件(大响应、慢客户端)
- 连接耗尽、队列打满的表现
14. 配置工程化
企业不会手改一台机器的 conf,而是:
- 配置分片:
conf.d/、sites-enabled/ - ansible / salt / 镜像构建注入配置
- ci 里跑
nginx -t - 灰度发布配置、回滚
- 模板化(helm values → ingress / configmap)
c. 架构关联知识(理解“nginx 在系统中的位置”)
15. 和周边组件怎么分工
| 组件 | 更擅长 | nginx 更擅长 |
|---|---|---|
cdn | 全球缓存、抗攻击边缘 | 源站接入、动态反代 |
slb/l4 | 四层转发、高可用 | 七层路由、tls、改写 |
api gateway | 鉴权、计费、协议转换 | 高性能反代、静态、tls |
waf | 规则防护、bot | 基础限流/ip 控制 |
service mesh | 东西向、mtls、重试 | 南北向入口 |
16. 微服务 / k8s 必懂
- ingress 规则与注解(超时、正文大小、会话亲和)
- 服务发现变化时上游如何更新
- 就绪探针失败时流量摘除
- websocket / grpc 反代要点(升级头、http/2)
17. 可观测性
- 访问日志进 elk / loki
- 指标:qps、延迟、5xx、上游耗时(prometheus exporter)
- trace:注入 / 传递
x-request-id
三、按角色看“要学多深”
| 角色 | 重点 |
|---|---|
前端 | 静态部署、 |
后端开发 | 反代头、超时、上传大小、websocket、路径改写、502/504 排查 |
运维 / sre | 全套:ha、性能、安全、日志指标、配置发布、排障 |
架构师 | 入口分层、与 cdn/网关/mesh 边界、多活与灰度流量策略 |
四、建议学习路径(可执行)
- 本地搭一台:静态站 + 反代一个后端
- 刻意练匹配:多个
server_name/location,搞清谁命中 - 上 https + 日志:自己看 access/error 定位问题
- 加 upstream + 限流:模拟一台挂掉、突发流量
- 做一份生产 checklist:超时、body 大小、真实 ip、keepalive、安全头
- 再学 ingress / openresty:对应云原生或复杂网关需求
五、企业生产配置 checklist
上线前至少确认:
nginx -t通过,reload 无损- https 证书链完整,http 自动跳转正确
host/x-forwarded-*/ 真实 ip 正确client_max_body_size与业务上传一致proxy_read_timeout覆盖最长接口- 上游 keepalive 已开
- 限流与连接数有兜底
- 日志含 request id、上游状态与耗时
- 隐藏版本、禁敏感路径
- 502/504 有监控告警与扩容/摘除预案
总结
企业用 nginx,本质是“流量入口与流量治理”:反代、tls、静态、负载、限流、日志;
要掌握的核心,是配置模型 + 反代细节 + 匹配规则 + 超时/头/真实 ip + 安全限流 + 排障与高可用,而不是背一堆指令。
三、nginx 运维 / sre 版知识点清单
面向:日常接流量、排障、变更、保可用性。
sre 视角下 nginx 的定位:
每天真正在管的是:
- 入口是否可用(vip / slb / ingress 后面的 nginx)
- 流量是否按预期路由(域名、路径、灰度)
- 后端是否被正确保护(超时、限流、隔离)
- 出了问题能否 5 分钟内定位(日志、指标、配置差量)
核心不是“会写 conf”,而是:变更可控、故障可观测、回滚可快速。
场景 a:新站点 / 新域名上线
会做的事
- 加
server、证书、反代或静态目录 - 配 dns / slb 转发
- 灰度切流、观察 4xx/5xx
必会知识点
listen/server_name匹配(默认 server 陷阱)rootvsalias、try_files(spa)proxy_pass路径拼接规则(末尾/)- 证书全链、san、到期监控
- http→https、hsts 启用节奏(先观察再强制)
- 上线前:
nginx -t、reload、回滚文件准备
验收标准
- 主备/多实例配置一致
- 访问日志能区分新域名
- 证书监控已接入
- 回滚步骤可一键执行
场景 b:反代后端 api / 微服务
日常问题
- 502/504
- 上传失败 413
- 后端拿到错 ip / 错协议
- 登录态丢失、跨域异常
必会知识点:
proxy_http_version 1.1; 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_set_header x-forwarded-proto $scheme; proxy_set_header connection ""; proxy_connect_timeout 3s; proxy_send_timeout 60s; proxy_read_timeout 60s; client_max_body_size 50m;
还要懂:
- 上游 keepalive(
upstream { keepalive n; }) - buffering 开/关对大响应、ttfb 的影响
- websocket:
upgrade/connection - grpc:
grpc_pass、http/2 real_ip模块:从 slb/cdn 取真实客户端 ip(可信网段)
排障抓手
$upstream_addr$upstream_status$upstream_response_time$request_time- 区分:nginx 慢 vs 上游慢 vs 客户端慢
场景 c:负载均衡与摘流
日常操作
- 扩容加节点、发布摘流、机器故障打
down - 会话粘滞争议(要不要
ip_hash)
必会知识点
upstream:weight/backup/downmax_fails+fail_timeout(被动健康检查局限)- 算法:轮询、
least_conn、ip_hash - 主动健康检查能力边界(开源 vs plus / 外部探活)
- 发布期:先摘流再停服务,避免 502 尖刺
- 与注册中心/k8s endpoint 变更的时序
sre 原则
- 摘流要可脚本化,禁止只改一台忘了集群
- 发布窗口看:5xx、上游耗时、饱和连接数
场景 d:静态资源 / 前端发布
日常操作
- 发
dist、回滚静态版本 - 缓存导致“发了但用户看不到”
必会知识点
expires/cache-control/etag- html 短缓存或不缓存,带 hash 的 js/css 长缓存
- gzip/brotli、
sendfile - 原子发布:新目录 + 切换 symlink,避免半发布
- cdn 回源与源站缓存头一致性
场景 e:https / 证书生命周期
日常操作
- 申请/续期/替换证书
- 协议版本、弱加密治理
- 双证书(rsa + ecdsa)偶发
必会知识点
- 证书链不完整导致部分客户端失败
ssl_certificate/ssl_certificate_key- tls1.2/1.3、cipher 套件基线
- ocsp stapling
- 到期告警(30/14/7 天)
- 替换证书是否需要 reload、多机同步
事故高发点
- 只更了一台
- 中间证丢了
- hsts 预加载后证书搞砸(恢复极痛)
到此这篇关于nginx的概述和使用清单的文章就介绍到这了,更多相关nginx介绍和使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论