Nginx Proxy反向代理

Nginx Proxy 反向代理

  • 1. 反向代理原理
  • 2. 正/反向代理的区别
    • 2.1. 正向代理
    • 2.2. 反向代理
  • 3. 知识扩展
    • 3.1. HTTP Server 和 Application Server的区别和联系
    • 3.2. 静态资源和动态资源的区别
  • 4. Nginx Proxy 配置
    • 4.1. 配置源站服务器
    • 4.2. 配置 Nginx 反向代理服务器
    • 4.3. Nginx proxy 具体配置详解

1. 反向代理原理

反向代理是一种网络架构,它通过将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端,实现了客户端和服务器之间的间接通信。与正向代理不同,正向代理是代理客户端,而反向代理是代理服务器。

以下是反向代理的基本原理:

  1. 客户端发起请求: 客户端向反向代理服务器发送请求,通常请求的是某个资源(例如网页、图片或API)。
  2. 反向代理接收请求: 反向代理服务器接收到客户端的请求。
  3. 决定路由和负载均衡: 反向代理根据配置和算法,决定将请求转发给哪个后端服务器。这通常涉及到负载均衡,以确保请求在多个后端服务器之间分布均匀,提高系统的性能和可靠性。
  4. 向后端服务器发送请求: 反向代理服务器将收到的客户端请求再次发送给后端服务器。客户端不直接与后端服务器通信,所有的通信都经过反向代理。
  5. 后端服务器处理请求: 后端服务器接收到请求后,执行相应的处理,可能是获取数据、执行业务逻辑等。
  6. 后端服务器返回响应: 后端服务器将处理结果生成响应,并将响应发送给反向代理服务器。
  7. 反向代理接收响应: 反向代理服务器接收到后端服务器的响应。
  8. 向客户端返回响应: 最终,反向代理服务器将后端服务器的响应返回给客户端。

反向代理的优点包括:

  • 负载均衡: 可以分配流量到多个后端服务器,避免单一服务器过载。
  • 安全性: 可以隐藏后端服务器的真实IP地址,提高安全性。
  • 性能优化: 可以通过缓存静态资源、压缩数据等方式提高性能。
  • 灵活性: 可以灵活地配置路由规则、SSL终端等功能。

2. 正/反向代理的区别

2.1. 正向代理

正向代理是一种代理服务器架构,它充当客户端与目标服务器之间的中介,代表客户端向目标服务器发起请求。以下是正向代理的基本原理:

  1. 客户端配置代理: 客户端需要配置使用正向代理服务器。通常,客户端的网络设置中会指定正向代理的地址和端口。
  2. 客户端发起请求: 客户端向正向代理服务器发送请求,请求的目标是目标服务器上的某个资源(例如网页、文件、API等)。
  3. 正向代理接收请求: 正向代理服务器接收到客户端的请求。
  4. 代理服务器向目标服务器发起请求: 正向代理服务器根据客户端的请求,向目标服务器发起相应的请求。
  5. 目标服务器处理请求: 目标服务器接收到正向代理服务器的请求后,执行相应的处理,可能是获取数据、执行业务逻辑等。
  6. 目标服务器返回响应: 目标服务器生成响应,并将响应发送给正向代理服务器。
  7. 正向代理接收响应: 正向代理服务器接收到目标服务器的响应。
  8. 代理服务器返回响应给客户端: 最终,正向代理服务器将目标服务器的响应返回给客户端。

正向代理的主要用途包括:

  • 访问控制: 可以根据策略控制哪些客户端可以访问目标服务器,实现访问权限的控制。
  • 内容过滤: 可以对传输的数据进行过滤,例如屏蔽特定网站或内容。
  • 访问隐藏: 可以隐藏客户端的真实IP地址,保护客户端的隐私。
  • 访问加速: 可以缓存已经请求过的资源,提高访问速度。

2.2. 反向代理

从反向代理的角度来看,正向代理和反向代理有着不同的工作方式和应用场景。

  1. 方向:
    • 正向代理: 正向代理是代理客户端的代理服务器,客户端通过正向代理来访问其他服务器的资源。
    • 反向代理: 反向代理是代理服务器的代理服务器,客户端通过反向代理来访问目标服务器的资源。
  2. 作用对象:
    • 正向代理: 代理的是客户端,帮助客户端访问其他服务器上的资源,客户端需要配置使用正向代理。
    • 反向代理: 代理的是服务器,客户端无需配置,直接访问反向代理,由反向代理决定将请求转发给哪个后端服务器。
  3. 配置位置:
    • 正向代理: 需要在客户端进行配置,告诉客户端通过正向代理访问网络资源。
    • 反向代理: 需要在服务器端进行配置,以确定如何将请求转发给后端服务器。
  4. 隐匿性:
    • 正向代理: 可以用于隐藏客户端的真实IP地址,保护客户端隐私。
    • 反向代理: 可以用于隐藏后端服务器的真实IP地址,提高服务器的安全性。
  5. 用途:
    • 正向代理: 常用于绕过防火墙访问受限资源、提高访问速度、访问控制等。
    • 反向代理: 常用于负载均衡、安全性增强、隐藏后端服务器、统一入口等。
  6. 举例:
    • 正向代理: 用户通过VPN访问国外网站,VPN服务器充当正向代理,代理用户访问外部资源。
    • 反向代理: 公司内部有多个Web服务器,反向代理服务器接收外部用户的请求并将其转发到内部的Web服务器上。

3. 知识扩展

3.1. HTTP Server 和 Application Server的区别和联系

HTTP Server(Web Server)和 Application Server(应用服务器)是构建现代 web 应用程序时常见的两个组件,它们分别负责处理不同的任务,但在实际应用中通常需要协同工作。

  1. HTTP Server(Web Server):
    • 任务: HTTP Server 主要负责处理 HTTP 请求和响应。它处理静态内容(如 HTML、CSS、JavaScript 文件)的传输,以及处理客户端发起的动态资源请求。
    • 特点: HTTP Server 非常高效地处理静态资源,通常采用多线程或多进程的方式并发地为多个客户端提供静态文件。
  2. Application Server(应用服务器):
    • 任务: Application Server 负责执行应用程序的业务逻辑,处理动态内容的生成和交互。它通常与数据库交互,执行业务逻辑,生成动态内容,并将结果返回给 HTTP Server。
    • 特点: Application Server 是处理动态内容和业务逻辑的专门组件,能够执行服务器端代码,如处理用户请求、查询数据库、生成动态页面等。
  3. 区别和联系:
    • 静态 vs. 动态内容: HTTP Server 主要处理静态内容,而 Application Server 处理动态内容。
    • 通信协议: HTTP Server 使用 HTTP 协议进行通信,而 Application Server 可以使用不同的协议,如 FastCGI、WSGI(Web Server Gateway Interface)等,与 HTTP Server 进行通信。
    • 并发处理: HTTP Server 通常采用多进程或多线程的方式处理并发请求,而 Application Server 更专注于处理业务逻辑,可以与 HTTP Server 配合以实现并发处理。
  4. 典型架构:
    • 两层架构: 在简单的应用中,HTTP Server 和 Application Server 可能合并在一起,由同一个服务器处理静态和动态内容。
    • 三层架构: 在更复杂的应用中,通常采用三层架构,其中 HTTP Server 负责静态资源和请求的初始处理,然后将动态请求转发给独立的 Application Server 进程。
      总的来说,HTTP Server 和 Application Server 是在 web 应用架构中各司其职的组件,通过协同工作,能够实现对静态和动态内容的有效处理,提供更全面的 web 服务。

3.2. 静态资源和动态资源的区别

静态资源和动态资源是在 web 开发中经常遇到的两种不同类型的内容,它们在处理和生成方式上有很大的区别。

  1. 静态资源:
    • 定义: 静态资源是指在服务器上保存的不会在请求过程中发生变化的文件,如 HTML、CSS、JavaScript、图片、字体等。
    • 生成: 这些文件在服务器上事先存在,并且在客户端请求时直接发送给客户端,不需要在服务器端进行额外的处理。
    • 特点: 静态资源不包含动态生成的内容,它们的内容在请求前已经确定,因此处理速度快,适合用于不经常变化的页面元素和文件。
  2. 动态资源:
    • 定义: 动态资源是指在服务器端在每次请求时动态生成的内容,通常涉及到服务器端的业务逻辑、数据库查询等操作。
    • 生成: 这类资源的内容不是事先准备好的文件,而是在服务器端根据请求的参数、用户信息等动态生成的。
    • 特点: 动态资源可以根据用户的请求动态地生成内容,适用于需要根据用户输入或其他条件生成不同内容的场景。
  3. 区别:
    • 存储方式: 静态资源事先存储在服务器上,而动态资源是在每次请求时生成的。
    • 处理速度: 静态资源处理速度较快,因为它们不需要在请求时进行额外的处理;动态资源的处理速度可能较慢,因为它们需要服务器端执行一些业务逻辑来生成内容。
    • 适用场景: 静态资源适用于不经常变化的内容,如页面的布局和样式;动态资源适用于需要根据用户请求或其他条件动态生成内容的情况,如个性化的用户数据、动态页面等。
      在实际的 web 应用中,通常会结合使用静态资源和动态资源,以达到更好的性能和用户体验。例如,静态资源用于提供页面的基本结构和样式,而动态资源用于根据用户的操作生成个性化的内容。

4. Nginx Proxy 配置

Nginx代理模块ngx_http_proxy_module
环境:两台nginx服务器,安装方式可以一样也可以不一样,自己实验时建议一样

4.1. 配置源站服务器

//nginx-1 ip:192.168.17.129
//自定义nginx访问的欢迎页面(yum安装的nginx)
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# cp index.html{,.bak}
[root@localhost html]# echo >  index.html
[root@localhost html]# vim index.html
<!DOCTYPE html>
<html>
<head>
<title>欢迎来到我的网站</title>
<style>
/* 在这里添加您的CSS样式 */
</style>
</head>
<body>
<header>
<h1>欢迎来到我的网站</h1>
<nav>
<ul>
<li><a href="#">主页</a></li>
<li><a href="#">关于</a></li>
<li><a href="#">联系方式</a></li>
</ul>
</nav>
</header>
<main>
<p>在这里添加您的主要内容...</p>
</main>
<footer>
<p>版权所有 © 2023 My Website</p>
</footer>
</body>
</html>//修改nginx默认的nginx子配置文件,添加一行字符集配置(主要是为了访问时不会发生乱码的问题,如果不加,页面中有中文字体,会出现乱码的现象)
[root@localhost html]# vim  /etc/nginx/conf.d/default.conf
server {listen       80;server_name  localhost;charset utf-8;      #这一行是新增的,设置字符集为utf-8万国码
​#access_log  /var/log/nginx/host.access.log  main;
​location / {root   /usr/share/nginx/html;index  index.html index.htm;}
[root@localhost html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost html]# systemctl restart nginx

访问nginx,保证源站(后端服务器)自己访问没问题

4.2. 配置 Nginx 反向代理服务器

//nginx-2 ip:192.168.17.128
//配置nginx的yum源直接yum安装
//启动
//编辑nginx的配置文件:
[root@localhost ~]# cd /etc/nginx/conf.d/
[root@localhost conf.d]# ls
default.conf
[root@localhost conf.d]# cp default.conf  proxy.conf
//将文件中所有注释的行删除
[root@localhost conf.d]# sed -ri '/^.*#/d' proxy.conf
[root@localhost conf.d]# vim proxy.conf
server {listen       80;server_name  www.testabc.com;access_log  /var/log/nginx/proxy_access.log  main;location / {proxy_pass http://192.168.17.129:80;proxy_redirect default;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_connect_timeout 30;proxy_send_timeout 60;proxy_read_timeout 60;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}//重启nginx
[root@localhost conf.d]# systemctl restart nginx
​
//修改本地解析hosts解析
win + r
输入地址:C:\Windows\System32\drivers\etc\hosts
在最底下添加一行:
192.168.17.128  www.testabc.com

​使用浏览器访问域名
注意:如果开了VPN的一定要将它关掉,不然浏览器访问不到的!
访问正常!反向代理成功!

4.3. Nginx proxy 具体配置详解

proxy_pass;:转发到真实后端服务器的地址,可以是ip,也可以是域名和url地址
proxy_redirect;:如果真实服务器使用的是的真实IP:非默认端口。则改成IP:默认端口
proxy_set_header;:重新定义或者添加发往后端服务器的请求头
proxy_set_header Host $http_host;:重新定义发往后端服务器的请求
proxy_set_header X-Real-IP $remote_addr;:只记录连接服务器的上一个ip地址信息。(在后端服务器中记录客户端访问时真实的ip地址)

proxy_set_header X-Real-IP $remote_addr;
这个配置指令的作用是在将请求转发到上游服务器时,重新定义或添加一个名为 X-Real-IP 的请求头,并将其值设置为客户端的真实IP地址。
在一些情况下,Nginx 作为反向代理服务器,会将客户端的请求转发给上游服务器。但是,上游服务器可能只能获取到 Nginx 服务器的 IP 地址,而无法获取到客户端的真实 IP 地址。通过使用 proxy_set_header 指令,可以将客户端的真实 IP 地址传递给上游服务器,以便服务器能够获取到客户端的真实 IP 信息。
具体来说,$remote_addr 是 Nginx 内置变量,它表示客户端的 IP 地址。通过将 $remote_addr 的值赋给 X-Real-IP 请求头,上游服务器就能够读取到这个请求头,并获取到客户端的真实 IP 地址。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; :通过这个选项可以记录真正客户端机器的ip地址

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这个配置指令的作用是在将请求转发到上游服务器时,重新定义或添加一个名为 X-Forwarded-For 的请求头,并将其值设置为客户端的真实 IP 地址。
在一些代理场景下,Nginx 作为反向代理服务器,会将客户端的请求转发给上游服务器。然而,上游服务器可能需要知道请求经过的【所有代理服务器】的 IP 地址,而不仅仅是 Nginx 服务器的 IP 地址。
X-Forwarded-For 请求头是一种常用的标准请求头,用于记录请求经过的代理服务器的 IP 地址。通过使用 proxy_set_header 指令,可以将客户端的真实 IP 地址添加到 X-Forwarded-For 请求头中,并将其传递给上游服务器。
$proxy_add_x_forwarded_for 是 Nginx 内置变量,它用于获取请求头中已经存在的 X-Forwarded-For 的值,并将客户端的真实 IP 地址追加到该值的末尾,以形成一个包含所有代理服务器 IP 地址的列表。
#这样做的好处是,上游服务器可以通过读取 X-Forwarded-For 请求头,获取到请求经过的所有代理服务器的 IP 地址列表,从而了解请求的真实来源路径。这对于一些安全性、日志记录和统计分析等方面都非常有用。

proxy_connect_timeout;:后端服务器连接的超时时间发起三次握手等候响应超时时间
proxy_send_timeout;:设置代理服务器向后端服务器发送数据的超时时间,单位为秒。
proxy_read_timeout:设置代理服务器从后端服务器读取数据的超时时间,单位为秒。

  • 注意:proxy_pass http:// 填写nginx-1服务器的地址。
    • 使用PC客户端访问nginx-2服务器地址
    • 浏览器中输入http://www.testabc.com/
    • 成功访问nginx-1服务器页面
//观察nginx-1服务器的日志
[root@localhost conf.d]# tailf /var/log/nginx/proxy_access.log 
192.168.17.1 - - [26/Jul/2023:11:06:49 +0800] "GET / HTTP/1.1" 200 451 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
192.168.17.1 - - [26/Jul/2023:11:06:49 +0800] "GET / HTTP/1.1" 200 451 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
192.168.17.1 - - [26/Jul/2023:11:06:49 +0800] "GET /favicon.ico HTTP/1.1" 404 153 "http://www.testabc.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序打包发行流程

工具 HBuilder X 、微信开发者工具、微信公众平台地址&#xff08;微信公众平台&#xff09; 配置 一、manifest.json 配置 通过 HBuilder X 打开 manifest.json 文件&#xff0c;找到 微信小程序配置&#xff0c;填写 微信小程序AppID&#xff0c;此 AppID 必须是本人有权…

Jvm相关知识(面试高级必备)

类的实例化顺序 先静态、先父后子 先静态&#xff1a;父静态>子静态 优先级&#xff1a;父类>子类 静态代码块>非静态代码块>构造函数 一个类的实例化过程&#xff1a; ①&#xff0e;父类的static代码块&#xff0c;当前类的static; ②&#xff0e;顺序执行…

freeswitch on centos dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 centos7 docker上编译安装fs的流程记录&#xff0c;本文使用dockerfile模式。 环境 docker engine&#xff1a;Version 24.0.6 centos docker&#xff1a;7 freeswitch&#xff1a;v1.6.20 dockerfile 创建空目录…

力扣电话号码的组合

文章目录 题目说明做题思路代码实现代码解析 题目链接 题目说明 首先我们先分析一下这个题目题目中说呢先给出一个字符串这个字符串其实就是这个九键数字我们要按照要求将数字所代表的字符进行自由组合形成一个字符串并且这个字符串的长度和输入的数字字符串长度相同&#xff0…

DAY25:回溯算法组合题216、17

Leetcode: 216 组合总和III 经过了昨天组合的题目的学习&#xff0c;这道题比较简单&#xff0c;套用之前的模板就可以 基本思路 终止条件&#xff0c;遇到向量的个数一样&#xff0c;并且sum等于n的时候终止。输入变量&#xff0c;n,k&#xff0c;还有起始的idx和基于当前元…

2024.1.19

今天狠狠地复习了一下C语言&#xff0c;不复习不知道&#xff0c;一复习吓一跳昂&#xff0c;这感觉好多都忘却了&#xff0c;这并非一件好事&#xff0c;所以说还好复习了&#xff0c;不然考试就有点问题了&#xff0c;但是还好写一下这些代码就马上想起来了&#xff0c;所以说…

如何快速申请GPT账号?

详情点击链接&#xff1a;如何快速申请GPT账号&#xff1f;​​​​​​​ 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude…

search——Bloom Filter

详情&#xff0c;看这一篇博客 package mainimport ("fmt""math""strconv" )type BloomFilter struct {*bitMapk uint64 // hash function countm uint64 // bits array lengthn uint64 // insert n numberp float64 //…

递归组件怎么实现无线滚动

递归组件实现无限滚动的方法通常涉及到对数据的递归处理和组件的自我调用。以下是一个简单的示例&#xff0c;展示如何使用递归组件实现无限滚动&#xff1a; 首先&#xff0c;定义一个递归组件&#xff0c;该组件可以调用自己来渲染下一组数据。假设我们要展示一个滚动列表&a…

什么是vue的sync语法糖如何使用

Vue的sync语法糖是用于实现子组件修改父组件数据的双向绑定。在Vue中&#xff0c;默认是单向数据流&#xff0c;子组件不能直接修改父组件的数据。但是有些情况下&#xff0c;我们需要子组件能够修改父组件的数据&#xff0c;这时就可以使用sync语法糖。 使用sync语法糖的步骤…

第11章 GUI Page500~504 步骤三十二:打开画板文件02

各个图元类新增GetTypeName_Static()&#xff0c;并将原来的GetTypeName()改为调用静态方法实现&#xff1a; 直线&#xff1a; 圆&#xff1a; 十字&#xff1a; 矩形&#xff1a; 文字&#xff1a; tool_4_save_load.hpp添加两行 tool_4_save_load.cpp增加&#xff1a; 增加…

网络安全产品之认识入侵检测系统

随着计算机网络技术的快速发展和网络攻击的不断增多&#xff0c;单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要&#xff0c;网络的防卫必须采用一种纵深的、多样的手段。因此&#xff0c;入侵检测系统作为新一代安全保障技术&#xff0c;成为了传统安全防护措施的必…

【资治通鉴】古代纪年法 ( 天干地支纪年法 | 木星纪年法 | 太岁纪年法 | 星次 | 天球 | 黄道带 | 四象二十八星宿 )

文章目录 一、天干地支纪年法二、木星纪年法1、星次2、天球3、黄道带 三、太岁纪年法四、四象二十八星宿1、四象与二十八星宿关联2、二十八星宿与星次关联3、西游记中的二十八星宿 2024 年 使用 天干地支纪年法是 甲辰年 , 使用 太岁纪年法是 阏逢执徐 ; 一、天干地支纪年法 天…

c 宏转字符串与拼接

C 用宏可以转字符串与拼接字符。 举例 #include <stdio.h> #define CON(a) (B##a) //concatenate #define STR

vim常见命令

目录 快捷键 常用命令 快捷键 i 切换插入模式 esc 退出插入模式 p 粘贴 常用命令 命令作用:q退出 vim 编辑器:q!不保存文件&#xff0c;直接退出 vim 编辑器:w只保存文件&#xff0c;但不退出 vim 编辑器:wq保存文件且退出 vim 编辑器ZZ保存文件且退出 vim 编辑器:start,…

建筑能源管理系统

建筑能源管理系统是一种集成了先进的监测、控制、分析和优化技术的智能化系统&#xff0c;旨在提高建筑能源效率&#xff0c;降低能源消耗&#xff0c;减少环境污染&#xff0c;并为用户提供舒适、安全的建筑环境。通过监测建筑内的各种能源消耗情况&#xff0c;如电力、热水、…

arthas(阿尔萨斯)日常java代码调优使用命令

官方项目文档&#xff1a;https://gitee.com/arthas/arthas &#xff08;最权威的教学还是得官网&#xff0c;这里仅作简单记录&#xff09; 1&#xff1a;启动 java -jar arthas-boot.jar 2&#xff1a;查看cpu占用排名前三 thread -3 3&#xff1a;查看指定id thread 203 4:查…

数据结构day1

1.思维导图 2.定义一个简单宏或宏函数&#xff0c;实现两个数交换。 3.定义字符类型指针&#xff0c;指针指向n个连续堆区内存&#xff0c;输入&#xff0c;计算字符串长度 定义函数&#xff0c;实现内存申请 定义函数&#xff0c;解释字符串长度 定义函数&#xff0c;释放内…

ACEeditor使用手册(一)

文章目录 ACEeditor使用手册引言简介ACEeditorACEeditor的应用场景为什么选择ACEeditor 1. ACEeditor基础1.1 安装与配置通过CDN引入使用npm/yarn安装配置基本选项 1.2 创建一个简单的编辑器在HTML中创建容器元素初始化ACEeditor实例 1.3 主题与样式内置主题列表自定义主题样式…

河南文旅火爆出圈,来了解小魔推短视频矩阵的魅力!

最近几天四川文旅的抖音账号&#xff0c;1天发视频六十多条&#xff0c;增长粉丝20w&#xff0c;另外河北文旅抖音账号&#xff0c;一天发视频七十多条&#xff0c;增长粉丝30w&#xff0c;更有河南文旅抖音账号&#xff0c;单日发布上百条视频&#xff0c;实现涨粉15w&#xf…