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

前言

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

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

文章目录

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

一. 代理的概念

1.1 正向代理图示

正向代理原理如图所示:
打造高可用、高效的Nginx反向代理应用 - 实战篇_第1张图片

1.2 反向代理图示

打造高可用、高效的Nginx反向代理应用 - 实战篇_第2张图片

1.3 反向代理优势

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

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

二、安全增强:代理服务器可以隐藏目标服务器的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部分指定Nginx的工作模式和连接数的上限
  • http部分嵌套多个server,主要用来配置代理、缓存、自定义日志格式等功能及第三方模块的配置
  • server部分用于配置虚拟主机相关参数
  • location部分用于配置请求的处理规则及各种页面匹配处理情况。

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

打造高可用、高效的Nginx反向代理应用 - 实战篇_第3张图片

假设已经在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实现了单点反向代理功能,实验成功,如图所示:
打造高可用、高效的Nginx反向代理应用 - 实战篇_第4张图片

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功能实现用户需求。

你可能感兴趣的:(服务器,运维,架构)