目录

  • 一、Nginx+Tomcat负载均衡、动静分离
    • 1、正向代理
    • 2、反向代理
    • 3、Nginx动静分离实现原理
      • Nginx静态处理优势
  • 二、实战
    • 1.部署Nginx 负载均衡器
    • 2.部署2台Tomcat 应用服务器
    • 3.动静分离配置
      • (1)Tomcat1 server 配置
      • (2)Tomcat2 server 配置
      • (3)Nginx server 配置
    • 4、七层反向代理:
      • 4.测试效果
    • 5、Nginx 负载均衡模式:
    • 6、四层反向代理:
      • 1、初始化服务器,新加的两台NGINX服务器上安装NGINX服务
    • 7、nginx负载均衡的模式(调度算法/策略)

一、Nginx+Tomcat负载均衡、动静分离

1、正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。

正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。

2、反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。

反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。

反向代理的优势:

隐藏真实服务器;负载均衡便于横向扩充后端动态服务;动静分离,提升系统健壮性。

3、Nginx动静分离实现原理

Nginx静态处理优势

Nginx处理静态页面的效率远高于Tomcat的处理能力

若Tomcat的请求量为1000次,则Nginx的请求量为6000次

Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M

Nginx处理静态资源的能力是Tomcat处理的6倍

二、实战

Nginx 服务器:192.168.102.40:8080
Tomcat服务器1:192.168.80.60:8080
Tomcat服务器2:192.168.80.60:8081

1.部署Nginx 负载均衡器

1、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

2、安装安装依赖包
nginx的配置及运行需要pcre、zlib、openssl等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

3、创建运行用户、组

useradd -M -s /sbin/nologin nginx

4、编译安装Nginx

cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \                                   #启用文件修改支持
--with-http_stub_status_module \                    #启用状态统计
--with-http_gzip_static_module \                    #启用 gzip静态压缩
--with-http_flv_module \                            #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module  \                       #启用 SSL模块,提供SSL加密功能
--with-stream                                       #启用 stream模块,提供4层调度
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream

进行编译安装

make && make install

5、创建软链接

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

6.添加 Nginx 系统服务

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径[Install]服务安装的相关设置,可设置为多用户

加入权限和设置开机自启

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

2.部署2台Tomcat 应用服务器

1、先关闭防火墙

systemctl stop firewalld
setenforce 0

2、解压文件到/usr/local/目录里

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

3、进入配置文件的尾行添加jdk内容和环境变量

export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH

重载配置

source /etc/profile

字号4

tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

重新开启服务

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

查看端口有没有打开

netstat -ntap | grep 8080

3.动静分离配置

(1)Tomcat1 server 配置

设置动态页面1

mkdir /usr/local/tomcat/webapps/test

创建一个网页目录

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>

进入修改配置文件

vim /usr/local/tomcat/conf/server.xml

由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"></Context></Host>

删除原来的配置,添加新的配置

重新启动端口

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

(2)Tomcat2 server 配置

在另一个主机上添加网页目录

mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test

1、进入tomcat1 里面设置网页页面

vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>   #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>

进入修改配置文件

vim /usr/local/tomcat/tomcat1/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>

重新启动服务

/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh

2、进入修改tomcat2

创建网站页面

mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test

进入创建页面

vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>   #指定为 test3 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>

修改配置文件

vim /usr/local/tomcat/tomcat2/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>

重新启动服务

/usr/local/tomcat/tomcat2/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh

(3)Nginx server 配置

准备好静态页面和静态图片

4、七层反向代理:

进入添加配置文件

vim /usr/local/nginx/conf/nginx.conf
#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大upstream tomcat_server {server 192.168.102.40:8080 weight=1;server 192.168.102.60:8080 weight=1;server 192.168.102.60:8081 weight=1;}
#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理location ~ .*\.jsp$ {proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IPproxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
#配置Nginx处理静态图片请求location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;}

4.测试效果

测试负载均衡效果,不断刷新浏览器测试

5、Nginx 负载均衡模式:

●rr 轮询 负载均衡模式:
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。●least_conn 最少连接:
优先将客户端请求调度到当前连接最少的服务器。●ip_hash 负载均衡模式:
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。●fair(第三方)负载均衡模式:
按后端服务器的响应时间来分配请求,响应时间短的优先分配。●url_hash(第三方)负载均衡模式:
基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

6、四层反向代理:

1、初始化服务器,新加的两台NGINX服务器上安装NGINX服务

systemctl stop firewalld
setenforce 0

安装依赖项

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

创建一个用户

useradd -M -s /sbin/nologin nginx

解压包到opt目录里

cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/

1)编译安装时需要 --with-stream 添加四层反向代理模块

cd nginx-1.24.0/./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \                                   #启用文件修改支持
--with-http_stub_status_module \                    #启用状态统计
--with-http_gzip_static_module \                    #启用 gzip静态压缩
--with-http_flv_module \                            #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module                              #启用 SSL模块,提供SSL加密功能
--with-stream                                      ✨启用 stream模块,提供4层调度

启动模块

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream

编译文件

make && make install

创建软链接

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

设置system启动

vim /lib/systemd/system/nginx.service[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

设置权限 和启动服务和开机自启

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

2)和 http 配置段同层级别,一般在 http 配置段上面添加 stream 配置段,在 stream 配置段中定义服务器池、监听端口和转发等配置

stream {upstream appserver {server 192.168.102.20:80 weight=1;server 192.168.102.50:80 weight=1;}server {listen 80;proxy_pass appserver;}
}


设置完后重新启动服务

systemctl restart nginx.service

重新启动端口

killall -3 nginx  #关闭所有nginx的端口
cd /usr/local/nginx/sbin./nginx  #启动端口

要把3台nginx主机的长链接关闭

使用浏览器访问设置4层的主机ip地址,访问其他nginx主机的网页目录页面

7、nginx负载均衡的模式(调度算法/策略)

轮询         round robin  rr
加权轮询     weight round robin  wrr
least_conn   最小/少连接
ip_hash      根据客户端IP做hash缓存的算法
url_hash     根据客户端访问的url路径做hash缓存的算法
fair         根据服务端的响应时间来分配请求
random       随机分配
hash  $remote_addr   consistent     一致性hash算法, 客户端IP 哈希算法,是ip_hash算法的加强版nginx全局变量

nginx的反向代理实现会话保持

1)ip_hash    url_hash      客户端IP一致性哈希算法 hash $remote_addr consistent     基于客户端IP/访问的URL做哈希缓存实现会话保持2)sticky_cookie_insert                                                             需要安装第三方的sticky模块,基于cookie来判断实现会话保持3)配置后端应用服务器共享 session 或使用后端服务器自身通过相关机制保持 session 同步实现会话保持

【Nginx+Tomcat的7层代理和四层代理】相关推荐

  1. 架构师聊的四层代理和七层代理,都在聊什么?

    日常与大佬沟通或看文章,时不时总会遇到两个概念"四层代理负载均衡"和"七层代理负载均衡",那么,所谓的四层代理和七层代理分别指的是什么?又在什么场景下用到呢?这 ...

  2. 与大佬沟通,聊到四层代理和七层代理分别指的是什么这个问题时?会擦出什么火花呢

    日常与大佬沟通或看文章,时不时总会遇到两个概念"四层代理负载均衡"和"七层代理负载均衡",那么,所谓的四层代理和七层代理分别指的是什么?又在什么场景下用到呢?这 ...

  3. 所谓的四层代理和七层代理分别指的是什么?又在什么场景下用到呢?

    日常与大佬沟通或看文章,时不时总会遇到两个概念"四层代理负载均衡"和"七层代理负载均衡",那么,所谓的四层代理和七层代理分别指的是什么?又在什么场景下用到呢?这 ...

  4. 通过SLB四层代理上传大文件 延时失败问题探究

    文章目录 故事背景 一 概念介绍 1.1 TCP/IP报文的组成 1.2 MTU 1.3 MSS 1.4 ICMP 报文 1.5 PMTUD 二 TCP三次握手探秘 2.1 同网段直连握手 2.2 跨 ...

  5. Nginx+Tomcat负载均衡、动静分离,4层代理,7层代理

    一:7层反向代理 Nginx 服务器:192.168.52.200:80 Tomcat服务器1:192.168.52.201:80 Tomcat服务器2:192.168.52.108:8080 192 ...

  6. Nginx+Tomcat 实现反向代理

    反向代理是指对于客户端而言代理服务器就是原始服务器,并且客户端不需要进行任何特别的设置.客户端向反向代理发送请求,接着反向代理将判断向何处(后端节点)转交请求,并将获得的内容返回给客户端,如下图所示: ...

  7. nginx+tomcat动态代理

    nginx+tomcat动态代理 一.所需文件 二.CentOS7中使用yum安装Nginx的方法 二.后台java项目部署 三.PA项目部署/Tomcat集群/Tomcat动态代理 四.结果图 一. ...

  8. 使用nginx作为HTTPS正向代理服务器(七层透传代理、中间人代理)

    [前言] 在讲解nginx正向代理https之前,我们先来解答几个小疑问. 1.nginx是什么? Java同学肯定知道apache服务器,一个很牛,但是也很庞大的web服务器.能当web服务器的不仅 ...

  9. 使用 Nginx 实现四层代理配置

    一.基本介绍 平时我们在配置 Nginx 代理时,一般配置的都是基于 http 或是 https 协议的代理,也就是应用层.但是有些时候,我们并不想配置这种基于应用层的代理.比如说:我们要代理到数据库 ...

最新文章

  1. 第十五届全国大学生智能汽车竞赛 信标组亮灯顺序和次数
  2. c语言变量在头文件定义变量吗,在头文件C中声明变量
  3. oracle数据库优化,访问oracle视图数据很慢
  4. GetSafeHdc( )
  5. 在现有的python环境下创建另一个python版本【亲测有效】
  6. Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发
  7. 阿里云重磅发布RDS for SQL Server AlwaysOn集群版
  8. android获取指针空间大小_Android进阶:Binder那么弱怎么面大厂?
  9. java作业——Day007
  10. 20.高性能MySQL --- 在MySQL上使用 Sphinx
  11. 【Gym-101775 J】Straight Master【差分、贪心】
  12. autoflowchart软件使用步骤_AutoFlowchart(c语言流程图生成器) V 3.5.3 官方版
  13. 青藤云中间商一面面经
  14. 51Nod1740 蜂巢迷宫
  15. 直播回放:巧用Webpack、Eui Compiler
  16. centos8安装中文版man帮助手册
  17. 图片大小如何调整到10k?图片压缩到指定大小怎么弄?
  18. Arduino机器人快速上手经验分享(L298N马达驱动,摇杆模块)
  19. PotPlayer 高逼格无边框的本地播放器
  20. 关于Microsoft Store无法更新的解决方案

热门文章

  1. JavaScript实现大图展示(放大镜)
  2. Three.js心脏在线预览(次时代模型)
  3. 6000字长文,详解黑色产业链的「攻守道」
  4. RecurDyn第一次学习笔记
  5. 一个bug管理软件:BugFree
  6. 吴恩达 深度学习课程2018开放 (Stanford CS230)
  7. 最后三天,平头哥携手Unitimes带来AIoT行业大咖盛宴
  8. 潜意识对人行为的影响--《潜意识-控制你行为的秘密》
  9. hndlrsvc.exe
  10. ACM题 ---小乔和小灰灰是好朋友问题