Nginx 是什么
总结一句话:Nginx 是一个高性能的 Web 服务器,同时也常用作反向代理、负载均衡和网关。
一、Nginx 的核心定位
Nginx(发音:engine x) 最初是一个 Web 服务器(HTTP Server),用来处理 HTTP 请求并向客户端返回网页、图片、接口响应等。
随着功能不断扩展,现在它有了多种常用角色:
Nginx 是一款高性能的 Web 服务器,常用作反向代理、负载均衡和网关。本文介绍了 Nginx 的核心定位(Web 服务、反向代理、负载均衡等),提供了静态托管、反向代理及负载均衡的配置示例。重点解析了一份典型的前后端分离部署模板配置,涵盖监听端口、静态资源根目录、SPA 路由兜底、上传限制、API 转发及 Gzip 压缩等关键配置项,适用于 Docker 容器化部署及微服务架构。
总结一句话:Nginx 是一个高性能的 Web 服务器,同时也常用作反向代理、负载均衡和网关。
Nginx(发音:engine x) 最初是一个 Web 服务器(HTTP Server),用来处理 HTTP 请求并向客户端返回网页、图片、接口响应等。
随着功能不断扩展,现在它有了多种常用角色:
| 角色 | 说明 |
|---|
| Web 服务器 | 直接响应静态资源(HTML、CSS、JS、图片等)请求,比如前端静态站点部署。 |
| 反向代理(Reverse Proxy) | 接收客户端请求,再转发到后端服务(如 Node.js、Python、Java API),并把响应返回给客户端。 |
| 负载均衡器(Load Balancer) | 当你有多个后端实例时,Nginx 可以根据策略(轮询、IP 哈希、最少连接数等)将流量分配给不同的服务器,提升系统吞吐量与容灾能力。 |
| 网关(Gateway) | 作为应用进入入口,统一处理身份认证、路由转发、限流、缓存、日志记录等逻辑(轻量级 API Gateway)。 |
| 反向缓存(Proxy Cache) | 缓存后端生成的页面或接口结果,减少后端压力。 |
| HTTPS/TLS 终结点 | 处理 SSL/TLS 加解密,让后端服务以普通 HTTP 通信。 |
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html;
}
浏览器访问 http://example.com 时,Nginx 直接返回 /var/www/html/index.html。
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
所有到 api.example.com 的请求都被转发到本机 5000 端口(假设是 Flask 或 Node.js 服务)。
upstream backend_servers {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend_servers;
}
}
请求会轮流分发到三个后端节点,实现负载均衡。
.conf 或 include 轻松组织多站点;是的,你提到的'网关、负载均衡'就是 Nginx 在现代架构中非常典型的用途。
简单理解:
| 层 | 工具 | 功能定位 |
|---|---|---|
| 网络层 (L4) | LVS, HAProxy | 转发 TCP/UDP 请求 |
| 应用层 (L7) | Nginx, Traefik, Kong | 解析 HTTP 请求、Header、URL 路由、身份验证、限流等 |
| 服务层 | Spring Cloud Gateway, Istio | 更智能的服务网关与服务发现、灰度发布等 |
所以:Nginx 是一种应用层反向代理 + 负载均衡器,如果加上 Lua 或 Nginx Plus 模块,它也能做轻量级 API Gateway。
Nginx 是一个高性能的 Web 服务器 + 反向代理 + 负载均衡器,常被用作系统对外访问的'入口网关'。
下面是一张文字版的Nginx 工作原理示意图,用简单的 ASCII 图来展示它在系统中的位置和作用:
┌──────────────────────────┐
│ 用户浏览器 │
│ (User / Client Request) │
└────────────┬─────────────┘
│ HTTP/HTTPS
▼
┌─────────────────────────┐
│ NGINX 网关 │
│-------------------------│
│ ① 反向代理 (Reverse Proxy)│
│ ② 负载均衡 (Load Balancer)│
│ ③ SSL 终结 / 缓存 / 限流等│
└────────────┬─────────────┘
│
┌────────────┼─────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 后端服务 A │ │ 后端服务 B │ │ 后端服务 C │
│ (API Server)│ │ (API Server)│ │ (API Server)│
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└────────────┴────────────┘
▲
│ 业务逻辑响应
│
┌─────────────────────────┐
│ 响应返回给客户端 │
└─────────────────────────┘
[Browser/App] → [CDN] → [Nginx Gateway] → [Backend Cluster]
或在微服务架构中:
[Client] → [Nginx / API Gateway] → [Service Mesh / Microservices]
一份配置如下:
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# Frontend SPA - all routes fallback to index.html
location / {
try_files $uri $uri/ /index.html;
}
# Allow large file uploads(images)
client_max_body_size 50m;
# Proxy API requests to backend
location /api/ {
proxy_pass http://backend:8000;
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_read_timeout 300s;
# SSE support
proxy_buffering off;
proxy_cache off;
}
# Gzip
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
}
这份配置是一个非常典型的 Nginx 前后端分离部署模板——前端是一个单页应用(SPA),后端是 API 服务。
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / { ... }
client_max_body_size 50m;
location /api/ { ... }
gzip on;
gzip_types ...;
}
这块配置定义了一个 HTTP 服务器块(server{})。每个 server 块通常监听一个端口和一个域名,并定义这个虚拟主机的行为。
listen 80;
server_name _;
listen 80;:告诉 Nginx 监听本机 80 端口(HTTP 默认端口)。server_name _;:_ 是一个 通配符占位符,表示匹配所有的域名请求(即默认站点)。常用于 Docker 容器或测试环境中,没有指定域名时,Nginx 会把请求交给这个 server 块处理。root /usr/share/nginx/html;
index index.html;
index index.html;:当访问目录时(如 /),默认返回 index.html 文件。对于 SPA(单页应用),这是前端的入口文件。root:告诉 Nginx 静态文件的根目录。当请求一个 URL 时,Nginx 会在此路径下寻找对应文件。例如,请求 /css/app.css → 实际查找 /usr/share/nginx/html/css/app.css
location / {
try_files $uri $uri/ /index.html;
}
location /:匹配所有路径(但更具体的 location 会优先)。try_files $uri $uri/ /index.html;:
$uri 表示请求路径;$uri/ 表示以文件夹形式尝试;/index.html 是兜底响应。意思是:如果请求的路径有对应的文件就返回静态文件,否则都回退(fallback)到 index.html。这对于前端 单页应用(React / Vue / Angular) 非常重要。例如访问 /dashboard 时,实际文件不存在,但前端路由会接管它。
client_max_body_size 50m;
限制客户端上传文件的最大大小(这里是 50MB)。默认只有 1MB,上传图片、音视频时容易报错。如果启用了文件上传接口,就必须调整这个参数。
location /api/ {
proxy_pass http://backend:8000;
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_read_timeout 300s;
proxy_buffering off;
proxy_cache off;
}
这一块是重点:
location /api/:表示拦截所有以 /api/ 开头的请求。例如 /api/login、/api/upload。proxy_pass http://backend:8000;:将请求转发给名为 backend 的服务的 8000 端口。在 Docker Compose 等环境中,这里 backend 是容器名(会自动解析为容器 IP)。
proxy_set_header Host $host;:保持原始请求头中的主机名;proxy_set_header X-Real-IP $remote_addr;:记录用户真实 IP;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:记录完整的客户端 IP 链(用于日志或防御)。proxy_read_timeout 300s;:允许后端请求最长 300 秒,没有响应才算超时;适合长任务接口。proxy_buffering off;:关闭响应缓冲(特别是后端返回 Server Sent Events (SSE) 时,否则会卡住)。proxy_cache off;:关闭代理缓存,避免实时响应被缓存。用途总结:这一段让 /api/ 前缀的请求转发到后端,实现前后端分离部署。
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip on;:启用响应压缩;gzip_types ...;:定义需要压缩的 MIME 类型,例如 HTML、CSS、JS、JSON。好处:减小网络传输体积,提升页面加载速度。
| 部分 | 功能 | 说明 |
|---|---|---|
listen + server_name | 网络入口 | 监听 80 端口、默认站点 |
root + index | 静态资源目录 | 前端编译产物存放路径 |
location / | SPA 路由处理 | 所有路径 fallback 到 index.html |
client_max_body_size | 上传限制 | 允许大文件上传 |
location /api/ | API 转发 | 请求代理到后端容器 |
gzip on | 压缩优化 | 提升性能 |
若希望跨域统一,可以在 /api/ 块添加:
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers *;
若项目使用 HTTPS,只需添加:
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
这份配置非常适合:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online