理解 Nginx 作为反向代理

更新于 2026-01-27

Amit Kumar Shinde 2021-01-12

Nginx 是一个开源的 Web 服务器,具备反向代理、缓存、负载均衡、媒体流传输等多种功能。它最初被设计为一款注重极致性能与稳定性的 Web 服务器。除了提供 HTTP 服务器功能外,Nginx 还可以作为电子邮件(IMAP、POP3 和 SMTP)的代理服务器,以及 HTTP/2、TCP 和 UDP 协议的反向代理和负载均衡器。

高并发请求处理架构

Nginx 采用事件驱动架构,并以异步方式处理请求。它被设计为使用非阻塞的事件驱动连接处理算法。因此,其单个处理线程即可同时处理成千上万个连接(请求)。这种连接处理模块使得 Nginx 能够在资源有限的情况下实现极高的运行速度和广泛的并发能力。即使在高负载场景下,Nginx 也能以较低的 CPU 和内存资源消耗处理超过 10,000 个并发连接。

Nginx 反向代理概述

Nginx 反向代理充当一个中间服务器,拦截客户端请求并将其转发至相应的上游后端服务器,再将后端服务器的响应返回给客户端。反向代理作为上游服务器之上的抽象层,提供了多种优势。

Nginx 作为反向代理的重要优势

  • 负载均衡:Nginx 可将客户端请求均匀地分发到多个上游服务器,从而提升性能,并在某台服务器发生故障时提供冗余机制。这有助于确保应用程序始终在线,持续响应客户端请求,并为应用提供更优的服务等级协议(SLA)。

  • 安全性:Nginx 通过隐藏位于私有网络中的后端服务器身份来增强安全性。客户端并不知晓实际处理请求的后端服务器。此外,无论后端网络拓扑结构如何,Nginx 都能为多个后端服务器提供统一的访问入口。

  • 缓存:Nginx 可直接提供静态内容(如图片、视频等),从而提升性能。通过直接响应静态内容,避免将其转发至后端服务器处理,有效减轻了后端服务器的负载。

  • 日志记录:Nginx 为所有经过它的后端服务器请求和响应提供集中式日志记录,便于审计和故障排查。

  • TLS/SSL 支持:Nginx 支持通过 TLS/SSL 连接实现客户端与服务器之间的安全通信。用户数据在通过 HTTPS 连接传输时始终保持加密和安全。

  • 协议支持:Nginx 支持 HTTP、HTTPS、HTTP/1.1、HTTP/2、gRPC 等超文本传输协议,同时兼容 IPv4 和 IPv6 互联网协议。

在 Ubuntu 上设置 Nginx 反向代理

前提条件

我们假设一个 .NET Core Web 应用程序正在 Ubuntu 系统上运行于轻量级的 Kestrel Web 服务器,并在 5001 端口上提供服务,但该服务无法从互联网直接访问。我们希望将此应用程序置于 Nginx 反向代理之后,通过互联网对外提供服务。反向代理会将请求转发给 ASP.NET Core 应用程序。

Kestrel 在提供来自 ASP.NET Core 的动态内容方面具有重要意义。然而,其 Web 服务能力不如 IIS、Apache 或 Nginx 等服务器丰富。反向代理服务器可提供额外功能,例如提供静态内容、缓存请求、压缩请求以及在 HTTP 服务器上终止 SSL(SSL termination)。

image

配置步骤

  1. 更新 apt 包索引并安装 Nginx Web 服务器
sudo apt update
sudo apt install nginx
  1. 禁用默认预配置的虚拟主机
sudo unlink /etc/nginx/sites-enabled/default
  1. 进入 /etc/nginx/sites-available 目录并创建反向代理配置文件
cd /etc/nginx/sites-available
nano reverse-proxy.conf
  1. 添加如下所示的反向代理配置
server {
        listen 80;
        server_name   example.com *.example.com;

        access_log /var/log/nginx/reverse-access.log;
        error_log /var/log/nginx/reverse-error.log;

        location / {
                    proxy_pass http://127.0.0.1:5001;
        }
}

服务器名称通过 server_name 指令定义,用于确定哪个 server 块将处理给定的用户请求。服务器名称即 DNS 所指向的主机名——Nginx 将结合端口设置监听该名称。例如,如果你拥有一个域名,可将 DNS A 记录(如 example.com)指向你的服务器 IP 地址。

该代理服务器将所有传入流量重定向到 5001 端口,即运行在 Kestrel 服务器上的 .NET Core Web 应用程序所在位置。proxy_pass 定义了后端服务器地址。

  1. 创建符号链接,将配置从 /etc/nginx/sites-available 复制到 /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/reverse-proxy.conf

测试并重启 Nginx

  • 测试 Nginx 配置
sudo service nginx configtest
  • 重启 Nginx
sudo service nginx restart

Nginx 反向代理的其他配置选项

在本节中,我们将展示一些推荐的 Nginx 代理属性和设置示例。

location / {
    proxy_pass http://127.0.0.1:5001;
    proxy_http_version  1.1;
    proxy_cache_bypass  $http_upgrade;

    proxy_set_header Upgrade           $http_upgrade;
    proxy_set_header Connection        "upgrade";
    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_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;
}
  • proxy_http_version 1.1:定义代理使用的 HTTP 协议版本,默认为 1.0。
  • proxy_cache_bypass $http_upgrade:设置绕过缓存响应的条件。
  • Upgrade $http_upgradeConnection "upgrade":如果应用程序使用 WebSocket,则需要这两个头部字段。
  • X-Real-IP $remote_addr:将真实的客户端远程 IP 地址转发给被代理的服务器。
  • X-Forwarded-For $proxy_add_x_forwarded_for:包含客户端经过的所有代理服务器的 IP 地址列表。
  • X-Forwarded-Proto $scheme:在 HTTPS 服务器块中,将被代理服务器返回的每个 HTTP 响应重写为 HTTPS。
  • X-Forwarded-Host $host:定义客户端最初请求的原始主机名。
  • X-Forwarded-Port $server_port:定义客户端最初请求的原始端口号。

结论

Nginx 是一款功能丰富的 Web 服务器,可作为高级反向代理使用,其配置和管理简单易行。