打造高可用、高效的Nginx反向代理应用 - 实战篇

news2024/9/25 11:12:41

前言

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

如果想要了解正向及反向代理的概念可以沐风晓月博客: https://blog.csdn.net/wisdom_futrue/article/details/129710416

文章目录

    • 前言
    • 一. 代理的概念
    • 1.1 正向代理图示
    • 1.2 反向代理图示
    • 1.3 反向代理优势
    • 二、实验环境准备
    • 三、反向代理实验
      • 3.1 反向代理实验一
      • 3.2 反向代理实验二
    • 四、拓展小知识

一. 代理的概念

1.1 正向代理图示

正向代理原理如图所示:

1.2 反向代理图示

1.3 反向代理优势

重点总结一下反向代理的优势:

一、负载均衡:代理服务器可以将用户访问请求,根据多种负载算法分发到后端目标服务器上处理,减轻单台服务器过载,同时消除单点故障。反向代理还可以将传入的请求同时定向到多台服务器,每台服务器执行特定优化功能,反向代理收集所有服务器响应以后汇总传递给用户。

二、安全增强:代理服务器可以隐藏目标服务器的ip地址等信息,目标服务器更好保持匿名性,由于所有用户访问会先打在代理服务器上,因此任何攻击者都会发现较难通过DDoS攻击等方式直接威胁目标服务器。通常很多公司会在整个局域网的对外防火墙上设置代理服务器,以严格的安全措施抵御常见的网络攻击。

三、缓存数据:代理服务器对目标服务器图片、文字等资源进行缓存,避免目标服务器重复处理相同的访问请求,起到提高客户端访问速度、节省宝贵的服务资源和时间的作用。当用户首次访问,代理服务器收到用户访问请求后,首先检查自己缓存数据,如果有客户端需要的数据,直接将数据从内存或者硬盘中取出直接传递给客户端,如果没有再访问目标服务器获取。

二、实验环境准备

本次实验我们使用VMWARE搭建三台虚拟主机,使用NAT模式访问外网,具体配置信息如下表所示:

主机名称IP地址功能版本
mufeng41192.168.1.41Nginx服务器1.22
mufeng42192.168.1.42Tomcat服务器9.0
mufeng43192.168.1.43Tomcat服务器9.0

三台主机默认使用root用户,按照表中的主机名、IP地址进行设置、配置域名解析、关闭防火墙、关闭selinux、确保局域网的虚拟主机之间正常通信,虚拟主机与宿主机windows之间正常通信,下面以mufeng41为例进行演示:

由于本次实验需要从宿主机windows的谷歌浏览器进行访问验证,因此宿主机需要在hosts文件中添加Nginx服务器域名解析:

C:\Windows\System32\drivers\etc\hosts

我们简单回忆一下Nginx配置文件5个组成部分的关系:

  • main部分设置会影响其他所有设置
  • events部分指定Nginx的工作模式和连接数的上限
  • http部分嵌套多个server,主要用来配置代理、缓存、自定义日志格式等功能及第三方模块的配置
  • server部分用于配置虚拟主机相关参数
  • location部分用于配置请求的处理规则及各种页面匹配处理情况。

简单一句话总结,五者之间关系是:main与events平级,一个http中可以有多个server,server继承main,location继承server,如下图所示:

假设已经在mufeng41安装Nginx,在mufeng42和mufeng43安装了Tomcat服务,并且进行了必要的参数设置。

关于安装nginx服务器可以参考沐风晓月文章:
https://blog.csdn.net/wisdom_futrue/article/details/129334966
https://blog.csdn.net/wisdom_futrue/article/details/129701431

关于安装tomcat服务器可以参考沐风晓月文章:
https://blog.csdn.net/wisdom_futrue/article/details/129126308

三、反向代理实验

Nginx是实现反向代理功能的是定义在http模块中的proxy_pass模块,默认安装nginx时已经安装了该模块,本次我们由浅入深,准备两个实验,一个简单反向代理演示和一个增加负载均衡功能的反向代理实现。

3.1 反向代理实验一

实验目的:当用户访问www.mufeng.net的80端口时候,所有访问请求全部转发到后端服务器192.168.1.42的8080端口上,nginx.conf文件主要设置参数如下所示:

http{
server {
#指定监听端口
        listen       80;    
#指定代理服务访问域名
        server_name  www.mufeng.net;
#指定资源匹配规则
        location / {
           proxy_redirect off;
           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_connect_timeout 90;
           proxy_send_timeout 90;
           proxy_read_timeout 90;
           proxy_buffer_size  4k;
           proxy_buffers 4 32k;
           proxy_busy_buffers_size 64k;
           proxy_temp_file_write_size 64k;
           proxy_pass  http://192.168.1.42:8080;
           root   html;
           index  index.xzhtml index.htm;
        }
}

常用反向代理参数设置详解:

  • proxy_redirect off:当上游服务器返回的响应是重定向或者刷新请求时,可以重设HTTP头部的location或者refresh字段,一般选择关闭这个功能。

  • proxy_set_header:设置由后端目标服务器获取用户的主机名、真实IP地址、以及代理者的真实IP地址。

  • proxy_connect_timeout:表示与后端目标服务器的连接超时时间,发起握手等候响应的超时时间。

  • proxy_send_timeout:表示后端目标服务器的数据回传时间,在规定时间内后端服务器必须传完所有数据,否则Nginx会断开连接。

  • proxy_read_timeout: 设置Nginx服务器从后端目标服务器获取信息的时间,连接建立后等待后端服务器的响应时间,即Nginx进入后端排队等待处理的时间。

  • proxy_buffer_size:缓冲区大小。

  • proxy_buffers:设置缓冲区数量和大小,Nginx从后端目标服务器获取的响应信放置到缓冲区。

  • proxy_busy_buffers_size:设置系统繁忙时可以使用的proxy_buffers大小,一般建议为proxy_buffers的2倍。

  • Proxy_temp_file_write_size:指定缓存临时文件的大小。

  • 启动mufeng41上的nginx服务(默认80端口),启动mufeng42上的tomcat服务(默认8080端口):

#启动nginx服务
[root@mufeng41 ~]# systemctl start nginx
#检查nginx服务是否监听80端口

[root@mufeng41 ~]# lsof -i:80
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1007  root    6u  IPv4  30162      0t0  TCP *:http (LISTEN)
nginx   1009 nginx    6u  IPv4  30162      0t0  TCP *:http (LISTEN)
nginx   1010 nginx    6u  IPv4  30162      0t0  TCP *:http (LISTEN)

#启动tomcat服务

[root@mufeng42 bin]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.

#检查tomcat服务是否监听8080端口
[root@mufeng42 bin]# lsof -i:8080
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2633 root   56u  IPv6  39217      0t0  TCP *:webcache (LISTEN)

当我们在windows浏览器输入www.mufeng.net时候,自动跳转访问了mufeng42上的tomcat服务,显示tomcat默认欢迎页面,说明nginx实现了单点反向代理功能,实验成功,如图所示:

3.2 反向代理实验二

在这个场景中,我们针对后端tomcat服务器集群,在nginx服务器加入常见负载均衡功能,这个也是企业生产环境常见应用场景,下面是http模块设置的主要参数:

#指定负载均衡模块参数
upstream mufengserver {
server    192.168.1.42:8080    weight=4  max_fails=3 fail_timeout=30s;
server    192.168.1.43:8080     weight=6  max_fails=3 fail_timeout=30s;
}
#指定监听端口、域名、IP地址

server {
        listen       80;
        server_name  www.mufeng.net 192.168.1.41;
#定义路由匹配模块
        location / {
           proxy_pass  http://mufengserver;
           proxy_next_upstream  http_500 http_502 http_503 error timeout invalid_header;
           include  /usr/local/nginx/conf/proxy.conf       
        }
}

详细解读上述主要参数含义:

  • weight:设置负载均衡权重,此处设置mufeng42和mufeng43的负载权重为4:6。

  • max_fails=3 fail_timeout=30s:这个配置表示只要30s内出现了3次错误,那么该服务就会被摘除30s。

  • proxy_pass:定义负载调度功能,通常设置一个负载均衡名称。

  • proxy_next_upstream:用来定义故障转移策略,如果某个后端服务节点返回500、502、504、504或者执行超时等错误时,nginx会自动将请求转发到upstream负载均衡组中的一台服务器,实现故障转移功能。

  • proxy.conf文件:将实验一中的proxy_redirect、proxy_set_header、proxy_connect_timeout、proxy_buffers等反向代理专用设置参数保存到这个文件,可以使用include进行引用文件。

为了看到明显效果,我们在mufeng42和mufeng43主机的特定目录test里面分别创建不同的静态网页用于实验验证:

[root@mufeng42 ~]# cat /usr/local/tomcat/webapps/test/index.jsp 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>mufeng42 page</title>
</head>
<body>
<% out.println("跟着沐风晓月,实战Nginx反向代理,服务器名mufeng42,地址为192.168.1.42");%>
</body>
</html>
[root@mufeng43 ~]# cat /usr/local/tomcat/webapps/test/index.jsp 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>mufeng43 page</title>
</head>
<body>
<% out.println("跟着沐风晓月,实战Nginx反向代理,服务器名mufeng43,地址为192.168.1.43");%>
</body>
</html>

在mufeng42和mufeng43服务器tomcat默认配置文件server.xml中增加Context标签参数,用于tomcat指向默认页面,如下所示:

参考实验一,使用nginx -s reload平滑重启nginx服务,使用tomcat自带脚本startup.sh重启mufeng42和mufeng43上的tomcat服务。

当我们在windows宿主机浏览器输入www.mufeng.net时,nginx会根据设置好的权重策略,所有访问请求会转向mufeng42和mufeng43主机的8080端口(刷新10次浏览器页面,大致会得到mufeng42响应4次,得到mufeng43响应6次,交替出现),实验成功,如下所示:

四、拓展小知识

NAT与proxy都能实现代理局域网用户访问外部网站,二者之间主要有哪些区别?

NAT服务器:主要通过数据包过滤的方式,使用iptables的nat表进行IP伪装(SNAT),客户端可以主动访问Internet任何地方,主要运作在OSI七层协议的二、三、四层,由于是通过数据包过滤和伪装,客户端可以使用的端口号码(第四层)范围弹性较大。NAT服务器通过较底层网络分析工作。

Proxy服务器:主要通过系统服务程序提供网络代理功能,因此Proxy能够进行某些工作,与该服务程序功能有关,比如Proxy服务器没有提供邮件、FTP功能,客户端无法通过Proxy取得这些网络资源,主要工作在OSI七层协议的应用层部分。Proxy服务器通过daemon功能实现用户需求。

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

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

相关文章

快排代码原理实现

参考博客&#xff1a;快速排序算法详解&#xff08;原理、实现和时间复杂度&#xff09; 排序算法的思想非常简单&#xff0c;在待排序的数列中&#xff0c;我们首先要找一个数字作为基准数&#xff08;这只是个专用名词&#xff09;。为了方便&#xff0c;我们一般选择第 1 个…

Java每日一练(20230504)

目录 1. 位1的个数 &#x1f31f; 2. 移除元素 &#x1f31f; 3. 验证二叉搜索树 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 位1的个数 编写一个…

推荐一个免费GIF动图下载的网站

在开发过程中难免遇到耗时操作,耗时操作往往导致线程阻塞,通常这种情况可以采用开线程的方式解决,即将耗时操作放入新线程中,同时在UI线程中加一个GIF动图即可。可作为后端开发工程师来讲单独设计一个GIF图实在是意义不大(懒+不会)。 好在现在发现了这个GIF免费下载的网站…

存储器(二)

目录 一、RAM 1.RAM特点 2.静态RAM 2.1静态RAM保存原理 2.2静态RAM基本单元电路的构成 2.3静态RAM读写操作 3.动态RAM 3.1动态RAM保存原理 3.2动态RAM基本单元电路的构成 3.3动态RAM对单元电路的读写操作 3.4动态RAM的刷新 4.静态RAM与动态RAM的比较 二、ROM 1.ROM…

WinForm对话框详解:信息框、文件对话框、功能对话框

文章目录 信息框文件对话框功能对话框 对话框是开发中经常用到的控件&#xff0c;甚至在上古的MFC编程中&#xff0c;默认就是把一个对话框编辑成窗口。winForm提供了多种不同的对话框&#xff0c;包括信息框、文件对话框、功能对话框等&#xff0c;下面逐个演示这些消息框。 …

欧姆龙PLC仿真环境搭建及通信测试

前言 欧姆龙PLC是工控领域市场率较高的品牌之一&#xff0c;有低端CP/CH系列&#xff0c;中端CJ系列&#xff0c;高端NX/NJ系列。对于上位机开发来说&#xff0c;主要的协议有Hostlink协议、FinsTCP/UDP协议、EtherNetIP协议&#xff0c;今天主要跟大家分享一下&#xff0c;我…

《互联网安全产品漏洞管理规定》

《网络产品安全漏洞管理规定》由工业和信息化部、国家互联网信息办公室、公安部联合印发&#xff0c;自2021年9月1日起施行。 该《规定》明确&#xff0c;任何组织或者个人不得利用网络产品安全漏洞从事危害网络安全的活动&#xff0c;不得非法收集、出售、发布网络产品安全漏洞…

图片png怎么转成pdf格式?

图片png怎么转成pdf格式&#xff1f;相信很多上班的小伙伴们都会遇到类似的问题&#xff0c;需要将公司的图片宣传册等资料发送给客户&#xff0c;但是公司宣传册本身是一页一页的图片文件&#xff0c;如果这样发送了就显得很不专业或者说比较杂乱&#xff01;所以&#xff0c;…

scrapy 爬虫中间件的学习

Scrapy中间件是一个处理Scrapy请求和响应的机制。中间件可以在请求或响应被Scrapy引擎处理之前或之后对其进行修改或操作&#xff0c;用于实现诸如缓存、代理、用户代理等功能。 Scrapy中间件的作用主要有以下几个方面&#xff1a; 1、对请求的处理&#xff1a;可以在请求被S…

【Spark练习】RDD分区操作

练习1&#xff1a;行动&#xff08;Action&#xff09;操作算子方法 任务1: reduce // 1. 数组 val x sc.parallelize(List(1,2,3,4)) val y x.reduce( (a,b) > a b) // 2. 列表 val rdd sc.parallelize(List(1,2,3,4)) // 求和,将各个数累加,依次合并 下面两种方式相…

读书笔记// 《数据产品经理》

书名&#xff1a;写给数据产品经理新人的工作笔记 出版时间&#xff1a;2020年10月 本书以数据产品经理角色的定位和合作关系为切入点&#xff0c;站在整个数据体系的视角&#xff0c;从工作流程的角度剖析数据需求沟通和判断的过程、指标体系搭建的过程&#xff0c;同时介绍了…

Swift 中的 async/await ——代码实例详解

前言 async-await 是在 WWDC 2021 期间的 Swift 5.5 中的结构化并发变化的一部分。Swift 中的并发性意味着允许多段代码同时运行。这是一个非常简化的描述&#xff0c;但它应该让你知道 Swift 中的并发性对你的应用程序的性能是多么重要。有了新的 async 方法和 await 语句&am…

《人工智能概论》课程重点总结

目录 遗传算法相关参数问题 种群规模、迭代次数、交叉率、变异率对算法的影响 A*算法中open表和close表的作用 为什么A*算法中open表是增长的 启发式函数h(n)取值的影响 A*算法可以找到最优解的条件 模式识别系统的组成 有监督学习和无监督学习的区别 模型评估三大原则…

Baklib推荐:关于建设企业知识管理的有效方法

随着信息化和互联网技术的不断发展&#xff0c;企业面临着海量的信息和知识&#xff0c;如何有效地管理和利用这些信息和知识已经成为了企业发展的关键问题之一。企业知识管理是指企业利用信息技术手段&#xff0c;对企业内部的知识进行系统化、集成化、共享化管理&#xff0c;…

MPSOC(ZU9EG/ZU15EG)PCIE架构高性能数据预处理 FMC载板设计资料

板卡概述 PCIE707 是一款基于 PCIE 总线架构的高性能数据预处理 FMC载板&#xff0c;板卡具有 1 个 FMC&#xff08;HPC&#xff09;接口&#xff0c;1 路 PCIe x4 主机接口、 1 个 RJ45 千兆以太网口、2 个 QSFP 40G 光纤接口。板卡采用 Xilinx 的高性能 UltraScale MPSOC 系…

「蓝桥杯」积木大赛

积木大赛 题目描述 春春幼儿园举办了一年一度的"积木大赛"。今年比赛的内容是搭建一座宽度为 n 的大厦&#xff0c;大厦可以看成由 n 块宽度为 1 的积木组成&#xff0c;第 i 块积木的最终高度需要是 h_i 。 在搭建开始之前&#xff0c;没有任何积木&#xff08;可…

Vue3中双向数据绑定与Pinia实践+JS数据引用的循环修改问题

Vue3 Pinia VUE3虽然出了很久了&#xff0c;但是很少深入研究&#xff0c;目前项目上遇到了一些问题&#xff0c;所以做个Note解决一下疑问&#xff1a; v-bind/v-model怎么与Pinia进行结合Object/Array数据大量处理时&#xff0c;为何有的修改不生效组合API与选项API选择 (…

赛道冠军为AI狂飙:实在智能即将重归福州,亮相第六届数字中国建设峰会

2023年4月26日至30日&#xff0c;第六届数字中国建设峰会将在福建省福州市举行。本届峰会以“加快数字中国建设&#xff0c;推进中国式现代化”为主题&#xff0c;由国家网信办、国家发展改革委、科技部、工业和信息化部、国务院国资委、福建省人民政府共同主办。 作为我国信息…

代码随想录算法训练营第二十五、二十七天 | 细节很多、树枝去重和树层去重的区分是难点、分割

216.组合总和III 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 状态&#xff1a;能做出来。和上一题没什么区别。思路直接…

SpringCloud微服务的熔断、限流、降级是怎么回事?

概述&#xff1a; 在开发公司商城项目时&#xff0c;由于采用的是微服务架构&#xff0c;每个模块之间使用OpenFeign组件进行通信&#xff0c;在遇到高并发时&#xff0c;为了保证系统的可用性和 可靠性&#xff0c;我们使用了阿里的Alibaba的Sentinel组件进行降级、限流和熔断…