您的位置:首页 > 运维架构 > Tomcat

关于Nginx+tomcat集群配置

2016-11-08 16:21 621 查看
关于Nginx+tomcat集群配置

前言

本文档主要采用Nignx+tomcat,实现负载均衡和tomcat集群配置,并解决tomcat之间session共享问题。

本方案中,session共享问题,采取tomcat自带方式解决方案。即节点成员是通过组播的心跳来建立的。所以,若要拆分集群,可以通过改变组播地址和端口来实现。

心跳包括了ip地址和tomcat监听的session复制的TCP端口。所有信息的交互都是通过tcp协议实现的。

配置准备

本案例中,主要采取三台虚拟机实现集群配置,具体配置如下。

[align=center]序号[/align]
[align=center]机器名[/align]
[align=center]系统[/align]
[align=center]内存[/align]
[align=center]应用[/align]
[align=center]IP[/align]
[align=center]1[/align]
[align=center]nginx[/align]
[align=center]ubuntu 16.04 LTS[/align]
[align=center]1G[/align]
[align=center]nginx[/align]
[align=center]192.168.80.130[/align]
[align=center]2[/align]
[align=center]tomcat1[/align]
[align=center]ubuntu 16.04 LTS[/align]
[align=center]1G[/align]
[align=center]tomcat[/align]
[align=center]192.168.80.131[/align]
[align=center]3[/align]
[align=center]tomcat1[/align]
[align=center]ubuntu 16.04 LTS[/align]
[align=center]1G[/align]
[align=center]tomcat[/align]
[align=center]192.168.80.132[/align]
其中Nginx版本:
nginx/1.9.9;tomcat版本:apache-tomcat-7.0.72;JDK版本:1.8.0_101。各个软件环境的安装此处不再赘述。

配置安装

Nginx负载均衡配置

此处将192.168.80.130作为Nginx节点。192.168.80.131、192.168.80.132作为tomcat节点。实现负载均衡。即修改nginx的配置文件:nginx.conf。修改后的配置文件如下所示。

<pre name="code" class="html">#user www www;
worker_processes 1;
#pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 1024;
events
{
use epoll;
worker_connections 1024;
}
http
{
include       mime.types;
default_type  application/octet-stream;
fastcgi_intercept_errors on;
charset  utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush     on;

keepalive_timeout 65;

tcp_nodelay on;
client_body_buffer_size  512k;

proxy_connect_timeout    5;
proxy_read_timeout       60;
proxy_send_timeout       5;
proxy_buffer_size        16k;
proxy_buffers            4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;

gzip on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types       text/plain application/x-javascript text/css application/xml;
gzip_vary on;

###2012-12-19 change nginx logs
log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"  $request_time $remote_addr';

upstream www.test.com {
server 192.168.80.131:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.80.132:8080 weight=1 max_fails=2 fail_timeout=30s;
}

####chinaapp.sinaapp.com
server {
listen 80;
server_name  www.test.com;
index index.jsp index.html index.htm;
#发布目录/data/www
root  /data/www;

location /
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host  $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www.test.com;   #此处需要和upstream保持一致
expires      3d;
}
}
}




此处配置参数具体信息,暂未弄清楚。日后详细查阅。其中upstream为负载均衡节点配置。

Tomcat集群配置

此处集群配置最简单的解决方法为取消server.xml中Cluster的注释(取消如图中红色标记部分)。

但是根据查阅相关资料描述:通过上面的配置,可以实现使用DeltaManager来实现session的all-to-all的复制。所谓的all-to-all复制是一个节点的session将会被复制到所有的其他的节点[Bruce1] 。这在小集群当中是相当有效的,但是当存在大集群的时候,也就是集群中有很多的tomcat节点的时候,我们不推荐这么做。当使用delta
manager进行session复制的时候,即使节点中没有应用部署,session也会被复制。

避免这种情况的办法,你可以使用BackManager。该管理器只会将session复制到备份节点中。并且只会复制到部署应用的节点中。故采取的配置不简单是取消该段配置的注释。而是使用如下配置。

第一步:配置server.xml

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="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="192.168.80.131" 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>


注意:此处中黄色标记的为两个地址,两个端口。其中228.0.0.4为广播地址。192.168.80.131为本机的IP信息。此处配置为192.168.80.131机器的配置。如果为192.168.80.132机器的配置,直接将192.168.80.131修改成192.168.80.132即可。

为了方便访问。直接将tomcat的默认项目修改。修改配置如下所示。

<Context path="/" docBase="oems" reloadable="false"></Context>


第二步:修改项目的web.xml

直接在web.xml中添加如下配置即可。此处一定要记住,要修改。具体作用暂不清楚。添加配置节点如下。

<distributable/>


至此,tomcat集群已经配置好。负载均衡已经配置好。测试。

如上所示:负载均衡和session共享配置成功。
3.总结
注意事项:
a.集群中所有服务器要时间同步。
b.一定要修改web.xml文件中的节点配置信息。
c.放在session中的对象一定要序列化,即实现java.io.Serializable接口
d. 使用简单的配置信息时,适合集群不大的情况。
e. 集群服务器一定要能收到非127.0.0.1的ip信息,即各台服务器上,通过java.net.InetAddress.getLocalHost().getHostAddress()一定能够获得非127.0.0.1的ip地址,用来收听集群消息。
出错点:
在tomcat中加入jvmRoute="jvm1"后,集群共享失败。目前未知其原因。待日后探索。
在tomcat中使用memcached 实现session级别的共享,共享失败。首先出现版本问题。后阶段共享失败。具体原因未知。待日后探索。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat nginx ubuntu session