一、Nginx代理服务器的作用

Nginx代理服务器,主要是为了给网站或应用系统引入一位高效的“交通指挥官”(负载均衡,将用户请求均匀地分发到多台后端服务器上)、“安全屏障”(隐藏真实后端服务器,暴露自身IP)和“性能加速器”(缓存加速,专门处理耗时的SSL/TLS加密解密工作),来解决因用户量增长而带来的一系列技术挑战。

二、Nginx对比Spring Cloud Gateway

值得注意的是,Nginx(偏向边缘网关)与Spring Cloud Gateway(偏向内部网关)通常不是替代关系,而是分层协作。Nginx负责处理南北向流量(客户端到数据中心),承担外围的基础安全防护与性能优化;而Spring Cloud Gateway则管理东西向流量(微服务之间),处理业务相关的逻辑。

三、一次请求从浏览器发起的是怎么通过Nginx传递的

浏览器 (客户端)
   │
   │ ① HTTP/HTTPS 请求
   ▼
[ Nginx 代理服务器 ]
   │ ② 选择具体后端server块服务,然后根据请求的 URl 选择最合适的 location块
   │ ③ 可能负载均衡、修改请求头
   ▼
[ 后端服务器 1 ] 或 [ 后端服务器 2 ] (应用 + 数据库)
   │ ④ 生成响应
   ▼
[ Nginx 代理服务器 ]  ← ⑤ 可能缓存、压缩
   │ ⑥ 响应(加密或不加密)
   ▼
浏览器

第 1 步:浏览器发起请求

用户在浏览器地址栏输入 https://example.com 并回车。浏览器会做这些事情:

  • DNS 解析:将域名 example.com 解析成 Nginx 服务器所在机器的公网 IP(假设为 203.0.113.10)。

  • 建立 TCP 连接:与 203.0.113.10:443(HTTPS 默认端口)建立 TCP 连接。

  • TLS 握手(如果是 HTTPS):进行 SSL/TLS 加密握手,协商加密套件并交换证书。

  • 发送 HTTP 请求:构造并发送 HTTP 请求报文,例如:

    text

    GET /api/user HTTP/1.1
    Host: example.com
    User-Agent: ...

第 2 步:Nginx 接收请求

  • Nginx 监听在服务器的 80(HTTP)和 443(HTTPS)端口。接收到请求后,首先通过 server_name 指令匹配虚拟主机(即应该由哪个 server 块处理)。

  • 如果配置了 HTTPS,Nginx 会完成 SSL/TLS 终止:解密请求,将加密的流量转为明文 HTTP 请求,以便后续处理。这一步也减轻了后端服务的负担。


第 3 步:Nginx 处理请求(核心决策)

Nginx 在 server 块内部根据 location 指令匹配请求的 URI,决定如何处理。常见的几种情况:

情况 A:直接返回静态文件

如果请求的是图片、CSS、JS 等静态资源,Nginx 会直接从配置的 root 目录中读取文件并返回。例如:

nginx

location /static/ {
    root /var/www/html;
}

此时请求不会转发给后端。

情况 B:反向代理到后端服务器(最常见)

如果请求是动态内容(如 /api/user),Nginx 会通过 proxy_pass 将请求转发给一个或多个后端服务器。例如:

nginx

location /api/ {
    proxy_pass http://backend_servers;
}
  • 负载均衡:如果定义了 upstream 组(多个后端地址),Nginx 会按照轮询、最少连接、IP hash 等算法选择一个后端。

  • 修改请求头:Nginx 会添加或修改一些头部,如 X-Real-IPX-Forwarded-For,以便后端知道客户端的真实 IP。

  • 建立新连接:Nginx 与选中的后端服务器(如 192.168.1.100:8080)建立 TCP 连接,并将原始请求(URI、请求体、头部等)转发过去。


第 4 步:后端服务器处理并返回响应

  • 后端应用程序(例如 Spring Boot、Express、Django)收到来自 Nginx 的请求,执行业务逻辑(查询数据库、计算等)。

  • 生成 HTTP 响应(包含状态码、响应头和响应体),原路返回给 Nginx。


第 5 步:Nginx 接收后端响应并转发给浏览器

  • Nginx 收到后端响应后,可以根据需要再做一些处理:

    • 响应缓存:如果配置了 proxy_cache,Nginx 可能会把响应缓存起来,下次相同请求可以直接返回。

    • 压缩:开启 gzip 压缩后,对响应体进行压缩。

    • 修改响应头:比如添加 Cache-Control

  • 最后,Nginx 通过之前与浏览器建立的 TCP 连接,将响应(若是 HTTPS 则先加密)发送回浏览器。


第 6 步:浏览器渲染页面

浏览器收到响应后,解析 HTML、下载依赖资源(这些资源又会发起新的请求,重复以上流程),最终呈现给用户。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐