个人主页:我是沐风晓月
个人简介:大家好,我是沐风晓月,阿里云社区博客专家
座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步
欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信
如果想要了解正向及反向代理的概念可以沐风晓月博客: https://blog.csdn.net/wisdom_futrue/article/details/129710416
重点总结一下反向代理的优势:
一、负载均衡:代理服务器可以将用户访问请求,根据多种负载算法分发到后端目标服务器上处理,减轻单台服务器过载,同时消除单点故障。反向代理还可以将传入的请求同时定向到多台服务器,每台服务器执行特定优化功能,反向代理收集所有服务器响应以后汇总传递给用户。
二、安全增强:代理服务器可以隐藏目标服务器的ip地址等信息,目标服务器更好保持匿名性,由于所有用户访问会先打在代理服务器上,因此任何攻击者都会发现较难通过DDoS攻击等方式直接威胁目标服务器。通常很多公司会在整个局域网的对外防火墙上设置代理服务器,以严格的安全措施抵御常见的网络攻击。
三、缓存数据:代理服务器对目标服务器图片、文字等资源进行缓存,避免目标服务器重复处理相同的访问请求,起到提高客户端访问速度、节省宝贵的服务资源和时间的作用。当用户首次访问,代理服务器收到用户访问请求后,首先检查自己缓存数据,如果有客户端需要的数据,直接将数据从内存或者硬盘中取出直接传递给客户端,如果没有再访问目标服务器获取。
本次实验我们使用VMWARE搭建三台虚拟主机,使用NAT模式访问外网,具体配置信息如下表所示:
主机名称 | IP地址 | 功能 | 版本 |
---|---|---|---|
mufeng41 | 192.168.1.41 | Nginx服务器 | 1.22 |
mufeng42 | 192.168.1.42 | Tomcat服务器 | 9.0 |
mufeng43 | 192.168.1.43 | Tomcat服务器 | 9.0 |
三台主机默认使用root用户,按照表中的主机名、IP地址进行设置、配置域名解析、关闭防火墙、关闭selinux、确保局域网的虚拟主机之间正常通信,虚拟主机与宿主机windows之间正常通信,下面以mufeng41为例进行演示:
由于本次实验需要从宿主机windows的谷歌浏览器进行访问验证,因此宿主机需要在hosts文件中添加Nginx服务器域名解析:
C:\Windows\System32\drivers\etc\hosts
我们简单回忆一下Nginx配置文件5个组成部分的关系:
简单一句话总结,五者之间关系是: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时已经安装了该模块,本次我们由浅入深,准备两个实验,一个简单反向代理演示和一个增加负载均衡功能的反向代理实现。
实验目的:当用户访问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实现了单点反向代理功能,实验成功,如图所示:
在这个场景中,我们针对后端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功能实现用户需求。