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实现Tomcat集群的负载均衡​​​

 

1 apache配置

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

Apache实现Tomcat集群的负载均衡_第2张图片

修改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. 添加代理
      
             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  
      
    		#加入需要负载均衡的服务地址 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    
      
    

     

  6. 管理员模式下cd到/bin目录下执行 httpd.exe -k install -n apache24安装服务

  7. 通过services.msc启动服务

2 配置tomcat集群

2.1 配置web应用

在web.xml文件中添加 

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文件中添加标签,具体配置在下。

3 实战

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

tomcat1端口配置

   配置集群:


              
           
            
             
             
                
             
             
             
             
           
           
           
	 

    web应用首页:



Hello World----1!

    tomcat2配置:

配置集群:


              
           
            
             
             
                
             
             
             
             
           
           
           
	 

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

web应用首页:



Hello World----2!

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

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

Apache实现Tomcat集群的负载均衡_第3张图片

Apache实现Tomcat集群的负载均衡_第4张图片

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

 

欢迎各位读者勘正!

你可能感兴趣的:(负载均衡)