Apache实现Tomcat集群的负载均衡

The Apache HTTP Server(httpd) Project is an effort to develop and maintain an open-source HTTP server for modern operating systems including UNIX and Windows. The goal of this project is to provide a secure, efficient and extensible server that provides HTTP services in sync with the current HTTP standards.——摘自Apache HTTP server官网

如上所示,Apache(httpd)是个HTTP服务器,与tomcat不同的是,它只支持HTML页面的渲染,不能解释java程序(jsp、servlet)。但Apache除了作为一个高性能的HTTP容器以外,还能具有认证授权、访问控制、SSI插入、反向代理等功能,利用其反向代理功能可以实现对Tomcat集群的负载均衡。其原理图如下:

Apache实现Tomcat集群的负载均衡​​​

 

1 apache配置

下载Apache2,4 ,目录结构如下:

修改conf/httd.xml

  1. 将c:/Apache24全部替换成自己的安装路径(本文中为D:/Apache24)
  2. 修改Apache的默认端口:搜索Listen 80,修改端口(本文为8181)
  3. 修改服务域名:全局搜索#ServerName 去掉注释,修改为 hostname:port(本文为localhost:8181)
  4. 开放权限
    LoadModule access_compat_module modules/mod_access_compat.so
    LoadModule actions_module modules/mod_actions.so
    LoadModule alias_module modules/mod_alias.so
    LoadModule allowmethods_module modules/mod_allowmethods.so
    LoadModule asis_module modules/mod_asis.so
    LoadModule auth_basic_module modules/mod_auth_basic.so
    #LoadModule auth_digest_module modules/mod_auth_digest.so
    #LoadModule auth_form_module modules/mod_auth_form.so
    #LoadModule authn_anon_module modules/mod_authn_anon.so
    LoadModule authn_core_module modules/mod_authn_core.so
    #LoadModule authn_dbd_module modules/mod_authn_dbd.so
    #LoadModule authn_dbm_module modules/mod_authn_dbm.so
    LoadModule authn_file_module modules/mod_authn_file.so
    #LoadModule authn_socache_module modules/mod_authn_socache.so
    #LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so
    #LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
    LoadModule authz_core_module modules/mod_authz_core.so
    #LoadModule authz_dbd_module modules/mod_authz_dbd.so
    #LoadModule authz_dbm_module modules/mod_authz_dbm.so
    LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
    LoadModule authz_host_module modules/mod_authz_host.so
    #LoadModule authz_owner_module modules/mod_authz_owner.so
    LoadModule authz_user_module modules/mod_authz_user.so
    LoadModule autoindex_module modules/mod_autoindex.so
    #LoadModule brotli_module modules/mod_brotli.so
    #LoadModule buffer_module modules/mod_buffer.so
    #LoadModule cache_module modules/mod_cache.so
    #LoadModule cache_disk_module modules/mod_cache_disk.so
    #LoadModule cache_socache_module modules/mod_cache_socache.so
    #LoadModule cern_meta_module modules/mod_cern_meta.so
    LoadModule cgi_module modules/mod_cgi.so
    #LoadModule charset_lite_module modules/mod_charset_lite.so
    #LoadModule data_module modules/mod_data.so
    #LoadModule dav_module modules/mod_dav.so
    #LoadModule dav_fs_module modules/mod_dav_fs.so
    #LoadModule dav_lock_module modules/mod_dav_lock.so
    #LoadModule dbd_module modules/mod_dbd.so
    #LoadModule deflate_module modules/mod_deflate.so
    LoadModule dir_module modules/mod_dir.so
    #LoadModule dumpio_module modules/mod_dumpio.so
    LoadModule env_module modules/mod_env.so
    #LoadModule expires_module modules/mod_expires.so
    #LoadModule ext_filter_module modules/mod_ext_filter.so
    #LoadModule file_cache_module modules/mod_file_cache.so
    #LoadModule filter_module modules/mod_filter.so
    #LoadModule http2_module modules/mod_http2.so
    #LoadModule headers_module modules/mod_headers.so
    #LoadModule heartbeat_module modules/mod_heartbeat.so
    #LoadModule heartmonitor_module modules/mod_heartmonitor.so
    #LoadModule ident_module modules/mod_ident.so
    #LoadModule imagemap_module modules/mod_imagemap.so
    LoadModule include_module modules/mod_include.so
    #LoadModule info_module modules/mod_info.so
    LoadModule isapi_module modules/mod_isapi.so
    LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
    LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
    LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
    #LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
    #LoadModule ldap_module modules/mod_ldap.so
    #LoadModule logio_module modules/mod_logio.so
    LoadModule log_config_module modules/mod_log_config.so
    #LoadModule log_debug_module modules/mod_log_debug.so
    #LoadModule log_forensic_module modules/mod_log_forensic.so
    #LoadModule lua_module modules/mod_lua.so
    #LoadModule md_module modules/mod_md.so
    #LoadModule macro_module modules/mod_macro.so
    LoadModule mime_module modules/mod_mime.so
    #LoadModule mime_magic_module modules/mod_mime_magic.so
    LoadModule negotiation_module modules/mod_negotiation.so
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule proxy_connect_module modules/mod_proxy_connect.so
    #LoadModule proxy_express_module modules/mod_proxy_express.so
    #LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
    LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
    #LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
    #LoadModule proxy_html_module modules/mod_proxy_html.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    #LoadModule proxy_http2_module modules/mod_proxy_http2.so
    #LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
    #LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
    #LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
    #LoadModule ratelimit_module modules/mod_ratelimit.so
    #LoadModule reflector_module modules/mod_reflector.so
    #LoadModule remoteip_module modules/mod_remoteip.so
    #LoadModule request_module modules/mod_request.so
    #LoadModule reqtimeout_module modules/mod_reqtimeout.so
    #LoadModule rewrite_module modules/mod_rewrite.so
    #LoadModule sed_module modules/mod_sed.so
    #LoadModule session_module modules/mod_session.so
    #LoadModule session_cookie_module modules/mod_session_cookie.so
    #LoadModule session_crypto_module modules/mod_session_crypto.so
    #LoadModule session_dbd_module modules/mod_session_dbd.so
    LoadModule setenvif_module modules/mod_setenvif.so
    #LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
    LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
    #LoadModule socache_dbm_module modules/mod_socache_dbm.so
    #LoadModule socache_memcache_module modules/mod_socache_memcache.so
    #LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
    #LoadModule speling_module modules/mod_speling.so
    #LoadModule ssl_module modules/mod_ssl.so
    LoadModule status_module modules/mod_status.so
    #LoadModule substitute_module modules/mod_substitute.so
    #LoadModule unique_id_module modules/mod_unique_id.so
    #LoadModule userdir_module modules/mod_userdir.so
    #LoadModule usertrack_module modules/mod_usertrack.so
    #LoadModule version_module modules/mod_version.so
    #LoadModule vhost_alias_module modules/mod_vhost_alias.so
    #LoadModule watchdog_module modules/mod_watchdog.so
    #LoadModule xml2enc_module modules/mod_xml2enc.so
  5. 添加代理
    <VirtualHost *:8181>  
             ServerAdmin [email][email protected][/email]  
    		 DocumentRoot "D:/Apache24"
    		 ServerName localhost  
    	     ServerAlias localhost  
    	     ProxyPass / balancer://mycluster/ stickysession=JSESSIONID nofailover=Off  
             ProxyPassReverse / balancer://mycluster/  
    	     ErrorLog "logs/error.log"  
    	     CustomLog "logs/access.log" common
    ProxyRequests Off  
    <proxy balancer://mycluster>  
    		#加入需要负载均衡的服务地址 loadfactor为权重 route的路由地址后续在tomcat中配置
             BalancerMember http://127.0.0.1:8080 loadfactor=1 route=tomcat8_node1  
       	     BalancerMember http://127.0.0.1:8081 loadfactor=1 route=tomcat8_node2  
    	    # status=+H为配置热备,当所有机器都over时,才会请求该机器  
    	    #BalancerMember http://172.16.1.135:8009 status=+H  
    	    #按照请求次数均衡(默认)  
    	    #ProxySet lbmethod=byrequests  
    	    #按照权重  
            ProxySet lbmethod=bytraffic  
    	    #按负载量,也就是往负载少的派发新请求  
    	    #ProxySet lbmethod=bybusyness    
    </proxy>  
    </VirtualHost>
  6. 管理员模式下cd到/bin目录下执行 httpd.exe -k install -n apache24安装服务

  7. 通过services.msc启动服务

2 配置tomcat集群

2.1 配置web应用

在web.xml文件中添加<distributable/> 

distributable 元素为空标签,它的存在与否可以指定站点是否可分布式处理。如果web.xml中出现这个元素,则代表站台在开发时已经被设计为能在多个JSP Container 之间分散执行。

2.2 配置Tomcat

        对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话信息是这些数据中最重要的一块。要实现这一点, 大体上有两种方式:
      一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据;
     另一种就是在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据。

     在实际工作中,搭建tomcat集群实现session共享通常几种方法:

   (1)使用tomcat自带的cluster方式

   (2)利用Nginx的基于IP的hash路由策略

   (3) 利用nginx插件实现tomcat集群和session同步

   (4)利用memcached实现(MSM工具)

   (5)利用redis实现

   (6)利用filter方法实现

   (7)利用terracotta服务器共享session

    本文主要验证httpd+tomcat实现负载均衡,因此采用第一种方式。

    在tomcat conf/server.xml文件中添加<cluster>标签,具体配置在下。

3 实战

本文通过两台tomcat8搭建集群,分别为tomcat1、tomcat2.

tomcat1端口配置

<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

   配置集群:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                  channelSendOptions="6">
              <Manager className="org.apache.catalina.ha.session.BackupManager"
                    expireSessionsOnShutdown="false"
                    notifyListenersOnReplication="true"
                    mapSendOptions="6"/>
           <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                         bind="127.0.0.1"
                         address="228.0.0.4"
                         port="45564"
                         frequency="500"
                         dropTime="3000"/>
             <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                       address="auto"
                       port="4001"
                       selectorTimeout="100"
                       maxThreads="6"/>
             <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
               <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" timeout="60000"/> 
             </Sender>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
           </Channel>
           <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                  filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
           <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
	 </Cluster>

    web应用首页:

<html>
<body>
<h2>Hello World----1! </h2>
</body>
</html>

    tomcat2配置:

<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

配置集群:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                  channelSendOptions="6">
              <Manager className="org.apache.catalina.ha.session.BackupManager"
                    expireSessionsOnShutdown="false"
                    notifyListenersOnReplication="true"
                    mapSendOptions="6"/>
           <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                         bind="127.0.0.1"
                         address="228.0.0.4"
                         port="45564"
                         frequency="500"
                         dropTime="3000"/>
             <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                       address="auto"
                       port="4002"
                       selectorTimeout="100"
                       maxThreads="6"/>
             <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
               <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" timeout="60000"/> 
             </Sender>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
           </Channel>
           <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                  filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
           <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
	 </Cluster>

注意:与tomcat1不同的是receiver中端口为4002

web应用首页:

<html>
<body>
<h2>Hello World----2! </h2>
</body>
</html>

配置好后,依次启动Apache服务、tomcat1、tomcat2

依次访问http://localhost:8181/zzzzzz/,可以发现会依次访问tomcat1和tomcat2 

本文采用的负载均衡策略为bytraffic按照权重模式,同时设置两个服务的权重都为1,因此表现为依次访问服务,选择不同的均衡策略将会有不同的表现,读者有兴趣可以各自尝试。

欢迎各位读者勘正!

猜你喜欢

转载自blog.csdn.net/asde1239/article/details/82386107
今日推荐