Nginx+Tomcat负载均衡、动静分离群集
Nginx+Tomcat负载均衡、动静分离群集
一、Tomcat
1. Tomcat简介
最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发。
安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件。
2. Tomcat重要目录
| 目录 | 作用 |
|---|---|
| bin | 存放启动和关闭Tomcat脚本 |
| conf | 存放Tomcat不同的配置文件 |
| doc | 存放Tomcat文档 |
| lib | 存放Tomcat运行需要的库文件 |
| logs | 存放Tomcat执行时的LOG文件 |
| src | 存放Tomcat的源代码 |
| webapps | Tomcat的主要Web发布目录 |
| work | 存放jsp编译后产生的class文件 |
二、Nginx负载均衡原理
1. Nginx应用
Nginx是一款非常优秀的HTTP服务器软件,它具有以下优点:
- 支持高达50000个并发连接数的响应
- 拥有强大的静态资源处理能力
- 运行稳定
- 内存、CPU等系统资源消耗非常低
目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力。
2. Nginx负载均衡实现原理
Nginx实现负载均衡是通过反向代理实现的

Nginx配置反向代理的主要参数:
- upstream 服务池名{}
配置后端服务器池,以提供响应数据 - proxy_pass http://服务池名
配置将访问请求转发给后端服务器池的服务器处理
3. 负载均衡模式
| 负载均衡模式 | 说明 |
|---|---|
| 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。 |
| fair(第三方)负载均衡模式 | 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 |
| url_hash(第三方)负载均衡模式 | 和ip_hash算法类似,是对每个请求按ur来的hash结果匹配,使每个url定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。 |
4. 正、反向代理

正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
5. 反向代理的方式
| 反向代理方式 | 说明 |
|---|---|
| 四层反向代理 | 是基于IP+PROT(TCP/UDP)转发 |
| 七层反向代理 | 是基于http/https/mail等代理转发 |
三、Nginx动静分离原理
1. 动静分离原理

服务端节后来自客户端的请求中,既有静态资源也有动态资源,静态资源由Nginx提供服务,动态资源Nginx转发至后端。
2. Nginx静态处理优势
- Nginx处理静态页面的效率远高于Tomcat的处理能力
- 若Tomcat到的请求量为1000次,则Nginx的请求量为6000次
- Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M
- Nginx处理静态资源的能力是Tomcat处理的6倍
四、部署Tomcat
1. 服务器分配
Nginx服务器:192.168.122.10:80
Tomcat服务器1:192.168.122.100:80
Tomcat服务器2:192.168.122.101:8080 192.168.122.101:8081
2. 部署Nginx负载均衡器
[root@nginx_server ~]# systemctl stop firewalld
[root@nginx_server ~]# setenforce 0
setenforce: SELinux is disabled
[root@nginx_server ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@nginx_server ~]# useradd -M -s /sbin/nologin nginx
[root@nginx_server ~]# cd /opt
[root@nginx_server opt]# tar zxvf nginx-1.12.0.tar.gz -C /opt/
[root@nginx_server opt]# cd nginx-1.12.0/
[root@nginx_server nginx-1.12.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层调度
[root@nginx_server nginx-1.12.0]# make -j 2 && make install
[root@nginx_server nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
[root@nginx_server nginx-1.12.0]# 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
ExecReload=/bin/klll -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@nginx_server nginx-1.12.0]# chmod 754 /lib/systemd/system/nginx.service
[root@nginx_server nginx-1.12.0]# systemctl start nginx.service
[root@nginx_server nginx-1.12.0]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
3. 部署2台Tomcat应用服务器
(1)tomcat_server1配置
[root@tomcat_server1 ~]# systemctl stop firewalld
[root@tomcat_server1 ~]# setenforce 0
setenforce: SELinux is disabled
[root@tomcat_server1 ~]# cd /opt
[root@tomcat_server1 opt]# tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@tomcat_server1 opt]# vim /etc/profile.d/java.sh
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:$PATH
[root@tomcat_server1 opt]# source /etc/profile.d/java.sh
[root@tomcat_server1 opt]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
[root@tomcat_server1 opt]# tar zxvf apache-tomcat-8.5.16.tar.gz
[root@tomcat_server1 opt]# mv /opt/apache-tomcat-8.5.16 /usr/local/tomcat
[root@tomcat_server1 opt]# ln -s /usr/local/tomcat/bin/* /usr/local/sbin
[root@tomcat_server1 opt]# shutdown.sh
[root@tomcat_server1 opt]# startup.sh
[root@tomcat_server1 opt]# netstat -natp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 2819/java
(2)tomcat_server2配置
[root@tomcat_server2 ~]# systemctl stop firewalld
[root@tomcat_server2 ~]# setenforce 0
setenforce: SELinux is disabled
[root@tomcat_server2 ~]# cd /opt
[root@tomcat_server2 opt]# tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@tomcat_server2 opt]# vim /etc/profile.d/java.sh
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:$PATH
[root@tomcat_server2 opt]# source /etc/profile.d/java.sh
[root@tomcat_server2 opt]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
[root@tomcat_server2 opt]# tar zxvf apache-tomcat-8.5.16.tar.gz
[root@tomcat_server2 opt]# mkdir /usr/local/tomcat
[root@tomcat_server2 opt]# mv /opt/apache-tomcat-8.5.16 /usr/local/tomcat/tomcat1
[root@tomcat_server2 opt]# /usr/local/tomcat/tomcat1/bin/shutdown.sh
[root@tomcat_server2 opt]# /usr/local/tomcat/tomcat1/bin/startup.sh
[root@tomcat_server2 opt]# netstat -natp | grep :8080
tcp6 0 0 :::8080 :::* LISTEN 2926/java
[root@tomcat_server2 opt]# cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
[root@tomcat_server2 opt]# vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
[root@tomcat_server2 opt]# source /etc/profile.d/tomcat.sh
4. 动静分离配置
(1)Tomcat_server1配置
[root@tomcat_server1 opt]# mkdir /usr/local/tomcat/webapps/test
[root@tomcat_server1 opt]# 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>
[root@tomcat_server1 opt]# vim /usr/local/tomcat/conf/server.xml
#注释148-164行,在165行前插入以下内容
<Host name="tomcat_server1" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
</Context>
</Host>
(2)Tomcat_sever2配置
实例1
[root@tomcat_server2 tomcat]# mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
[root@tomcat_server2 tomcat]# 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>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
[root@tomcat_server2 tomcat]# vim /usr/local/tomcat/tomcat1/conf/server.xml
#注释148-164行,在165行前插入以下内容
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true">
</Context>
</Host>
[root@tomcat_server2 tomcat]# /usr/local/tomcat/tomcat1/bin/shutdown.sh
[root@tomcat_server2 tomcat]# /usr/local/tomcat/tomcat1/bin/startup.sh
[root@tomcat_server2 tomcat]# netstat -natp | grep java
tcp6 0 0 :::8080 :::* LISTEN 4205/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 4205/java
tcp6 0 0 :::8009 :::* LISTEN 4205/java
实例2
[root@tomcat_server2 tomcat]# 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>
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>
[root@tomcat_server2 tomcat]# vim /usr/local/tomcat/tomcat1/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">
#22行,修改Server port,默认为8005,修改为任意不冲突的端口号,这里设为8006
<Connector port="8081" protocal="HTTP/1.1"
#69行,修改Connector port,HTTP/1.1,默认为8080,修改为任意不冲突的端口号,这里设为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
#116行,修改Connector port,AJP/1.3,默认为8009,修改为任意不冲突的端口号,这里设为8010
#注释148-164行,在165行前插入以下内容
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true">
</Context>
</Host>
[root@tomcat_server2 tomcat]# /usr/local/tomcat/tomcat2/bin/shutdown.sh
[root@tomcat_server2 tomcat]# /usr/local/tomcat/tomcat2/bin/startup.sh
[root@tomcat_server2 tomcat]# netstat -natp | grep java
tcp6 0 0 :::8080 :::* LISTEN 4205/java
tcp6 0 0 :::8081 :::* LISTEN 4332/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 4205/java
tcp6 0 0 127.0.0.1:8006 :::* LISTEN 4332/java
tcp6 0 0 :::8009 :::* LISTEN 4205/java
tcp6 0 0 :::8010 :::* LISTEN 4332/java
(3)nginx_servr配置
准备静态页面和静态图片
[root@nginx_server nginx-1.12.0]# echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
[root@nginx_server nginx-1.12.0]# mkdir /usr/local/nginx/html/img
[root@nginx_server nginx-1.12.0]# cd /usr/local/nginx/html/img
#将准备好的图片传入该目录
[root@nginx_server img]# vim /usr/local/nginx/conf/nginx.conf
.......
http {
......
#gzip on;
##配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.122.100:8080 weight=1;
server 192.168.122.101:8080 weight=1;
server 192.168.122.101:8081 weight=1;
}
server {
listen 80;
server_name localhost;
charset utf-8;
##access_log logs/host.access.log main;
##配置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,来获取源IP
proxy_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;
}
......
}
也可用四层反向代理
四层反向代理需要使用stream模块,可通过./configure --with-stream加载该模块。
[root@nginx_server img]# vim /usr/local/nginx/conf/nginx.conf
#stream与http同等级,所以一般只在http上面一段设置
stream {
upstream appserver {
server 192.168.122.100:8080 weight=1;
server 192.168.122.101:8080 weight=1;
server 192.168.122.101:8081 weight=1;
}
server {
listen 8080;
proxy_pass appserver;
}
}
......
(4)浏览器访问测试
测试静态页面效果
浏览器访问http://192.168.122.10/

浏览器访问http://192.168.122.10/jobs.jpg

测试负载均衡效果,不断刷新浏览器测试
浏览器访问http://192.168.122.10/index.jsp



Nginx+Tomcat负载均衡、动静分离群集的更多相关文章
- nginx+tomcat负载均衡+动静分离+redis集中管理session
1.服务器A安装ng,服务器B.C安装tomcat: 2.服务器A建立/data/www目录,用于发布静态文件: 3.ng无动静分离配置: user root root; worker_process ...
- nginx+tomcat负载均衡
最近练习nginx+tomcat负载均衡.根据一些资料整理了大体思路,最终实现了1个nginx+2个tomcat负载均衡. 安装JDK 1>进入安装目录,给所有用户添加可执行的权限 #chmod ...
- linux+nginx+tomcat负载均衡,实现session同步
linux+nginx+tomcat负载均衡,实现session同步 花了一个上午的时间研究nginx+tomcat的负载均衡测试,集群环境搭建比较顺利,但是session同步的问题折腾了几个小时才搞 ...
- Nginx + Tomcat 负载均衡配置详解
Nginx常用操作指南一.Nginx 与 Tomcat 安装.配置及优化1. 检查和安装依赖项 yum -y install gcc pcre pcre-devel zlib zlib-devel o ...
- Linux下Nginx+Tomcat负载均衡和动静分离配置要点
本文使用的Linux发行版:CentOS6.7 下载地址:https://wiki.centos.org/Download 一.安装Nginx 下载源:wget http://nginx.org/pa ...
- Nginx+Tomcat+Keepalived+Memcache 负载均衡动静分离技术
一.概述 Nginx 作负载均衡器的优点许多,简单概括为: ①实现了可弹性化的架构,在压力增大的时候可以临时添加Tomcat服务器添加到这个架构里面去; ②upstream具有负载均衡能力,可以自动判 ...
- Nginx+tomcat负载均衡时静态页面报404
百度到的问题解决BLOG http://os.51cto.com/art/201204/326843.htm nginx+2台tomcat负载均衡,应用程序已部署,单独访问tomcat时,可以访问到所 ...
- nginx+tomcat负载均衡策略
測试环境均为本地,測试软件为: nginx-1.6.0,apache-tomcat-7.0.42-1.apache-tomcat-7.0.42-2.apache-tomcat-7.0.42-3 利用n ...
- nginx+tomcat负载均衡和session复制
本文介绍下传统的tomcat负载均衡和session复制. session复制是基于JVM内存的,当然在当今的互联网大数据时代,有更好的替代方案,如将session数据保存在Redis中. 1.安装n ...
随机推荐
- [学习笔记] Oracle集合运算、内连接、外连接、伪列
集合运算 INTERSECT(交集),返回两个查询共有的记录. UNION ALL(并集重复),返回各个查询的所有记录,包括重复记录. UNION(并集不重复),返回各个查询的所有记录,不包括重复记录 ...
- CentOS7 常用命令汇总
原文链接:https://blog.csdn.net/weixin_42208959/article/details/107970958 目录常用命令1.进程相关命令1.1 查询进程和结束进程1.2 ...
- [ vue ] quasar框架踩坑:在vue文件外导入路由,执行router.push('/')没有效果
问题描述: 1. 如图所示的项目结构目录, axios.js 文件负责拦截全局请求和回复,我在拦截回复的代码中写了:如果服务器回复了一个401错误,则执行Router.push('/'),但是该方法失 ...
- HDU 2673-shǎ崽 OrOrOrOrz(C语言描述)
问题描述 问题是: 为您提供了一系列不同的整数, 请选择 "数字" 如下: 首先选择最大的, 然后是最小的, 然后是第二个最大的, 第二个最小的. 直到所有的数字被选中.例如, 给 ...
- F2BPM的流程仿真
仿真概述 F2BPM工作流仿真是一种通过建立工作流虚拟运行环境执行工作流仿真的方法.集中式仿真引擎解释工作流仿真模型,仿真活动的执行,处理仿真过程中的不确定性,从而完成工作流模型的仿真.同时,会实时显 ...
- 自从学会了VBA字典,VLOOKUP都不那么香了
上篇博文中,小爬曾多次为VBA字典带货.鼓励多用字典,可以让我们的VBA脚本工具执行更快.今天小爬来细聊一下VBA字典的具体应用!如果你有一定VBA基础,那么看完你一定会对VBA字典有全新的认识:如果 ...
- 【reverse】逆向1 数据宽度
[reverse]逆向1 数据宽度 前言 感觉学逆向的都是大佬,正好最近在看java视频的时候,发现讲课的老师居然是从逆向行业转行来的,顿时肃然起敬.于是想在暑假的最后发光发热,把逆向的基础知识学习稳 ...
- mate10碎屏机当成小电脑使用尝试
1.屏碎了修起来300-400,自己动手至少也要260以上买个屏幕钱. 手机图案锁屏也不知道密码,给我手机的亲戚忘了.当年手机被车压弯了. 对着恢复教程,盲屏幕猜着按还原了. 2.之后一路从8代系统更 ...
- Windows和Linux关闭占用端口
关闭端口的方式有很多种,但是常用的就是这种比较来的快一点 如果通过以下方式解决不了,可以通过关闭服务来解决 Windows 1.查看端口占用的进程 netstat -ano | findstr 800 ...
- C++构造函数语义学(一)(基于C++对象模型)
如果一个类没有自己的构造函数,编译器会在需要的时候为其合成一个出来,俗称:合成默认构造函数.但是请注意是在需要的时候,并不是所有情况. 请看下面代码: 1 #include<iostream&g ...