反向代理是什么?利用Nginx+Tomcat来搭建反向代理的负载均衡群集

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 反向代理是什么?利用Nginx+Tomcat来搭建反向代理的负载均衡群集

前言——反向代理是什么


  • 要说反向代理是什么,这里就不得不提到代理是什么


代理: 当客户机访问服务器时,中间会有一个代理服务器,客户机经过代理服务器访问服务器的这个过程就是代理,就像一些专卖店,比如apple的专卖店扮演的角色就是代理服务器,而apple的总公司扮演的角色就是被访问服务器,去买apple的顾客扮演的角色就是客户机


  • 知道了代理是什么,而下一个就是正向代理


正向代理: 正向代理就是最常用的代理模式,客户端要清楚要访问的服务器的ip地址,当客户机访问目标服务器时会经过代理服务器,然后代理服务器去被访问的服务器发送请求,再由被访问的服务器回复代理服务器,由代理服务器回复客户机,这个过程中被访问的服务器全程都不知道客户机的真实ip,而客户机却知道被访问服务器的ip,这是因为正向代理服务器屏蔽了或者隐藏了客户机的真实ip


  • 知道了正向代理是什么,那么就是最后的反向代理


反向代理: 反向代理的代理服务器一般使用的都是Nginx来搭建,这里的Nginx扮演的角色像是一个转发器,在他的后端,一般会搭建多台轻量级的tomcat服务器,并且基于某种算法来实现Tomcat服务器的来回切换。客户机访问的是Nginx代理服务器的地址,由Nginx服务器转发给后面的Tomcat服务器,之后Tomcat服务器回应Nginx服务器,Nginx服务器再回应客户机,因为真实服务器放在Nginx服务器的后面,从而隐藏了真实服务器的ip地址,也实现了负载均衡。


以上说明都是个人理解,如有错误,希望及时在评论区回复,谢谢


一、反向代理示例图



20210131160452703.png


二、实验环境


主机名 ip地址 扮演角色
Nginx 192.168.100.7 Nginx服务器
Tomcat-01 192.168.100.8 Tomcat服务器
Tomcat-02 192.168.100.9 Tomcat服务器


三、实验要求


让客户机在访问的时候,无需得知Tomcat服务器的真实ip,就可以访问Tomcat服务器的页面,并且可以让两台Tomcat服务器的页面来回切换,实现负载均衡


四、实验步骤


(1)首先先搭建两台Tomcat服务器

******两台Tomcat服务器搭建步骤相同,但是网页内容不同,这样测试时方便辨认
******(1)做基础配置
[root@centos7-008 ~]# hostnamectl set-hostname tomcat-01
[root@centos7-008 ~]# su
[root@tomcat-01 ~]# systemctl stop firewalld
[root@tomcat-01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@tomcat-01 ~]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 写保护,将以只读方式挂载
******(2)搭建tomcat服务器
[root@tomcat-01 ~]# yum -y remove java  (检查是否已经安装java)
已加载插件:fastestmirror
参数 java 没有匹配
不删除任何软件包
[root@tomcat-01 ~]# ll (上传java的软件包)
总用量 177124
-rw-------. 1 root root      1262 9月   3 18:18 anaconda-ks.cfg
-rw-r--r--  1 root root 181367942 2月   1 00:15 jdk-8u91-linux-x64.tar.gz
[root@tomcat-01 ~]# tar xf jdk-8u91-linux-x64.tar.gz   (解压)
[root@tomcat-01 ~]# mv jdk1.8.0_91/ /usr/local/java (移动到java目录)
[root@tomcat-01 ~]# vim /etc/profile.d/java.sh  (编写Java脚本,优化执行路径)
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin 
[root@tomcat-01 ~]# chmod +x /etc/profile.d/java.sh   (添加可执行权限)
[root@tomcat-01 ~]# source /etc/profile.d/java.sh     (执行脚本)
[root@tomcat-01 ~]# echo $PATH  (查看是否优化成功)
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/java/bin
[root@tomcat-01 ~]# ll  (上传tomcat的软件包)
总用量 186324
-rw-------. 1 root root      1262 9月   3 18:18 anaconda-ks.cfg
-rw-r--r--  1 root root   9417469 2月   1 00:21 apache-tomcat-8.5.16.tar.gz
-rw-r--r--  1 root root 181367942 2月   1 00:15 jdk-8u91-linux-x64.tar.gz
[root@tomcat-01 ~]# mkdir /usr/local/tomcat  (创建主目录)
[root@tomcat-01 ~]# tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/tomcat/ (解压)
[root@tomcat-01 ~]# /usr/local/tomcat/apache-tomcat-8.5.16/bin/startup.sh  (启动)
Using CATALINA_BASE:   /usr/local/tomcat/apache-tomcat-8.5.16
Using CATALINA_HOME:   /usr/local/tomcat/apache-tomcat-8.5.16
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-8.5.16/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/apache-tomcat-8.5.16/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-8.5.16/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat-01 ~]# netstat -anpt | grep java  (查看端口号确认已经成功启动)
tcp6       0      0 :::8080                 :::*                    LISTEN      1376/java           
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1376/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      1376/java  
******(3)在两台tomcat服务器上分别写上不同的网页
[root@tomcat-01 ~]# mkdri -pv /web/webapp1
bash: mkdri: 未找到命令
[root@tomcat-01 ~]# mkdir -pv /web/webapp1
mkdir: 已创建目录 "/web"
mkdir: 已创建目录 "/web/webapp1"
[root@tomcat-01 ~]# vim /web/webapp1/index.jsp  (网页写的不一样就可以)
写入
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
  <head>
     <title> JSP test1 page </title>
  </head>
  <body>     <% out.println("Welcome to Tomcat-001 !!!!!!");%>  
  </body>
</html>
保存退出
[root@tomcat-01 ~]# vim /usr/local/tomcat/apache-tomcat-8.5.16/conf/server.xml (编写配置文件)
修改为:
。。。。。。
148       <Host name="localhost"  appBase="/web"
149             unpackWARs="true" autoDeploy="true">
150 <Context docBase="/web/webapp1" path="" reloadable="false"></Context> 
151         <!-- SingleSignOn valve, share authentication between web applications
。。。。。。
保存退出
******(4)重新启动tomcat服务
[root@tomcat-01 ~]# /usr/local/tomcat/apache-tomcat-8.5.16/bin/shutdown.sh  (关闭)
Using CATALINA_BASE:   /usr/local/tomcat/apache-tomcat-8.5.16
Using CATALINA_HOME:   /usr/local/tomcat/apache-tomcat-8.5.16
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-8.5.16/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/apache-tomcat-8.5.16/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-8.5.16/bin/tomcat-juli.jar
[root@tomcat-01 ~]# /usr/local/tomcat/apache-tomcat-8.5.16/bin/startup.sh  (启动)
Using CATALINA_BASE:   /usr/local/tomcat/apache-tomcat-8.5.16
Using CATALINA_HOME:   /usr/local/tomcat/apache-tomcat-8.5.16
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-8.5.16/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/apache-tomcat-8.5.16/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-8.5.16/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat-01 ~]# netstat -antp | grep java  (检查端口确认服务已经成功启动)
tcp6       0      0 :::8080                 :::*                    LISTEN      1463/java           
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1463/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      1463/java  

利用测试机分别访问两个tomcat服务器,测试是否可以正常访问


20210131164203444.png


20210131164216950.png

成功后开始搭建Nginx服务器


(2)搭建Nginx服务器


******(1)先做基础配置
[root@centos7-007 ~]# hostnamectl set-hostname Nginx
[root@centos7-007 ~]# su
[root@nginx ~]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 写保护,将以只读方式挂载
[root@nginx ~]# systemctl stop firewalld
[root@nginx ~]# setenforce 0
setenforce: SELinux is disabled
******(2)安装Nginx必要组件和创建组等
[root@nginx ~]# yum -y install pcre-devel zlib-devel openssl-devel
。。。。。。
完毕!
[root@nginx ~]# groupadd www 
[root@nginx ~]# useradd -g www -s /bin/false www (指定登录shell为/bin/false)
————————————————————————————————————华丽分割线————————————————————————————————————
这个时候有人就会想一般不是会指定为/sbin/nologin嘛
/bin/false和/sbin/nologin的区别:
/bin/false是最严格的禁止login选项,一切服务都不能用
而/sbin/nologin只是不能登录系统而已
—————————————————————————————————————————————————————————————————————————————————
******(3)上传源码包,配置、编译、安装
[root@nginx ~]# ll
总用量 964
-rw-------. 1 root root   1220 9月   3 18:16 anaconda-ks.cfg
-rw-r--r--  1 root root 980831 2月   1 00:49 nginx-1.12.0.tar.gz
[root@nginx ~]# tar xf nginx-1.12.0.tar.gz -C /usr/src/
[root@nginx ~]# cd /usr/src/nginx-1.12.0/
[root@nginx nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module  &&make &&make install
————————————————————————————————————华丽分割线——————————————————————————————————————
配置模块详解
(1)--user=www --group=www          指定运行的用户、组
(2)--with-file-aio                 启用文件修改支持
(3)--with-http_stub_status_module  启用状态统计
(4)--with-http_gzip_static_module  启用gzip静态压缩
(5)--with-http_flv_module          启用flv模块,提供寻求内存使用基于时间的偏移量文件 
(6)--with-http_ssl_module          启用ssl模块
———————————————————————————————————————————————————————————————————————————————————
******(4)编辑nginx的配置文件
[root@nginx nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf (添加)
。。。。。。
 34  upstream tomcat_server {
 35           server 192.168.100.8:8080 weight=1;
 36          server 192.168.100.9:8080 weight=1;
 37   }      
 38
。。。。。。 (下面的location写一个就行,可以把另一个删掉,或者在原本就有的项上修改)
 46    location / {
 47               root   html;
 48               index  index.html index.htm;
 49               proxy_pass http://tomcat_server;
 50           }   
 51       
。。。。。。    
保存退出
[root@nginx nginx-1.12.0]# /usr/local/nginx/sbin/nginx -t (检查nginx语法是否正确)
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok (ok表示正确)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx nginx-1.12.0]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf (启动)
[root@nginx nginx-1.12.0]# netstat -antp | grep nginx (查看端口确认已经启动)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3978/nginx: master  


(3)测试


使用测试机访问Nginx服务器192.168.100.7,确认无需得知Tomcat的真实ip也可以访问Tomcat服务器的页面,并且查看是否会自动切换页面


第一次访问

20210131170100302.png

第二次访问


20210131170131824.png


客户机通过nginx服务器成功访问到了Tomcat服务器,并且可以实现负载均衡。至此,Nginx+tomcat负载均衡集群已经搭建完成!

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
3月前
|
负载均衡 算法 搜索推荐
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
146 59
|
2月前
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
138 61
|
8天前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
79 11
|
19天前
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
68 9
|
16天前
|
存储 应用服务中间件 nginx
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
55 5
|
2月前
|
缓存 负载均衡 算法
如何配置Nginx反向代理以实现负载均衡?
如何配置Nginx反向代理以实现负载均衡?
|
2月前
|
存储 负载均衡 中间件
Nginx反向代理配置详解,图文全面总结,建议收藏
Nginx 是大型架构必备中间件,也是大厂喜欢考察的内容,必知必会。本篇全面详解 Nginx 反向代理及配置,建议收藏。
Nginx反向代理配置详解,图文全面总结,建议收藏
|
29天前
|
负载均衡 算法 应用服务中间件
Nginx的负载均衡
Nginx 是一款高性能的Web服务器与反向代理服务器,支持负载均衡功能,能有效提升系统性能与可靠性。其负载均衡策略包括基于轮询和权重的分配方法,以及IP哈希、最小连接数等算法,可根据实际需求灵活选择。
103 5
|
1月前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
60 3
|
2月前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
349 1
nginx配置反向代理404问题