# Nginx **Repository Path**: middleware-lab/nginx ## Basic Information - **Project Name**: Nginx - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-15 - **Last Updated**: 2026-09-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Nginx Lab 用 **Go** 在进程内模拟 Nginx 的常见用法、特性和线上问题,用 **React** 做成可点击的实验台。 这不是再包一层真实 Nginx,而是把 `proxy_pass`、负载均衡、限流、缓存、502/504、location 匹配等语义做成可观察的请求实验:发一组请求,立刻看到打到哪台上游、返回什么状态码、以及对应的 `nginx.conf`。 ## 场景 | 分类 | 场景 | | --- | --- | | 核心特性 | 反向代理、负载均衡、静态文件 / try_files、Gzip、代理缓存、WebSocket | | 流量控制 | limit_req、limit_conn、proxy_buffering、CORS | | 故障模拟 | 502、504、413、请求头过大、被动健康检查 | | 配置陷阱 | location 优先级、proxy_pass 斜杠、rewrite/return、X-Forwarded-*、会话粘滞 | ## 启动 需要 Go 1.22+ 和 Node 20+。推荐用仓库根目录的脚本一键启停: ```bash ./lab.sh start # 同时拉起 API 和 React ./lab.sh stop # 只停本脚本拉起的进程 ./lab.sh status ./lab.sh logs ./lab.sh restart ./lab.sh start prod # 打包前端,只跑 Go(一个端口) ``` 默认 API `:8090`、前端 `:5173`。端口被占用时会自动向后寻找空闲端口,不会去抢别人的服务。也可以显式指定: ```bash API_PORT=8088 WEB_PORT=5174 ./lab.sh start ``` ## 怎么用 1. 在左侧选一个场景,阅读「会看到什么 / 线上常见问题 / 对应改法」。 2. 用预设或自己改 Method、路径、Header、并发次数,点「发送请求」。 3. 看响应状态码、命中的上游、缓存 HIT/MISS,以及底部的 access/error 日志。 4. 点击上游卡片可以把它标记为 DOWN,用来复现 502 和故障转移。 5. 「重置场景」会清掉限流桶、缓存和计数。 WebSocket 场景除了模拟握手,还可以连真实的 `ws://localhost:5173/gw/websocket/echo`(开发时由 Vite 转到 Go)。 ## 目录 ``` cmd/server 入口 internal/engine 负载均衡、限流、缓存、location、反向代理 internal/scenarios 场景目录与可运行 handler internal/api REST / SSE / WebSocket web Vite + React 实验台 ``` ## 说明 限流采用与 Nginx `limit_req` 相近的漏桶(rate + burst + nodelay);location 匹配顺序为精确 `=` → `^~` → 正则 → 最长前缀。数值和超时被刻意缩小,方便在页面上几秒内复现,而不是照抄生产默认的 60s。