惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
B
Blog
WordPress大学
WordPress大学
Project Zero
Project Zero
P
Palo Alto Networks Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
T
Tailwind CSS Blog
Forbes - Security
Forbes - Security
F
Full Disclosure
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hacker News: Ask HN
Hacker News: Ask HN
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
O
OpenAI News
Spread Privacy
Spread Privacy
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
IT之家
IT之家
U
Unit 42
腾讯CDC
S
Security Affairs
C
Cisco Blogs
Schneier on Security
Schneier on Security
The Last Watchdog
The Last Watchdog
B
Blog RSS Feed
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss

博客园 - 高山流水200808

ubuntu安装HermesAgent接入Nous平台小米大模型和微信通道配置 沈阳2025中考各区各校人数估算 沈阳2025公办普高率分析 思科Cisco ASA5506-x防火墙内部用户无法使用PPTP连接到VPN - 高山流水200808 专利事务所信息Python爬取 对CSDN的理性吐槽 CSDN博客已经打不开了 大连交大教务一键教学评价 使用Fiddle监听HTTPS网页 证书吊销 window下Apache-http-server(httpd-2.4.12)安装与配置 tomcat7.0.55配置HTTP强制跳转到HTTPS CentOS6.6升级openssl到1.0.2a openssl生成证书链多级证书 tomcat7.0.55配置单向和双向HTTPS连接(二) KeyStore和TrustStore Widows下利用OpenSSL生成证书 tomcat7.0.55配置单向和双向HTTPS连接 HTTP/1.1标准请求方法和状态码
apache2.4+tomcat8+jk1.2.40集群配置
高山流水200808 · 2015-05-16 · via 博客园 - 高山流水200808

由于目前很多apache+tomcat集群都是在apache2.2上配置的,Apache2.4的教程几乎没有,这里写一篇记录下来。

环境:apache2.4.12(Apache Haus编译版本)、tomcat8.0.15、1.2.40版本的mod_jk.so、jdk-7u71、操作系统winxp

关于这几个软件的下载安装,这里就不多说,注意apache2.4必须安装在根目录,mod_jk必须下载Apache对应的版本

软件

笔者环境

三台xp虚拟机

1.Apache服务器,IP:192.168.116.132

2.tomcat服务器一,IP:192.168.116.133

3.tomcat服务器二,IP:192.168.116.134

一、Apache服务器配置

笔者将Apache安装在了C盘根目录下

1.将mod_jk.so复制到Apache的modules目录(笔者为C:\Apache24\modules)

2.在Apache的conf目录(笔者为C:\Apache24\conf)找到httpd.conf,在文件最后添加

include "C:\Apache24\conf\mod_jk.conf"

3.在Apache的conf目录(笔者为C:\Apache24\conf)新建文件mod_jk.conf,添加如下内容

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /*.jsp controller

这里强烈建议把JkLogLevel debug加上,否则出错找不到原因

4.在Apache的conf目录(笔者为C:\Apache24\conf)新建文件workers.properties,添加如下内容

#server
worker.list = controller     
#========tomcat1========
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.116.133
worker.tomcat1.type=ajp13 
worker.tomcat1.lbfactor=1 

#========tomcat2========
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.116.134
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1

#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.retries=3
worker.controller.balance_workers=tomcat1,tomcat2
worker.controller.sticky_session=false
worker.controller.sticky_session_force=false

二、tomcat服务器配置

打开tomcat的conf目录下的server.xml,找到AJP/1.3连接器,端口与workers.properties的worker.[名称].port设置成一致,默认是8009,在Engine里面添加jvmRoute,名称与worker.后面的名称一致,最后去掉<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>两边的注释,两个服务器配置文件大致一样,仅jvmRoute设置不一样。

tomcat服务器一:

 <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>

tomcat服务器二:

 <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">


      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>

编写文件部署到tomcat,笔者也懒得写,大家都抄来抄去的

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration"%>
<!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=UTF-8">
<title>Cluster App Test</title>
</head>
<body>
    Server Info:
    <%
    out.println(request.getLocalAddr() + " : " + request.getLocalPort()
            + "<br>");
%>
    <%
        out.println("<br> ID " + session.getId() + "<br>");
        // 如果有新的 Session 属性设置
        String dataName = request.getParameter("dataName");
        if (dataName != null && dataName.length() > 0) {
            String dataValue = request.getParameter("dataValue");
            session.setAttribute(dataName, dataValue);
        }
        out.println("<b>Session 列表</b><br>");
        System.out.println("============================");
        Enumeration e = session.getAttributeNames();
        while (e.hasMoreElements()) {
            String name = (String) e.nextElement();
            String value = session.getAttribute(name).toString();
            out.println(name + " = " + value + "<br>");
            System.out.println(name + " = " + value);
        }
    %>
    <form action="index.jsp" method="POST">
        名称:<input type=text size=20 name="dataName"> <br> 值:<input
            type=text size=20 name="dataValue"> <br> <input
            type=submit>
    </form>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>testc</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <distributable/>
</web-app>

需要注意的是web.xml里面的必须要加上<distributable/>,然后部署到两个tomcat服务器中

三、启动测试运行

先启动apache服务器,然后启动2个tomcat服务器

浏览器打开http://192.168.116.132/test/index.jsp

然而奇迹并没有出现,而是出现了404页面,提示文字为

Not Found

The requested URL /test/index.jsp was not found on this server.

接下来我们要看日志文件,看看问题出在哪里

找到jk的日志文件(C:\Apache24\logs\mod_jk.log)

直接看最后几行

[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] extension_fix_activation::jk_uri_worker_map.c (485): Checking extension for worker controller of type lb (5)
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] uri_worker_map_dump::jk_uri_worker_map.c (178): uri map dump after extension stripping: id=1, index=0 file='(null)' reject_unsafe=0 reload=60 modified=0 checked=0
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] uri_worker_map_dump::jk_uri_worker_map.c (184): generation 0: size=0 nosize=0 capacity=0
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] uri_worker_map_dump::jk_uri_worker_map.c (184): generation 1: size=1 nosize=0 capacity=4
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] uri_worker_map_dump::jk_uri_worker_map.c (197): NEXT (1) map #0: uri=/*.jsp worker=controller context=/*.jsp source=JkMount type=Wildchar len=6
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] uri_worker_map_switch::jk_uri_worker_map.c (600): Switching uri worker map from index 0 to index 1
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] jk_shm_open::jk_shm.c (168): Shared memory is already opened
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] jk_shm_attach::jk_shm.c (337): Attached shared memory memory [1] size=2560 free=0 addr=0x32bb30
[Sat May 16 20:12:38.718 2015] [2176:1048] [debug] jk_child_init::mod_jk.c (3266): Initialized mod_jk/1.2.40
[Sat May 16 20:12:38.750 2015] [2176:3584] [debug] jk_translate::mod_jk.c (3623): missing uri map for localhost:/test/index.jsp
[Sat May 16 20:12:38.750 2015] [2176:3584] [debug] jk_map_to_storage::mod_jk.c (3791): missing uri map for localhost:/test/index.jsp

通过搜索关键字missing uri map for localhost:/找到一篇文章

http://blog.csdn.net/bluecy/article/details/5897103

具体意思是在<VirtualHost>标签中添加JkMountCopy On,然而作者并没有说是哪个文件......

笔者也上谷歌搜了,也是添加这个,但就是找不到

笔者最后还是找到了这个文件,文件在C:\Apache24\conf\extra的httpd-vhosts.conf,为什么大家都不说这个啊。。。。。。笔者很是郁闷

默认情况下已经配置了一个虚拟主机

<VirtualHost _default_:80>
DocumentRoot "${SRVROOT}/htdocs"
#ServerName www.example.com:80
</VirtualHost>

然后在中间添加JkMountCopy On就行了(如果有多个要配置多个)

<VirtualHost _default_:80>
DocumentRoot "${SRVROOT}/htdocs"
#ServerName www.example.com:80
JkMountCopy On
</VirtualHost>

如果读者用的2.2版本,应该不会遇到要配置虚拟主机参数的问题。

保存之后重启apache服务器,然后在浏览器重新打开

http://192.168.116.132/test/index.jsp

F5刷新

可以看到sessionid并没有发生变化

在名称和值中分别输入1、1、2、2、3、3、4、4,可以看到如下结果

上面的测试说明,session已经能够共享,并且session里面存储的变量也能够在集群中复制。