nginx+tomcat+memcache实现负载均衡、session共享
实验架构图:
Table of Contents
1、配置tomcat
2、安装memcache
3、查看tomcat和memcache是否配置好
4、nginx实现负载均衡:
5、客户端进行测试:
6、验证结论:
7、总结:
实验环境:
linux redhat6.5 防火墙关闭,三台虚拟机和一台物理机
主机 |
操作系统 |
IP地址 |
nginx |
redhat6.5 |
test1: 172.25.1.11 |
tomcat1 |
test2: 172.25.1.12 |
|
tomcat2 |
test3: 172.25.1.13 |
|
memcache1 |
test2: 172.25.1.12 | |
memcache2 |
test3: 172.25.1.13 |
解释: nginx做为反向代理,实现静动分离,将客户动态请求根据权重随机分配给两台tomcat服务器,memcache做为两台tomcat的共享session数据服务器。
1、配置tomcat
在test2和test3分别配置tomcat服务(这里只演示test2的配置,配置有区别的地方已经用红色标出来)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
[root@test2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local
[root@test2 ~]# ln -s /usr/local/jdk1.7.0_79/ /usr/local/jdk
[root@test2 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
[root@test2 ~]# source /etc/profile //刷新环境变量
[root@test2 ~]# which java //查看java路径
/usr/local/jdk/bin/java
[root@test2 ~]# which javac
/usr/local/jdk/bin/java
此时java环境就搭建好了
[root@test2 ~]# vim test.java //写一个java程序试试看能否运行,内容如下:
public class test
{
public static void main(String[] args)
{
System.out.println("hello world");
}
}
[root@test2 ~]# javac test.java //进行编译
[root@test2 ~]# java test //运行java
此时我们安装tomcat
[root@test2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@test2 ~]# cd /usr/local/
[root@test2 local]# ln -s apache-tomcat-7.0.37/ tomcat //做个软链接
[root@test2 local]# cd tomcat/apache-tomcat-7.0.37/
[root@test2 apache-tomcat-7.0.37]# mv * ..
[root@test2 apache-tomcat-7.0.37]# cd
session 的序列化方案官方推荐的有 4 种:
1. java serialization
2. msm-kryo-serializer
3. msm-javolution-serializer
4. msm-xstream-serializer
其中性能最好的序列化方案是 Kryo,此实验我们采用 kryo 方式。
把如下jar软件包下载好放置到/usr/local/tomcat/lib 目录中,jar软件包包含如下内容:
[root@test2 jar]# cd
[root@test2 ~]# mv jar/ /usr/local/tomcat/lib
[root@test2 ~]# cd /usr/local/tomcat/lib/jar/
[root@test2 jar]# mv * ..
[root@test2 jar]# cd ..
[root@test2 lib]# ls
[root@test2 ~]# rm -rf jar
[root@test2 ~]# vim /usr/local/tomcat/conf/context.xml //配置memcache缓存
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.1.12:11211,n2:172.25.1.13:11211" //memcache的两个节点,11211是memcache的端口号
failoverNodes="n1" //test3和test2的区别是在这里写n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[root@test2 local]# cd tomcat/
[root@test2 tomcat]# bin/startup.sh //开启tomcat服务; /usr/local/tomcat/bin/shutdown.sh 为关闭tomcat服务
//查看tomcat的端口号
此时,浏览器分别输入test2和test3对应的ip及服务端口号8080进行查看:
均可以访问到,此时test2和test3两主机的tomcat服务就搭建完成啦。
温馨提示:如果访问时出现网页空白的情况,可以尝试用ps命令查看tomcat(java)的进程id号,然后kill -9 id 将进程杀掉,然后重启服务,再次查看应该就可以了,网页还是出不来你可以先将配置memcache的配置文件刚才添加的内容删掉,看是否可以访问,若可以,则说明是配置文件添加的内容的问题;若不能访问,则是下载过程中的问题。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2、安装memcache
test2和test3上执行:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'
[root@test2 ~]# yum install -y memcache
[root@test2 ~]# /etc/init.d/memcached start
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
3、查看tomcat和memcache是否配置好
[root@test2 ~]# cd /usr/local/tomcat/logs/
[root@test2 logs]# > catalina.out
[root@test2 logs]# cd -
/usr/local/tomcat
[root@test2 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/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@test2 tomcat]# cd -
/usr/local/tomcat/logs
[root@test2 logs]# cat catalina.out //看到如下结果,说明已经配置成功
4、nginx实现负载均衡:
用nginx默认自带的proxy和upstream模块来实现后端web负载均衡,用nginx的sticky模块实现session共享
这里要用到sticky模块,所以提前下载nginx及nginx-sticky-module压缩包,进行源码编译,具体步骤看上一篇博客的后半片(扩展模块sticky部分),这里不再赘述。
上文博客连接:https://blog.csdn.net/weixin_41922887/article/details/89421210
只在test1上进行:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
[root@test1 ~]# useradd -s /sbin/nologin nginx //创建nginx程序用户,编译的时候用到
[root@test1 ~]# id nginx
nginx已经实现sticky模块的负载均衡
[root@test1 ~]# /opt/nginx/sbin/nginx -t //查看nginx的状态
修改配置文件
[root@test1 ~]# vim /opt/nginx/conf/nginx.conf
user nginx nginx; //刚才创建的nginx用户
worker_processes 2;
events {
worker_connections 65535;
}http {
upstream server {
sticky; //sticky模块,目的是当同一个用户动态访问时将请求发到同一个tomcat上,实现session的共享
server 172.25.1.12:8080;
server 172.25.1.13:8080;
}
include mime.types;
default_type application/octet-stream;sendfile on;
keepalive_timeout 65;#gzip on;
server{
listen 80;
server_name www.westos.org; //访问时的域名
location / {
root html;
index index.html index.htm;
}
location ~ \.jsp$ { //所有 jsp 页面交给 tomcat 处理,动静分离
proxy_pass http://server;
}error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@test1 ~]# /opt/nginx/sbin/nginx -t //检查语法是否有错误
[root@test1 ~]# /opt/nginx/sbin/nginx //开启服务
此时,我们的所有服务就搭建完成了。
5、客户端进行测试:
测试nginx服务:
静态测试:
在test1上执行:
[root@test1 ~]# cd /opt/nginx/html/ //nginx的默认发布路径
[root@test1 html]# ls
50x.html index.html
[root@test1 html]# vim cxx.html //写一个静态的文件cxx.html
<h1>it's a static nginx</h1>
此时在网页进行测试:
动态测试:
test2和test3都执行(这里只演示test2):
[root@test2 ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@test2 ROOT]# vim test.jsp
The time is:<%=new java.util.Date() %>
客户端进行访问:
再如:
[root@test2 ROOT]# vim cxx.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
%<form action="test.jsp" method="POST">
%name:<input type=text size=20 name="dataName">
%<br>
%key:<input type=text size=20 name="dataValue">
%<br>
%<input type=submit>
%</form>
%</body>
%</html>
[root@test2 ROOT]# scp westos.jsp root@test3:/usr/local/tomcat/webapps/ROOT //test2和test3同时添加,scp直接发过去就好
可以看出,访问动态页面时用到后端服务器,这里接受访问请求的是test2,对应的memcache是test3
也可以看出,不管怎么刷新或者重新访问,只要是同一台主机,则接受请求的服务器不会变,和第一次访问时是同一台服务器。
6、验证结论:
现在将test3的memcache服务关闭并进行刷新操作,则此时:
[root@test3 tomcat]# /etc/init.d/memcached stop //可以看出此时memcache变为test2节点,而请求还是会交给test2的 tomcat,没有因为test3的memcache挂掉而丢掉
将test3的memcache恢复状态
[root@test3 tomcat]# /etc/init.d/memcached start
刷新时memcache不会变回去
此时将test2的tomcat服务宕掉,并刷新:
[root@test2 tomcat]# /usr/local/tomcat/bin/shutdown.sh
访问结果为:
此时,memcache仍然为test2
7、总结:
不同的主机访问时会调度到不同的 tomcat 实例上处理,来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。
原理:当test2中tomcat宕机后,test3接管会话后从本地的memcache处读取memcache的信息。
当test2的memcache宕机后,test3的tomcat中会将会话信息存至本地,以致session不会丢失。
nginx+tomcat+memcache实现负载均衡、session共享相关推荐
- nginx负载均衡session共享
文章目录 一.可道云项目结合redis缓存部署 redis缓存可道云项目数据及会话,加快网站访问速度 二.Nginx负载均衡会话共享 1.1 什么是会话保持 1.2 为什么需要会话保持 1.3 Coo ...
- Nginx+Tomcat搭建高性能负载均衡集群的实现方法
一. 目标实现高性能负载均衡的Tomcat集群: 二.步骤 1.首先下载Nginx,要下载稳定版: 2.然后解压两个Tomcat,分别命名为apache-tomcat-6.0.33-1和apac ...
- Nginx+Tomcat搭建高性能负载均衡集群
2019独角兽企业重金招聘Python工程师标准>>> 一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 实现高性能负载均衡 ...
- Nginx+tomcat+redis实现高可用负载均衡session共享集群+redis哨兵监控
实验拓扑图``` 实验步骤: 一.做nginx和tomcat的代理 二.做keepalived+nginx的双机热备份,vip:192.168.10.100 三.做keepalived+redis的哨 ...
- nginx+tomcat集群负载均衡中的多虚拟主机配置
虽然夜深了,但是还是解决了这个困扰我一个晚上的问题,记录下来备查. 接着我前不久写的这一篇来的:Linux下nginx和tomcat的整合http://hi.baidu.com/gnaiqeh/blo ...
- nginx+tomcat 反向代理 负载均衡配置
1.nginx的安装和配置见:http://www.cnblogs.com/ll409546297/p/6795362.html 2.tomcat部署项目到对应的服务器上面并启动,不详解 3.在ngi ...
- 【Nginx入门系列】第六章 Nginx+tomcat集群负载均衡部署
待更新 转载于:https://www.cnblogs.com/evan-liang/p/9189612.html
- tomcat+nginx+redis实现均衡负载、session共享(一)
在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一) ...
- tomcat+nginx+redis实现均衡负载、session共享
在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一) ...
最新文章
- 教你用R语言分析招聘数据,求职/转行不求人~(附代码、数据集)
- 发表的原创文章还希望大家多提宝贵意见!
- 快手,字节面试题,将IP地址转换成整数类型,再转换回来。C++代码
- Lambda表达式有参数有返回值的练习(自定义接口)
- 使用Java解决您的数据科学问题
- Cisco 胖AP和瘦AP的区别
- sap甲方_带你走进SAP项目实施过程——前言
- plsql如何显示表结构图_产品经理需了解的架构图/结构图知识
- 如何用MathType快速输入公式
- 您不是订单管理的定向开发者_全面升级投放和营销能力 华为应用市场商业推广助力开发者高效增长...
- 201711671132《java实用教程》第一章学习总结
- spring视频教程
- P2342 叠积木 并查集
- 程序猿必备福利之二上篇!!!简易使用Nodejs实现从美图网爬取清晰脱俗的美图???
- 知识变现海哥|知识变现需要使用哪些工具
- 准确查询表空间使用情况
- Android Studio报错:No key with alias xxx found in keystore xxx 解决方法
- 如何解决报错500的问题
- 迅为iTOP-RK3568开发板使用手册目录
- 2011年成都信息工程学院第二季极客大挑战逆向第二题Crackwho破文
热门文章
- python多变量非线性拟合_python实现多变量线性回归(Linear Regression with Multiple Variables)...
- H5画布不显示图片的问题解决
- iOS之使用CoreImage进行人脸识别
- Mongodb 4.0+安装
- Microsoft Visual Studio 2012 添加实体数据模型
- Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传
- 《OpenStack实战》——第1章 介绍OpenStack 1.1OpenStack是什么
- 手把手 | 教你爬下100部电影数据:R语言网页爬取入门指南
- 面试高频题:单链表的逆置操作/链表逆序
- Hyper-v 3.0虚拟化平台群集共享磁盘无法failover的故障