编程 Nginx 反向代理与负载均衡深度实战:从原理到生产级部署的完整指南

2026-06-27 11:15:06 +0800 CST views 9

Nginx 反向代理与负载均衡深度实战:从原理到生产级部署的完整指南

一文彻底搞懂 Nginx 反向代理的核心机制、负载均衡算法、性能调优技巧,以及 2026 年云原生环境下的最佳实践。

一、为什么你需要深入理解反向代理

如果你是一名后端工程师或运维,大概率每天都在和 Nginx 打交道。但你真的理解它吗?

看看这些问题:

  • 反向代理和正向代理到底有什么区别?
  • 为什么有了 DNS 负载均衡还需要 Nginx?
  • proxy_pass 后面的斜杠加不加有什么影响?
  • 502、504 错误到底是谁的问题?
  • WebSocket、SSE 流式输出在 Nginx 上怎么配?
  • 如何设计一个能抗百万 QPS 的负载均衡架构?

本文从零开始,带你彻底吃透 Nginx 反向代理与负载均衡的核心原理。不是 API 文档式的罗列,而是告诉你为什么这样设计生产环境怎么踩坑性能优化的底层逻辑


二、反向代理的本质:一个请求的完整旅程

2.1 什么是反向代理

先说清楚概念:

正向代理:客户端知道自己要访问的目标,但通过代理服务器中转。典型场景是科学上网、公司内网代理。客户端配置代理地址,代理替你访问目标服务器。

反向代理:客户端不知道真正的服务器是谁。客户端只认识代理服务器,代理服务器背后可能有一堆真实服务器。典型场景是 Nginx、HAProxy、AWS ALB。

用一个比喻:

  • 正向代理:你找黄牛买票,黄牛去窗口排队,你给黄牛钱。你知道你要什么票。
  • 反向代理:你打客服电话,客服背后有一堆坐席,你不知道谁接你电话,只知道打这个号码就有人服务。

2.2 一个 HTTP 请求的完整旅程

┌─────────────┐    HTTP Request    ┌─────────────┐    HTTP Request    ┌─────────────┐
│   Browser   │ ─────────────────► │    Nginx    │ ─────────────────► │  Backend    │
│             │                    │  (反向代理)  │                    │  Server     │
└─────────────┘ ◄───────────────── └─────────────┘ ◄───────────────── └─────────────┘
                HTTP Response                 HTTP Response

Nginx 在中间做了什么?

  1. 接收请求 — 监听端口(如 80、443),解析 HTTP 协议,构建 ngx_http_request_t 结构体
  2. 路由决策 — 根据 server_namelocation 规则匹配,决定请求去向
  3. 请求改写 — 执行 rewrite 规则,添加/修改请求头(proxy_set_header
  4. 负载均衡 — 从 upstream 中选择一台健康的后端服务器
  5. 建立连接 — 与后端服务器建立 TCP 连接(可能有连接池复用)
  6. 转发请求 — 发送 HTTP 请求,等待响应
  7. 响应处理 — 收到后端响应,按需修改响应头,返回给客户端

每一步都有坑。生产环境的 Nginx 配置动辄上千行,每一行都是踩过坑的产物。


三、proxy_pass:从入门到精通

3.1 最简配置

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://192.168.1.100:8080;
    }
}

请求 http://api.example.com/users/123 → 转发到 http://192.168.1.100:8080/users/123

这是最基本的反向代理。但生产环境这样配,你马上会遇到问题。

3.2 IP 透传:让后端知道真正的客户端是谁

上面的配置,后端拿到的 Remote-Addr 永远是 Nginx 的 IP。日志分析、安全审计、IP 限流全废。

标准解法是三件套:

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://backend;
}
Header作用不配的后果
X-Real-IP真实客户端 IP后端日志全是 Nginx IP
X-Forwarded-For代理链完整 IP 列表多层代理时丢失来源
Host原始请求域名后端做域名路由时失效

关键点X-Forwarded-For 是追加模式。如果请求已经经过多层代理,$proxy_add_x_forwarded_for 会在现有值后面追加当前客户端 IP。

3.3 proxy_pass 末尾斜杠的坑

这是 Nginx 最经典的坑之一:

# 场景 A:proxy_pass 不带 URI(没有路径)
location /api/ {
    proxy_pass http://backend;  # 请求 /api/users → 转发到 /api/users
}

# 场景 B:proxy_pass 带 URI(末尾有斜杠)
location /api/ {
    proxy_pass http://backend/;  # 请求 /api/users → 转发到 /users(剥离前缀)
}

# 场景 C:proxy_pass 带路径
location /api/ {
    proxy_pass http://backend/v2/;  # 请求 /api/users → 转发到 /v2/users(替换前缀)
}

规则总结

  • proxy_pass 不带路径 → 保留完整 URI
  • proxy_pass 带路径(哪怕只是一个 /)→ 用 proxy_pass 的路径替换 location 匹配的部分

这个坑在生产环境经常导致 404。建议:路径前缀剥离统一用 rewrite,不要依赖 proxy_pass 的隐式行为

3.4 rewrite 前缀剥离的正确姿势

location /api/v1/ {
    rewrite ^/api/v1/(.*)$ /$1 break;  # 剥离 /api/v1 前缀
    proxy_pass http://backend;
}

break vs last

Flag行为使用场景
break停止当前 locationrewrite,继续处理请求前缀剥离后直接 proxy_pass
last停止当前 location,用新 URI 重新走 location 匹配需要 rewrite 到另一个 location
redirect返回 302 临时重定向临时 URL 变更
permanent返回 301 永久重定向SEO 友好的永久 URL 变更

常见错误:前缀剥离用 last,结果新 URI 匹配到了另一个 location,请求被发到了错误的 upstream


四、负载均衡:从算法到实战

4.1 为什么需要负载均衡

单机有瓶颈:CPU、内存、网络带宽、磁盘 IO 都是限制。水平扩展是唯一出路。

但问题来了:

  • 多台服务器怎么让客户端知道?
  • 如何保证请求均匀分布?
  • 某台挂了怎么办?

这就是负载均衡解决的问题。

DNS 负载均衡是最简单的方案:一个域名解析到多个 IP。但 DNS 有致命缺陷:

  • 更新慢:DNS 缓存 TTL 可能很长,故障摘除不及时
  • 负载不均:无法感知服务器实际负载,只能轮询
  • 健康检查缺失:后端挂了 DNS 不知道

Nginx 负载均衡是应用层方案,能精确控制路由策略、实时感知后端健康状态。

4.2 四种负载均衡算法

算法 1:加权轮询(默认)

upstream backend {
    server 192.168.1.101:8080 weight=5;
    server 192.168.1.102:8080 weight=3;
    server 192.168.1.103:8080 weight=2;
}

权重比 5:3:2,每 10 个请求中,101 处理 5 个,102 处理 3 个,103 处理 2 个。

适用场景:服务器性能不均,想让高性能机器多承担。

算法 2:IP Hash

upstream backend {
    ip_hash;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

同一个客户端 IP 永远落到同一台服务器。

适用场景:需要会话保持(Session Sticky),比如登录态存在本机内存的情况。

注意:现代应用应该把 Session 放到 Redis,不要依赖 ip_hash。这个算法是历史包袱。

算法 3:最少连接

upstream backend {
    least_conn;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

优先分配给当前连接数最少的服务器。

适用场景:长连接服务(WebSocket、SSE),避免某台服务器积压大量长连接。

算法 4:随机

upstream backend {
    random two least_conn;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

随机选择,可选结合 least_conn 做二次筛选。

适用场景:超大规模集群(数千节点),避免一致性哈希的计算开销。

4.3 健康检查:让故障节点自动下线

被动健康检查(Nginx 开源版)

upstream backend {
    server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
}
  • max_fails=3:30s 内连续 3 次失败,标记为不可用
  • fail_timeout=30s:标记不可用后,30s 内不再转发请求

被动检查的问题:必须等真实请求失败才能感知故障。如果有 100 个并发请求同时失败,用户体验就炸了。

主动健康检查(Nginx Plus 商业版)

商业版提供主动探测:

upstream backend {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    
    health_check interval=5s uri=/health matches=ok;
}

match ok {
    status 200;
    body "OK";
}

每 5 秒主动探测 /health,响应体必须是 "OK"。

开源替代方案

  • Tengine(淘宝 fork):支持主动健康检查
  • OpenResty + lua-resty-check
  • 外部监控 + Nginx 动态配置(通过 API 或 Consul)

4.4 一致性哈希:缓存友好型路由

轮询的问题是:同一个资源的请求可能落到不同服务器,导致缓存命中率低。

一致性哈希解决这个问题:同一个 Key(如 URL、用户 ID)永远落到同一台服务器。

upstream backend {
    hash $request_uri consistent;
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

consistent 关键字启用一致性哈希(Ketama 算法),节点变更时只影响 1/N 的 Key。

适用场景

  • CDN 缓存节点路由
  • 分片数据库路由
  • 分布式锁服务

五、性能优化:从理论到实战

5.1 Worker 进程模型

Nginx 采用 Master-Worker 进程模型:

┌─────────────────┐
│   Master 进程    │ — 管理 Worker,读取配置,绑定端口
└────────┬────────┘
         │ fork
    ┌────┴────┬────┴────┬────┴────┐
    ▼         ▼         ▼         ▼
┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
│Worker1│ │Worker2│ │Worker3│ │Worker4│
└───────┘ └───────┘ └───────┘ └───────┘
    │         │         │         │
    ▼         ▼         ▼         ▼
  CPU0      CPU1      CPU2      CPU3

每个 Worker 是单进程、单线程,采用事件驱动(epoll/kqueue)+ 非阻塞 IO。

核心配置

worker_processes auto;           # 自动匹配 CPU 核心数
worker_cpu_affinity auto;       # 每个 Worker 绑定一个 CPU 核心
worker_connections 65535;        # 每个 Worker 最大连接数
worker_rlimit_nofile 100000;     # Worker 进程能打开的最大文件描述符

为什么 Worker 数量等于 CPU 核心数?

Nginx 是 IO 密集型,CPU 不是瓶颈。但每个 Worker 都要处理网络 IO,多 Worker 能充分利用多核。Worker 数量超过核心数反而会增加进程切换开销。

5.2 事件模型优化

events {
    use epoll;                  # Linux 下最高效的事件模型
    multi_accept on;            # 一次 accept 所有新连接
    accept_mutex off;           # 高并发时关闭互斥锁,减少争用
}

accept_mutex 是历史遗留配置,当 Worker 数量多、连接数少时有用。现代高并发场景建议关闭,让所有 Worker 同时竞争新连接。

5.3 网络优化三件套

http {
    sendfile on;            # 零拷贝发送静态文件
    tcp_nopush on;          # 攒够一个包再发(配合 sendfile)
    tcp_nodelay on;         # 对 keepalive 连接,有数据立即发
}

这三个配置经常被误解:

  • sendfile on:内核直接从文件描述符拷贝到 socket,不经过用户态。只对静态文件生效,反向代理不走 sendfile。
  • tcp_nopush on:在 HTTP 响应头生成完成前,先攒数据。减少网络包数量,提高吞吐。
  • tcp_nodelay on:对 keepalive 连接禁用 Nagle 算法,小数据包立即发送。降低延迟,但可能增加包数量

矛盾吗?不矛盾。

tcp_nopush 在响应生成阶段生效,tcp_nodelay 在响应发送阶段生效。配合使用能达到最佳效果。

5.4 Buffer 调优:两套策略

策略 A:大 Buffer(常规 API)

proxy_buffer_size 4k;               # 响应头缓冲区
proxy_buffers 8 16k;                # 8 个响应体缓冲区,每个 16KB
proxy_busy_buffers_size 32k;        # 忙碌时最大缓冲区
proxy_temp_file_write_size 64k;     # 写入临时文件的最大块大小

原理:Nginx 收到后端响应后,先缓存到内存,等全部收完再发给客户端。

好处

  • 减少后端连接占用时间(后端处理完立刻释放)
  • 支持响应体修改(如 gzip 压缩、响应头注入)

适用场景:JSON API、图片下载、Excel 导出。

策略 B:零 Buffer(流式输出)

location /chat/ {
    proxy_pass http://ai-backend;
    proxy_buffering off;           # 核心:禁用缓冲
    proxy_cache off;
    proxy_http_version 1.1;
    chunked_transfer_encoding on;
    proxy_set_header Connection '';
    gzip off;
    
    add_header X-Accel-Buffering no;
    proxy_read_timeout 86400s;      # 24 小时超时
}

原理:收到后端一个字节,立刻发给客户端一个字节。不等待、不缓存。

适用场景

  • ChatGPT 流式输出
  • SSE(Server-Sent Events)
  • WebSocket 长连接
  • MCP 协议(AI Agent 通信)

常见错误:AI 接口配了默认的 Buffer,导致流式输出变"批量输出",用户体验极差。

5.5 连接池复用

upstream backend {
    server 192.168.1.101:8080;
    keepalive 32;               # 到每个后端保持 32 个空闲连接
}

location / {
    proxy_pass http://backend;
    proxy_http_version 1.1;    # HTTP/1.1 才支持 keepalive
    proxy_set_header Connection '';  # 清空 Connection 头
}

效果:高并发场景下,Nginx 与后端之间复用长连接,避免频繁三次握手。

关键参数

  • keepalive:空闲连接池大小
  • keepalive_timeout:空闲连接保持时间(默认 60s)
  • keepalive_requests:单个连接最多处理多少请求(默认 1000)

5.6 Gzip 压缩的正确姿势

gzip on;
gzip_comp_level 4;                 # 压缩级别 1-9,4 是性价比最优
gzip_min_length 1024;              # 小于 1KB 不压缩(越压越大)
gzip_proxied any;                  # 对所有代理请求生效
gzip_vary on;                      # 告诉缓存服务器支持压缩协商
gzip_types text/plain text/css application/javascript application/json application/xml;
gzip_disable "MSIE [1-6]\.";        # IE6 不支持 gzip

常见错误

  • 压缩级别设 9:CPU 开销大,压缩率提升不明显。推荐 4-6
  • 压缩图片/视频:已经是压缩格式,gzip 反而增大体积。
  • 忘记 gzip_vary on:CDN 可能把压缩版发给不支持 gzip 的客户端。

六、超时控制:按业务设,不要一刀切

6.1 三种超时

proxy_connect_timeout 30s;     # 连接后端的超时
proxy_read_timeout 60s;        # 等待后端响应的超时
proxy_send_timeout 60s;        # 发送请求给后端的超时

关键理解

  • proxy_read_timeout 不是"响应必须在 60s 内完成",而是"后端必须在 60s 内开始响应"。如果后端已经开始返回数据,超时计时会重置。
  • 对于 SSE 流式输出,proxy_read_timeout 是"两次数据块之间的最大间隔"。

6.2 分业务配置

# 全局默认
http {
    proxy_connect_timeout 10s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}

# 快速查询接口
location /api/query {
    proxy_read_timeout 10s;
    proxy_pass http://backend;
}

# 大文件上传
location /api/upload {
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
    client_max_body_size 100m;
    proxy_pass http://backend;
}

# AI 流式输出
location /api/chat {
    proxy_buffering off;
    proxy_read_timeout 86400s;     # 24 小时
    proxy_pass http://ai-backend;
}

经验教训:不要全局设一个很大的超时。正常 API 超过 60s 没响应,大概率是后端挂了。


七、限流:保护后端的最后一道防线

7.1 基于请求速率的限流

http {
    # 定义限流区域
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;
    
    location /api/ {
        # 应用限流规则
        limit_req zone=api_limit burst=200 nodelay;
        proxy_pass http://backend;
    }
}

参数解读

  • rate=100r/s:每个 IP 每秒最多 100 个请求
  • burst=200:允许突发 200 个请求排队
  • nodelay:排队的请求立即处理,不延迟

不加 nodelay 的效果:排队的请求会被延迟处理,平滑突发流量,但用户体验差。

7.2 基于连接数的限流

http {
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    
    location /api/ {
        limit_conn conn_limit 10;       # 每个 IP 最多 10 个并发连接
        proxy_pass http://backend;
    }
}

适用场景:防止慢攻击(大量并发连接耗尽服务器资源)。

7.3 白名单机制

geo $limit_key {
    default $binary_remote_addr;
    192.168.0.0/16 "";      # 内网不限流
    10.0.0.0/8 "";          # 内网不限流
}

limit_req_zone $limit_key zone=api_limit:10m rate=100r/s;

八、WebSocket 与 SSE 代理

8.1 WebSocket 配置

location /ws/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 86400s;      # 长连接超时
}

三个关键配置

  1. proxy_http_version 1.1:HTTP/1.1 才支持协议升级
  2. Upgrade $http_upgrade:透传客户端的 Upgrade 请求头
  3. Connection "Upgrade":告诉后端这个连接要升级

8.2 SSE(Server-Sent Events)配置

location /events {
    proxy_pass http://backend;
    proxy_buffering off;           # 核心:禁用缓冲
    proxy_cache off;
    proxy_http_version 1.1;
    chunked_transfer_encoding on;
    proxy_set_header Connection '';
    
    add_header Cache-Control "no-cache";
    add_header X-Accel-Buffering "no";
}

常见问题:配了默认的 Buffer,导致 SSE 事件一次性全部返回,客户端感知不到"流式"效果。


九、日志与监控

9.1 生产级日志格式

log_format json_combined escape=json
    '{'
    '"time":"$time_iso8601",'
    '"remote_addr":"$remote_addr",'
    '"real_ip":"$http_x_real_ip",'
    '"request":"$request",'
    '"status":$status,'
    '"body_bytes_sent":$body_bytes_sent,'
    '"request_time":$request_time,'
    '"upstream_addr":"$upstream_addr",'
    '"upstream_status":"$upstream_status",'
    '"upstream_response_time":"$upstream_response_time",'
    '"http_referrer":"$http_referer",'
    '"http_user_agent":"$http_user_agent"'
    '}';

access_log /var/log/nginx/access.log json_combined;

关键指标

  • $request_time:客户端感知的总响应时间
  • $upstream_response_time:后端实际处理时间
  • $upstream_addr:请求落到了哪台后端

排坑技巧:如果 $request_time 很大但 $upstream_response_time 很小,问题在 Nginx 或网络层(如跨机房延迟、客户端网络差)。

9.2 stub_status 监控

location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    allow 10.0.0.0/8;
    deny all;
}

访问结果:

Active connections: 291
server accepts handled requests
 16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

字段含义

  • Active connections:当前活跃连接数
  • accepts:历史总连接数
  • handled:成功处理的连接数(accepts - handled = 被拒绝的连接)
  • requests:总请求数
  • Reading:正在读取请求头的连接数
  • Writing:正在写响应的连接数
  • Waiting:空闲的 keepalive 连接数

十、安全加固

10.1 隐藏版本号

server_tokens off;

默认 Nginx 会在响应头返回 Server: nginx/1.24.0,暴露版本号可能被针对性攻击。

10.2 限制请求方法

if ($request_method !~ ^(GET|POST|HEAD)$) {
    return 405;
}

10.3 防止目录遍历

location ~* \.(?:git|svn|htaccess|htpasswd)$ {
    deny all;
}

10.4 SSL 加固

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=31536000" always;

十一、常见排坑指南

11.1 502 Bad Gateway

原因

  • 后端服务未启动
  • Nginx 与后端网络不通
  • 后端进程崩溃
  • SELinux 阻止连接

排查步骤

# 1. 检查后端是否存活
curl http://192.168.1.101:8080/health

# 2. 检查网络连通性
telnet 192.168.1.101 8080

# 3. 检查 Nginx 错误日志
tail -f /var/log/nginx/error.log | grep "upstream"

# 4. 检查 SELinux(如适用)
getsebool -a | grep httpd_can_network_connect
setsebool -P httpd_can_network_connect 1

11.2 504 Gateway Timeout

原因

  • 后端处理时间超过 proxy_read_timeout
  • 后端服务卡死(如数据库锁、死循环)

解决

  • 增加 proxy_read_timeout(如果是正常的长时间处理)
  • 优化后端性能,减少响应时间

11.3 WebSocket 连接秒断

原因:漏配 WebSocket 升级头。

解决:检查三行配置是否齐全。

11.4 流式输出变成批量输出

原因:没关 Buffer。

解决proxy_buffering off + 相关配套配置。


十二、2026 年云原生环境下的 Nginx

12.1 Nginx vs Envoy vs Gateway API

特性NginxEnvoyKubernetes Gateway API
配置复杂度高(DSL)低(声明式)
动态配置需重载原生支持原生支持
可观测性基础完善集成 Prometheus
Service Mesh不支持原生支持支持
学习曲线

结论:传统 VM 部署继续用 Nginx;Kubernetes 环境逐步迁移到 Gateway API。

12.2 Nginx + OpenTelemetry

location /api/ {
    opentelemetry_operation_name "api_request";
    opentelemetry_trace_propagate;
    proxy_pass http://backend;
}

需要在编译时启用 OpenTelemetry 模块,或使用 OpenResty。


十三、总结与落地清单

13.1 核心要点回顾

  1. 反向代理本质:请求接收 → 路由决策 → 请求改写 → 负载均衡 → 转发等待 → 响应返回
  2. 负载均衡策略:加权轮询(通用)、IP Hash(历史包袱)、最少连接(长连接)、一致性哈希(缓存)
  3. 性能优化:Worker 模型、零拷贝、Buffer 策略、连接池复用
  4. 超时控制:按业务设,不要一刀切
  5. 限流保护:请求速率 + 连接数双重保护
  6. 流式输出:必须关闭 Buffer

13.2 生产落地检查清单

  • worker_processes auto + worker_cpu_affinity auto
  • sendfile on + tcp_nopush on + tcp_nodelay on
  • 日志格式包含 $upstream_response_time$upstream_addr
  • 健康检查 max_fails 分梯度配置
  • AI/SSE 接口配置 proxy_buffering off
  • 限流规则分级(API、登录、上传)
  • WebSocket 接口配置升级头
  • server_tokens off 隐藏版本
  • stub_status 仅内网访问
  • 废弃接口用 return 404 标记

十四、参考资料

  1. Nginx 官方文档:https://nginx.org/en/docs/
  2. Nginx 源码分析:https://github.com/nginx/nginx
  3. OpenResty 最佳实践:https://openresty.org/
  4. CNCF Gateway API:https://gateway-api.sigs.k8s.io/

本文从原理到实战,系统梳理了 Nginx 反向代理与负载均衡的核心知识。配置会过时,思路不会。理解了底层原理,你就能在任何环境下设计出高性能、高可用的负载均衡架构。

推荐文章

支付轮询打赏系统介绍
2024-11-18 16:40:31 +0800 CST
页面不存在404
2024-11-19 02:13:01 +0800 CST
rmux Test
2026-05-22 18:48:45 +0800 CST
微信小程序热更新
2024-11-18 15:08:49 +0800 CST
Nginx 防止IP伪造,绕过IP限制
2025-01-15 09:44:42 +0800 CST
Java环境中使用Elasticsearch
2024-11-18 22:46:32 +0800 CST
程序员茄子在线接单