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

news/2024/10/18 2:31:21/

前言

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是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.ppmy.cn/news/572998.html

相关文章

【转载】非常详细的nginx反向代理参数配置

nginx反向代理配置详解 转载于&#xff1a;http://blog.51cto.com/meiling/1978482 侵删 反向代理配置 修改部署目录下conf子目录的nginx.conf文件&#xff08;如/opt/nginx/conf/nginx.conf&#xff09;内容&#xff0c;可调整相关配置。 反向代理配置示例&#xff1a; 1 2…

高可用nginx反向代理

高可用nginx反向代理 文章目录 高可用nginx反向代理[toc]nginx反向代理简介代理服务器的作用nginx的作用 nginx反向代理的配置访问测试 高可用nginx反向代理访问测试 高可用自动化转换主备节点测试访问 nginx反向代理简介 代理服务器是位于客户端和原始服务器的一台中间服务器…

一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(二)进一步优化,公差分析

前文的补充说明 有光学设计师的朋友&#xff0c;跟我说把那个程序抄完后运行&#xff0c;什么也得不到。 这是因为缺乏一个文件名字叫做“zoomlensdata.txt" 他的内容就是上一篇的那份代码之后的第七到第十二行的内容。 然后我对这个程序进行了注释&#xff1a; def st…

西门子1500的DB数据块

首先了解DB数据块的含义&#xff0c;然后举个简单例子&#xff0c;加以分析。 1.首先我建立了DB数据块&#xff0c;DB数据块分为绝对寻址与间接寻址 根据DB数据块的属性可以进行切换&#xff0c;如下图 若没有选择优化块的访问就是绝对寻址&#xff0c;若选择了优化块的访问&a…

解决错误1500:当访问注册表项...\TrapConfiguration 时,SNMP 服务遇到错误

事件ID&#xff1a; 1500 事件描述&#xff1a; 当访问注册表项 SYSTEM\CurrentControlSet\Services\SNMP\Parameters\TrapConfiguration 时&#xff0c;SNMP 服务遇到错误。 解决方法&#xff1a; 参考https://support.microsoft.com/en-us/help/2002303/event-1500-logged-wh…

SIEMENS S7-1500 博途V16

文章目录 环境博途V16 安装硬件组态连接设备 环境 硬件&#xff1a; 按键设置IP地址&#xff0c;若提示IP设置写保护&#xff0c;可能是由于plc处于运行状态&#xff0c;将其停止后再进行设置即可。 软件&#xff1a; win10 博途V16 安装 参考&#xff1a;链接 注意一定要…

1500 - 数组挑战-扫雷

扫雷游戏是一款十分经典的单机小游戏。它的精髓在于&#xff0c;通过已翻开格子所提示的周围格地雷数&#xff0c;来判断未翻开格子里是否是地雷。 现在给出 &#xfffd;n 行 &#xfffd;m 列的雷区中的地雷分布&#xff0c;要求计算出每个非地雷格的周围格地雷数。 注&…