Nginx开智
HTTP + TLS加密加密后的数据先解密再看HTTP内容Nginx 本质上是:一个基于事件驱动模型的高性能网络服务器,核心能力是“高效处理大量连接”。反向代理 + 负载均衡 + 高并发如果你愿意,我还能继续讲:Nginx 配置文件详解location 匹配规则proxy_pass 为什么容易错Nginx 工作原理源码级分析epoll/reactor 模型OpenRestyLua 扩展Nginx
Nginx(读作 “engine-x”)是一个高性能的 Web 服务器、反向代理服务器和负载均衡器。它最初由 Igor Sysoev 开发,核心目标是解决高并发连接的问题。
现在它已经成为互联网基础设施里最常见的软件之一,很多网站、API、网关、Kubernetes Ingress 都在用它。
一、Nginx 是干什么的
Nginx 本质上可以做 5 件核心事情:
| 功能 | 说明 |
|---|---|
| 静态文件服务器 | 提供 HTML/CSS/JS/图片 |
| 反向代理 | 转发请求给后端服务 |
| 负载均衡 | 把流量分发到多台机器 |
| HTTPS 网关 | TLS/SSL 终止 |
| 网关/边缘层 | 限流、缓存、鉴权、压缩等 |
二、Nginx 的典型架构位置
最经典的部署:
用户浏览器
↓
Nginx
↓
后端应用(Java / Go / Node / Python)
比如:
https://example.com
↓
Nginx
↓
127.0.0.1:8080
Nginx 对外暴露 80/443 端口。
后端程序只跑内部端口。
三、为什么大家喜欢 Nginx
核心原因:
1. 高性能
Nginx 用的是:
-
事件驱动
-
非阻塞 IO
-
epoll(Linux)
所以它:
-
内存占用低
-
并发能力强
-
非常适合大量连接
2. 适合高并发
Apache 的传统模式:
一个请求 = 一个线程
Nginx:
一个 worker 处理大量连接
所以 Nginx 更轻量。
PS:Apache、Nginx、Tomcat 的关系
很多人第一次接触会混。
实际上:
| 软件 | 本质 |
|---|---|
| Apache HTTP Server | Web Server |
| Nginx | Web Server / Reverse Proxy |
| Tomcat | Java Application Server |
核心区别:
Apache/Nginx
主要处理 HTTP
Tomcat
主要运行 Java Web 应用
最经典架构
Browser
↓
Nginx / Apache
↓
Tomcat
↓
Java代码
为什么不直接让 Tomcat 对外?
因为 Tomcat:
-
动态能力强
-
但静态资源能力弱
-
并发能力不如 Nginx
-
HTTPS、缓存、限流不专业
所以:
Nginx负责“入口”
Tomcat负责“业务”
一个形象理解
Nginx
像:
酒店前台
负责:
-
接待
-
分流
-
安检
-
排队
Tomcat
像:
真正干活的后厨
负责:
-
执行业务逻辑
-
查数据库
-
返回结果
3. 配置简单
配置文件结构清晰:
http {
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
}
四、Nginx 核心概念
1. worker 进程
Nginx 架构:
master process
├── worker
├── worker
├── worker
master:
-
管理配置
-
管理 worker
worker:
-
真正处理请求
一般:
worker_processes auto;
自动等于 CPU 核数。
2. event loop
Nginx 最大特点。
它不是:
请求来了 → 创建线程
而是:
一个 worker
↓
监听大量 socket
↓
谁可读就处理谁
这就是:
-
Reactor 模式
-
事件驱动
3. location
location 是路由规则。
例如:
location /api/ {
proxy_pass http://backend;
}
表示:
/api/*
都转发给后端。
4. upstream
upstream 是后端服务池。
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
然后:
proxy_pass http://backend;
五、反向代理(最重要)
这是 Nginx 最核心用途。
什么叫反向代理
用户:
以为自己访问的是 nginx
实际上:
nginx 去访问后端
用户根本不知道后端是谁。
请求流程
Browser
↓
Nginx:443
↓
Spring Boot:8080
Nginx:
-
接收 HTTPS
-
解密 TLS
-
转发 HTTP
-
返回结果
配置示例
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
PS:什么是 TLS 解密
HTTPS:
HTTP + TLS加密
浏览器发送的是:
加密后的数据
服务器必须:
先解密
再看HTTP内容
这个过程:
TLS termination
或者:
SSL termination
TLS 终止(TLS termination)
比如:
Browser
↓ HTTPS
Nginx
↓ HTTP
Tomcat
Nginx:
-
负责 TLS 握手
-
解密 HTTPS
-
转成普通 HTTP 给 Tomcat
这叫:
TLS terminated at Nginx
为什么这么做
因为 TLS 很耗 CPU。
RSA/ECDHE/AES 都有计算。
如果让每个 Java 服务自己搞:
-
成本高
-
配置复杂
-
性能差
所以统一放 Nginx。
六、负载均衡
最简单的负载均衡
upstream app {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
}
Nginx 默认:
轮询(round robin)
其它策略
1. 权重
server 10.0.0.1 weight=5;
2. IP 哈希
ip_hash;
同一个用户总访问同一台机器。
适合 session。
3. 最少连接
least_conn;
PS:ip_hash 和 least_conn 怎么做的
1. ip_hash
目标:
同一个用户固定到同一台机器
原理
Nginx:
hash(client_ip) % server_count
例如:
192.168.1.1
↓
hash
↓
server2
所以:
-
session 不丢
-
用户固定
缺点:
-
不均衡
-
NAT (网络地址转换)下很多用户同 IP
2. least_conn
目标:
谁最闲给谁
Nginx 维护:
server1: 120 connections
server2: 40 connections
server3: 9 connections
新请求:
给 server3
适合:
-
长连接
-
WebSocket
-
请求耗时不均
七、HTTPS 支持
Nginx 经常做 TLS 终止。
HTTPS 配置
server {
listen 443 ssl;
ssl_certificate cert.pem;
ssl_certificate_key key.pem;
location / {
proxy_pass http://backend;
}
}
八、静态资源优化
Nginx 非常适合:
-
图片
-
CSS
-
JS
-
视频
因为它:
-
sendfile
-
零拷贝
-
文件缓存
性能非常高。
九、常见场景
1. 前后端分离
Vue React
↓
Nginx
↓
Java API
2. Kubernetes Ingress
很多 Ingress Controller:
-
nginx ingress
本质就是:
K8s + Nginx
PS:Kubernetes Ingress 是什么
K8s 里:
Pod 会频繁变化
需要:
统一流量入口
Ingress 就是:
K8s里的反向代理规则
Ingress Controller
真正干活的:
Nginx Ingress Controller
它会:
读取Ingress配置
↓
自动生成nginx.conf
例如
apiVersion: networking.k8s.io/v1
kind: Ingress
spec:
rules:
- host: api.test.com
http:
paths:
- path: /user
backend:
service:
name: user-service
相当于自动生成:
location /user {
proxy_pass http://user-service;
}
3. API Gateway
Nginx 可以做:
-
限流
-
鉴权
-
JWT
-
CORS
-
灰度发布
十、常见配置
1. gzip 压缩
gzip on;
gzip_types text/css application/json;
2. 跨域
add_header Access-Control-Allow-Origin *;
3. 限流
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
4. 缓存
proxy_cache_path /tmp/nginx_cache;
十一、Nginx vs Apache
| 对比 | Nginx | Apache |
|---|---|---|
| 并发模型 | 事件驱动 | 多线程/多进程 |
| 高并发 | 强 | 一般 |
| 静态资源 | 强 | 一般 |
| 动态语言 | 依赖代理 | 模块生态强 |
| 内存占用 | 低 | 高 |
十二、Nginx 的缺点
1. 配置有点反直觉
尤其:
-
location 匹配
-
rewrite
-
proxy_pass 尾斜杠
很容易踩坑。
2. 动态模块不如 Apache 灵活
虽然现在改善很多。
十三、一个完整例子
worker_processes auto;
events {
worker_connections 1024;
}
http {
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
location /static/ {
root /var/www/html;
}
}
}
十四、现代架构里的 Nginx
今天 Nginx 经常出现在:
CDN
API Gateway
Kubernetes
微服务
Service Mesh 边缘层
很多云厂商底层其实也是 Nginx 魔改版。
例如:
-
OpenResty
-
Kong
-
APISIX
-
Tengine
都是基于 Nginx。
十五、一句话总结
Nginx 本质上是:
一个基于事件驱动模型的高性能网络服务器,核心能力是“高效处理大量连接”。
最重要的能力:
反向代理 + 负载均衡 + 高并发
如果你愿意,我还能继续讲:
-
Nginx 配置文件详解
-
location 匹配规则
-
proxy_pass 为什么容易错
-
Nginx 工作原理源码级分析
-
epoll/reactor 模型
-
Nginx + Docker
-
Nginx + Kubernetes
-
OpenResty
-
Lua 扩展
-
Nginx 性能调优
-
面试高频题
七、JWT 是什么
JWT:
JSON Web Token
本质:
一种“自带签名”的身份凭证
传统 Session
session_id → Redis查用户
JWT:
token里直接有用户信息
JWT 结构
header.payload.signature
例如:
eyJhbGci...
优点
-
无状态
-
微服务方便
-
不依赖 session
八、CORS 是什么
浏览器安全策略:
禁止跨域
比如:
a.com
请求
b.com
会被拦。
CORS
Cross-Origin Resource Sharing。
服务器告诉浏览器:
我允许跨域
Nginx 配置
add_header Access-Control-Allow-Origin *;
九、灰度发布
目标:
新版本先给少量用户
方法
1. 按 IP
10% 用户走 v2
2. 按 Cookie
3. 按 Header
Nginx 可以:
if ($cookie_user = beta) {
proxy_pass http://v2;
}
十、location 匹配规则(超级重要)
优先级
= 精确匹配
^~ 前缀匹配
~ 正则(区分大小写)
~* 正则(不区分)
/ 普通前缀
示例
location = /login
精确匹配。
location ^~ /static/
最高优先级前缀。
location ~ \.php$
正则。
一个坑
location /api
location /api/v1
会选:
最长前缀
十一、proxy_pass 为什么容易错
因为:
尾斜杠规则反直觉
例子
location /api/ {
proxy_pass http://backend/;
}
请求:
/api/user
结果:
/user
但:
proxy_pass http://backend;
会变:
/api/user
核心规律
proxy_pass 有 /
替换 location 前缀。
proxy_pass 没 /
保留原 URI。
十二、epoll / reactor 模型
这是 Nginx 的灵魂。
传统模型
一个连接一个线程
问题:
-
线程切换贵
-
内存大
epoll
Linux 内核:
帮你监听大量socket
应用:
不用轮询
Reactor 模式
核心:
事件来了再处理
Nginx worker
while(true) {
epoll_wait()
}
谁可读:
处理谁
十三、Nginx 源码级工作原理
启动流程
main()
↓
ngx_master_process_cycle()
master:
-
监听信号
-
管理 worker
worker 核心循环
for (;;) {
ngx_process_events_and_timers();
}
里面:
epoll_wait
请求处理链
accept
↓
read request
↓
rewrite
↓
access
↓
content
↓
log
模块化。
十四、OpenResty
OpenResty:
Nginx + LuaJIT
让 Nginx:
能写业务逻辑
Lua 扩展
例如:
access_by_lua_block {
ngx.say("hello")
}
可以:
-
JWT校验
-
API网关
-
限流
-
动态路由
为什么强
LuaJIT:
-
极快
-
嵌入 Nginx event loop
-
不需要额外进程
十五、Nginx + Docker
最常见:
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
作用
容器里:
-
做静态资源服务
-
做网关
-
做 sidecar
十六、Nginx + Kubernetes
K8s 里常见:
Ingress Controller
本质:
Nginx Pod
监听:
K8s API
自动改配置。
十七、Nginx 性能调优
1. worker_processes
worker_processes auto;
2. worker_connections
worker_connections 65535;
最大连接数:
worker * connections
3. keepalive
减少 TCP 建连。
4. sendfile
sendfile on;
5. gzip
减少带宽。
6. upstream keepalive
避免频繁连接 Tomcat。
7. open_file_cache
缓存文件描述符。
十八、一句话串起来
现代 Web 架构:
Browser
↓ HTTPS
Nginx
↓ HTTP
Tomcat/Go/Node
↓
MySQL/Redis
其中:
-
Nginx 负责:
-
TLS
-
反向代理
-
负载均衡
-
静态资源
-
网关
-
-
应用服务器负责:
-
业务逻辑
-
-
epoll/reactor:
-
是 Nginx 高并发核心
-
-
Kubernetes Ingress:
-
是 K8s 世界里的 Nginx 自动化
-
-
OpenResty:
-
是“可编程 Nginx”
-
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)