为什么要这么做
源于最近一个新项目上线运行,项目初期的磨合阶段,问题肯定源源不断,版本迭代也就比较频繁,但是为了不影响用户使用,只能选择大半夜更新(大家都睡了,唯有你挑灯夜战),为了保证睡眠,自然就得想解决方案了。
准备阶段
服务器系统:ubuntu14.04
tomcat版本:tomcat7
nginx
1)由于项目是基于tomcat运行的,那么首先我们需要在服务器上安装两个tomcat,官网下载tar.gz包,拷贝到服务器的两个文件夹下解压即可(这个文件夹的位置,名称可按照自己的习惯随意创建)。
2)解压之后,其中一个tomcat保持不动,另一个需要修改conf文件夹下server.xml文件中四个端口。
8005:负责监听关闭tomcat的请求
8080:服务器连接器的端口号,该连接器将在指定端口侦听来自客户端的请求
8009:负责和其他HTTP服务器建立连接,把Tomcat和其他http服务器集成时需要用到此连接器
8443:服务器扎鞥在处理http请求时收到一个SSL传输请求后重定向的端口号
本人的习惯都是在原来的基础上加1
3)安装nginx,直接apt -get即可安装
配置阶段
1)nginx配置
修改etc/nginx目录下的nginx.conf文件,在http{}中增加如下内容:
upstream tomcat {
#ip_hash
server localhost:8080 weight=1;
server localhost:8081 weight=1;
}
server {
listen 89;
server_name localhost 127.0.0.1;
location / {
location ~*/项目名/ {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host:89;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://tomcat;
}
}
}
以上配置有两点需要注意的
A.反向代理的地址与upstream命名的需保持一致;
B.当你不想使用nginx默认的80端口时,$host后面必须显式的加上端口号,否则你会发现你的项目跑不起来。
有很多人建议自己新增加一个conf文件,不要再原来的文件中修改,这也是个很好的提议,避免改动比较乱造成不必要的麻烦。
好了,至此负载均衡已经实现,但是这并不能解决问题,我们的session呢,停了一个服务,session就没了,这时候我们就要来实现session的持久化了。
2) tomcat的session赋值
修改tomcat安装路径conf文件夹下的server.xml文件
在<Engine name= "Catalina" defaultHost="localhost">下方增加如下内容:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
另个tomcat的server.xml均需要修改,Receiver的port端口需设置的不一样,老习惯,我又是加1.
同时项目的web.xml需增加<distributable>以支持集群。
配置完成了,下一步是要改成用redis。
----------------------------------------分割线----------------------------------------------
redis安装
1.ubutun命令行直接从官网下载
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
2.解压后,进入目录编译
cd redis-4.0.2
make
3.安装
make install
4.运行测试
make test
运行时可能会报错:You need tcl 8.5 or newer in order to run the Redis test需要安装tcl
1)wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
2)解压 tar xzcf tcl8.6.1-src.tar.gz
3) cd /usr/local/tcl8.6.1/unix
4) sudo ./configure
5) sudo make
6) sudo make install
还会有其他的报错,但是我都没管(2017-11-6 目前是菜鸟,redis的具体使用还不了解,所以出了错也没管,反正后面的session共享可以实现了)
开启redis
make之后,在redis-4.0.2/src目录下会出现redis-server服务程序和redis-cli客户端程序,将redis-4.0.2/redis.conf复制到src目录下
1)启动服务端 ./redis-server redis.conf
打开另一个终端测试 ./redis-cli
测试运行
127.0.0.1:6379>setname
111OK127.0.0.1:6379>
get name"111"127.0.0.1:6379>2)启动
make install之后会安装目录到/usr/local/bin下,新建一个/etc/redis目录,将配置文件redis.conf拷贝到该目录下,将daemonize no改为daemonize yes
执行命令
/usr/local/bin/redis-server /etc/redis/redis.conf
redis配置
标红的jar包,需要将源码在自己需要的编译环境下编译成jar包,源码在github可以搜到
如果是tomcat8,需要修改一下源码
将 initializeSerializer()方法中如下语句:
Loader loader = null;
if (getContainer() != null) {
loader = getContainer().getLoader();
}
替换成:
Loader
loader = null;
Context context = this.getContext();
if (context != null) {
loader = context.getLoader();
}
将上述3个jar放在项目发布的tomcat文件夹的lib文件夹下,重新启动项目就配置成功了
2.要实现session共享,需要修改tomcat安装路径/conf/context.xml文件
在<Context> </Context>之间增加如下内容:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" />
注意value和manger的classname哦,需要和tomcat-redis-session-manager-1.0.jar的名称一致
同时不要忘了redis的原理哦,session中的对象需要被序列化!
本文介绍了如何在一台服务器上通过nginx实现tomcat的负载均衡,并详细阐述了配置过程,包括nginx.conf的修改和tomcat的session持久化设置。此外,还涉及了redis的安装和配置,以解决session共享问题。

1072

被折叠的 条评论
为什么被折叠?



