使用nginx负载均衡和tomcat实例实现集群

    集群:当单机处理到达极限或单机出现故障,我们能想到的就是使用备用机,就像一个篮球选手下场,让替补的上场一样。

    为了实现真的‘负载均衡’,我们的服务器宕机了,而用户端没有感觉到使用异常,请求都还可以用,保存的信息(包括用户信息和操作信息等都一样还在),只有我们后端的人知道了,机子A需要休息维护,而机子B上场顶替了。

    现在有很多方法可以实现集群,其中就有NginxApache,他们的差别我只能说Nginx的静态处理比Apache高效很多,反向代理也很方便,而Apache的rewrite即对URL的虚拟改写在很多时候也挺好用的,其他我真没怎么感受出来,因为自己之前懒,就用wamp的Apache改conf配置后就开始集群了,导致后来出现很多问题,所以这里就不写Apache的集群了。

首先要安装Nginx

window下载(下载地址:http://nginx.org/en/download.html



下载安装完成后,用cmd命令行去操作nginx服务,在命令行进入nginx 的安装目录,执行 “start nginx"命令启动nginx服务

在浏览器输入   "localhost" 显示‘welcome页面’

即表示安装成功。

安装Tomcat

Tomcat在apache官网就可以找到,要实现集群,那就要用虚拟机或是多台电脑去实现,为了让初学者更容易入门,我用的是Eclipse编译器(MyEclipse等都可以),配置好Tomcat的环境变量,并配置Eclipse里的Tomcat,尽量不要用编译器自带的Server,不要问我为什么。



这里我创建了两个tomcat服务器实例,命名为tomcat1和tomcat2,如果现在tomcat1为服务端正在使用的服务器(非分布式),则tomcat2作为我的备用机

然后修改两个Server实例的server.xml,修改内容为

Tomcat1——server.xml

<Connector connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="8443"/>

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

<Engine defaultHost="localhost" jvmRoute="ant" name="Catalina">

注意:两个Server的端口号要不一致,包括备用端口号

jvmRoute要一致,不然之后共享Session的时候会失败。

然后打开注释掉的cluster配置

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

这部分就是tomcat的server配置了,

为了方便,我把tomcat2的server.xml的关键配置也贴上

<Connector connectionTimeout="20000" port="9081" protocol="HTTP/1.1" redirectPort="8443"/>

<Connector port="9009" protocol="AJP/1.3" redirectPort="8443"/>

<Engine defaultHost="localhost" jvmRoute="ant" name="Catalina">


<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

好了,我们搞定了Tomcat配置,接下来开始配置集群。

配置集群

接下来在nginx目录下的conf文件里找到nginx.conf配置文件,注意:这个文件是配置集群的核心。

下面贴出文件的内容

#user  nobody;
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    client_header_timeout  3m;  
    client_body_timeout    3m;  
    send_timeout           3m;  

    client_header_buffer_size    1k;  
    large_client_header_buffers  4 4k;  

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    upstream localhost{  
    #Nginx是如何实现负载均衡的,Nginx的upstream目前支持以下几种方式的分配
    #1、轮询(默认)
    #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
    #2、weight
    #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    #2、ip_hash
    #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    #3、fair(第三方)
    #按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    #4、url_hash(第三方)
    #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。  
      #ip_hash; 

    #这里分别配置了Tomcat1和Tomcat2的地址,对应其端口
      server localhost:8081;  
      server localhost:9081;
     }  

    

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;


	    proxy_connect_timeout 3; 
	#nginx跟后端服务器连接超时时间(代理连接超时) 
            proxy_send_timeout 30; 
	#后端服务器数据回传时间(代理发送超时) 
            proxy_read_timeout 30; 
	#连接成功后,后端服务器响应时间(代理接收超时) 


            proxy_pass http://localhost;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


}
修改完nginx的配置后,我们则开始测试集群。

分别写两个jsp放在两个Tomcat里,我们看看集群是否成功。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<% 

   System.out.println("===========================Tomcat1");     /*    再写一个jsp,输出"===========================Tomcat2"  */


	%>
</body>
</html>

开启两个Tomcat服务器,并start nginx开启nginx服务,上面开好了就算了,然后打开浏览器,输入localhost,显示

====================Tomcat1或

====================Tomcat2,多次刷新页面,可以看到Tomcat1和Tomcat2有时会交换使用!


实现Session共享

实现集群的关键还有Session共享,比如用户现在登录后,信息保存在Tomcat1服务器里,如果Tomcat宕机了,则我们还可以继续保持Session的信息,因为Session之间的信息通过拷贝已经共享了,一台机子断开连接,我们仍可以用另一台机子继续服务用户,这样就使用户在使用客户端过程中感觉异常。


怎么做到Session共享呢,我们在前面Tomcat的jvmRoute已经说过了,要注意配置相同,不然会每当交换服务器时就会产生新的SessionId,基于上面的配置,我们当使用Java项目时,一定要配置项目下的web.xml

web.xml

加上这个<distributable/>

如果没有配置,则Session共享在这个项目无效,如果把项目搭载入两个Tomcat里,当Tomcat1换成Tomcat2时就会产生新的Session,不会进行Session共享。

搭载项目后,启动Tomcat服务器,可以在浏览器看到,不管多次刷新后的服务器是哪个,Session依旧是同一个。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值