当前位置: 首页 > news >正文

深入理解 Nginx 的正向代理和反向代理

在线工具站
  • 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。
程序员资料站
  • 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程、各大面试专题,还有常用开发工具的教程。
小报童专栏精选Top100
  • 推荐一个小报童专栏导航站:小报童精选Top100(http://xbt100.top),收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~

Nginx 是一个高性能的 HTTP 服务器,同时也是一个反向代理服务器和邮件代理服务器。它因其高并发处理能力和灵活的配置选项而受到广泛欢迎。

什么是代理?

代理是一种网络服务,它允许客户端通过它来间接地与其他服务器通信。代理分为两种类型:正向代理和反向代理。

正向代理

正向代理位于客户端和服务器之间,代表客户端向服务器发送请求并将服务器的响应返回给客户端。正向代理通常用于以下场景:

  • 访问控制:通过代理服务器限制用户访问某些特定的网站。
  • 缓存:缓存客户端请求的数据,以减少带宽使用和提高响应速度。
  • 隐匿身份:隐藏客户端的真实 IP 地址,保护用户隐私。

反向代理

反向代理也位于客户端和服务器之间,但它代表服务器接受客户端的请求并将响应返回给客户端。反向代理通常用于以下场景:

  • 负载均衡:将请求分发到多个服务器上,分散负载,提高系统的可用性和性能。
  • 缓存:缓存服务器的响应数据,提高响应速度,减少后端服务器的负载。
  • 安全:隐藏后端服务器的真实 IP 地址,保护服务器不受外部攻击。

Nginx 的正向代理

Nginx 作为正向代理服务器,通常用于缓存和访问控制。配置一个正向代理相对简单,下面是一个基本的 Nginx 正向代理配置示例:

server {listen 8080;location / {proxy_pass http://$http_host$request_uri;proxy_set_header Host $http_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;# Enable cachingproxy_cache my_cache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;}
}proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

配置详解

  • listen 8080:监听 8080 端口,客户端将通过该端口访问代理服务器。
  • proxy_pass:将请求转发到目标服务器,$http_host$request_uri 是客户端请求的主机和 URI。
  • proxy_set_header:设置请求头,确保客户端的请求信息正确传递到目标服务器。
  • proxy_cache:启用缓存,my_cache 是缓存区的名称。
  • proxy_cache_valid:设置缓存的有效时间,不同的响应码可以有不同的缓存时间。
  • proxy_cache_path:配置缓存路径及相关参数。

启用和测试正向代理

将以上配置添加到 Nginx 配置文件中,并重启 Nginx 服务:

sudo nginx -s reload

配置好后,可以通过设置浏览器或其他客户端的代理服务器,使用 Nginx 作为正向代理。例如,配置浏览器的代理设置为 http://<your-nginx-server>:8080

Nginx 的反向代理

Nginx 作为反向代理服务器,常用于负载均衡和缓存。下面是一个基本的反向代理配置示例:

http {upstream backend {server backend1.example.com weight=5;server backend2.example.com;server backend3.example.com backup;}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;proxy_set_header X-Forwarded-Proto $scheme;# Enable cachingproxy_cache my_cache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;}}proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
}

配置详解

  • upstream backend:定义上游服务器组 backend,包含多个后端服务器。可以设置服务器权重和备份服务器。
  • listen 80:监听 80 端口,客户端将通过该端口访问反向代理服务器。
  • proxy_pass:将请求转发到上游服务器组 backend
  • proxy_set_header:设置请求头,确保客户端的请求信息正确传递到后端服务器。
  • proxy_cache:启用缓存,my_cache 是缓存区的名称。
  • proxy_cache_valid:设置缓存的有效时间,不同的响应码可以有不同的缓存时间。
  • proxy_cache_path:配置缓存路径及相关参数。

启用和测试反向代理

将以上配置添加到 Nginx 配置文件中,并重启 Nginx 服务:

sudo nginx -s reload

配置好后,可以通过访问 Nginx 服务器的 IP 或域名来测试反向代理。例如,访问 http://<your-nginx-server>,Nginx 将请求转发到后端服务器组 backend 中的服务器。

正向代理和反向代理的区别

虽然正向代理和反向代理的基本原理相同,都是在客户端和服务器之间充当中间人,但它们的作用和使用场景有所不同。

  • 方向不同:正向代理代表客户端向服务器发起请求,反向代理代表服务器接受客户端请求。
  • 用途不同:正向代理用于访问控制、缓存和隐匿身份;反向代理用于负载均衡、缓存和安全。
  • 客户端配置:使用正向代理时,客户端需要配置代理服务器;使用反向代理时,客户端无需做任何特殊配置。

结合使用正向代理和反向代理

在一些复杂的场景中,可以同时使用正向代理和反向代理。例如,一个企业可以使用正向代理来控制员工的外部网络访问,同时使用反向代理来处理外部用户对内部服务器的访问请求。

示例配置

假设企业内部网络通过正向代理访问外部网络,外部用户通过反向代理访问内部服务器,可以配置如下:

# 正向代理配置
server {listen 8080;location / {proxy_pass http://$http_host$request_uri;proxy_set_header Host $http_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;}
}# 反向代理配置
http {upstream internal_backend {server internal1.example.com;server internal2.example.com;}server {listen 80;location / {proxy_pass http://internal_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;proxy_set_header X-Forwarded-Proto $scheme;}}
}

相关文章:

  • 国内算力真的紧缺么?
  • Redis启停脚本
  • 淘宝扭蛋机小程序:互联网时代下行业的发展动力
  • 智慧校园的含义是什么
  • 使用Selenium进行元素定位的全面指南
  • MATLAB神经网络---lstmLayer(LSTM 长短期记忆神经网络)
  • 遥遥领先,华为《仓颉编程语言白皮书》重磅来袭!!!
  • 不清楚数据治理路线图怎么制定?跟随这个思路即可
  • AI创作在论文写作中扮演什么角色?
  • Python有哪些就业方向?就业市场广阔!
  • C# —— 构造函数
  • 【Python高级编程】新手小白必须得学会的文本文件操作,资料资源均可分享!
  • mac苹果窗口辅助工具:Magnet for mac 2.14.0中文免激活版
  • 数据采集之二主一从,485总线共享器
  • Android SurfaceFlinger——注册监听调用流程(七)
  • Android系统模拟器绘制实现概述
  • CSS 专业技巧
  • JavaScript 基本功--面试宝典
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Node项目之评分系统(二)- 数据库设计
  • quasar-framework cnodejs社区
  • rabbitmq延迟消息示例
  • react 代码优化(一) ——事件处理
  • Sass 快速入门教程
  • 聚类分析——Kmeans
  • 浅谈web中前端模板引擎的使用
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 我的zsh配置, 2019最新方案
  • 小李飞刀:SQL题目刷起来!
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 云大使推广中的常见热门问题
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # centos7下FFmpeg环境部署记录
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (04)odoo视图操作
  • (1)Hilt的基本概念和使用
  • (pytorch进阶之路)扩散概率模型
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (力扣题库)跳跃游戏II(c++)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (算法二)滑动窗口
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)ABI是什么
  • (转)ObjectiveC 深浅拷贝学习
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .libPaths()设置包加载目录
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net后端程序发布到nignx上,通过nginx访问