nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx正向代理与反向代理

Nginx正向代理与反向代理详解

作者:喝醉酒的小白

Nginx正向代理帮助客户端访问外部资源,常用于翻墙和隐藏IP;反向代理将外部请求转发至内网服务器,用于负载均衡、统一入口及安全隔离,两者核心区别在于代理对象(客户端vs服务端)和目的(访问外部vs服务优化)

当然可以,以下是对 Nginx 正向代理与反向代理 的详细解析,包括概念、工作机制、配置示例、使用场景和区别等内容,适用于开发、运维及网络基础学习场景。

Nginx正向代理与反向代理

一、什么是代理(Proxy)?

代理是一种网络服务,客户端通过代理服务器间接访问目标资源。根据请求的方向不同,代理分为:

类型说明
正向代理代理客户端访问外部资源(“我替你去”)
反向代理代理外部用户访问内部服务器(“你来找我,我替你找它”)

二、正向代理(Forward Proxy)

定义:

客户端并不直接访问目标服务器,而是把请求交给代理服务器,由代理服务器转发请求并返回响应。

工作流程:

[客户端] → [Nginx正向代理] → [目标服务器]
                             ↓
                    [响应返回到客户端]

使用场景:

示例配置(Nginx):

# nginx.conf
events {}

http {
    server {
        listen 8888;

        resolver 8.8.8.8;

        location / {
            proxy_pass $scheme://$http_host$request_uri;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

使用方式(客户端设置代理):

浏览器或 curl 设置代理为:http://<nginx-ip>:8888

三、反向代理(Reverse Proxy)

定义:

客户端访问代理服务器,代理根据配置将请求转发到后端真实服务器(Upstream),客户端无感知。

工作流程:

[客户端] → [Nginx反向代理] → [后端服务器]
                            ↓
                   [响应返回到客户端]

使用场景:

示例配置(Nginx):

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

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

四、正向 vs 反向代理对比总结

比较项正向代理(Forward Proxy)反向代理(Reverse Proxy)
代理的对象客户端服务器(后端)
请求目标客户端指定的外部网站内部真实服务
常用目的帮助客户端访问目标保护服务器、统一入口
客户端感知明确知道自己使用了代理无需知道后端结构
配置位置客户端需配置代理服务端配置即可
应用场景翻墙、匿名访问、绕过限制负载均衡、内网服务暴露、缓存

五、反向代理的扩展应用

功能说明
负载均衡多个后端服务器自动轮询分发流量
HTTPS 网关客户端连接为 HTTPS,后端可为 HTTP
安全隔离仅暴露代理,隐藏真实服务 IP
静态 + 动态分离静态资源由 Nginx 提供,动态由后端处理
缓存优化可配置缓存减少后端负载(如 CDN)

六、附加示例:基于域名转发

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

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

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

    location / {
        proxy_pass http://192.168.1.200:8081;
    }
}

总结一句话

如果你还想了解:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文