Nginx 运维实战: 什么是反向代理,如何配置?

发布于:2025-07-25 ⋅ 阅读:(17) ⋅ 点赞:(0)

在互联网的庞大架构中,Nginx 作为一款高性能的 Web 服务器和反向代理服务器,发挥着至关重要的作用。其中,反向代理功能更是 Nginx 被广泛应用的核心原因之一。本文将深入探讨什么是反向代理,以及如何在 Nginx 中进行反向代理的配置。

一、反向代理的概念与原理

反向代理的定义

反向代理是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

正向代理 vs 反向代理

我们先来简单对比一下正向代理与反向代理的区别:

类型 谁隐藏 使用场景 示例

正向代理

客户端

用户访问外部资源时隐藏自己

翻墙代理、公司上网代理

反向代理

服务端

外部用户访问内部服务时隐藏后端

CDN、负载均衡、Web 服务器

反向代理的核心思想是:客户端不知道真正的服务器是谁,所有请求都先发给反向代理服务器,由它转发到后端真实服务器,并将结果返回给客户端。

反向代理的作用

  • 负载均衡:当有大量客户端请求到达时,反向代理服务器可以根据预设的算法,将请求分发到不同的后端服务器上,避免单个服务器负载过高,提高整个系统的处理能力和稳定性 。

  • 安全性提升:隐藏后端真实服务器的 IP 地址,使客户端无法直接与后端服务器通信,降低了后端服务器遭受攻击的风险。同时,反向代理服务器还可以对请求进行过滤和验证,拦截恶意请求,如 SQL 注入、跨站脚本攻击(XSS)等。

  • 缓存加速:反向代理服务器可以缓存后端服务器返回的静态资源(如图片、CSS、JavaScript 文件等)和动态内容。当有相同的请求再次到达时,直接从缓存中返回数据,减少了后端服务器的压力,也加快了客户端获取数据的速度,提升用户体验。

  • 服务高可用:当某一台后端服务器出现故障时,反向代理服务器可以自动将请求转发到其他正常运行的服务器上,保证服务的连续性,实现服务的高可用性。

  • 统一入口:对外提供一个统一的访问地址,便于管理。

反向代理的工作原理

客户端向反向代理服务器发送请求,反向代理服务器根据配置的规则(如请求的 URL、客户端 IP 地址等),将请求转发到合适的后端服务器。后端服务器处理请求后,将响应结果返回给反向代理服务器,反向代理服务器再将响应结果返回给客户端。整个过程中,客户端并不知道真正处理请求的后端服务器是谁,它只与反向代理服务器进行交互。

二、Nginx 反向代理的配置

基本反向代理配置

假设你有一个运行在服务器端口为 3000 的服务,现在想通过域名 http://api.example.com 访问这个服务。

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

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

说明

  • listen 80:表示 Nginx 监听 80 端口。

  • server_name:指定域名,若没有域名或通过 IP 访问,可忽略此配置。

  • location / :定义请求的 URL 匹配规则,这里表示所有请求都将被代理到后端服务器。

  • proxy_pass:指定后端服务器的地址和端口。

  • proxy_set_header:设置请求头,用于传递原始信息给后端,例如:Host表示传递原始请求的域名,X-Real-IP表示获取客户端真实IP,X-Forwarded-For表示传递完整的代理路径,X-Forwarded-Proto表示传递后端请求使用的协议。

基于 URL 的反向代理配置

有时候,我们可能希望根据不同的 URL 将请求转发到不同的后端服务器。例如,将以/api开头的请求转发到一个 API 服务器,将其他请求转发到另一个 Web 服务器。

server {
    listen 80;
    server_name your_domain.com;

    location /api {
        proxy_pass http://api_server_ip:port;  # API服务器地址和端口
        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;
    }

    location / {
        proxy_pass http://web_server_ip:port;  # Web服务器地址和端口
        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;
    }
}

添加 SSL 支持(HTTPS)

如果你有 SSL 证书(比如 Let's Encrypt),可以添加 HTTPS 支持:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

# 强制跳转 HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

负载均衡配置

Nginx 支持多种负载均衡算法,如轮询(默认)、加权轮询、IP 哈希等。下面以加权轮询为例,介绍如何配置负载均衡。

upstream backend_servers {
    server 192.168.1.101 weight=3;  # 权重为3
    server 192.168.1.102 weight=1;  # 权重为1
}

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://backend_servers;
        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;
    }
}

总结

反向代理是 Nginx 的重要功能之一,通过合理配置反向代理,我们可以实现负载均衡、提升安全性、加速服务响应等目标。在实际应用中,根据具体的业务需求和服务器架构,灵活运用 Nginx 的反向代理配置,能够打造出高性能、高可用的 Web 服务系统。


网站公告

今日签到

点亮在社区的每一天
去签到