【问题标题】:access web container through Apache webserver Port 80 using mod_jk?使用 mod_jk 通过 Apache webserver 端口 80 访问 web 容器?
【发布时间】:2012-02-10 00:16:34
【问题描述】:

我安装了 GlassFish 3.1.1 并使用 mod_jk 将其设置为与 Apache Webserver 2.2.x 一起使用。使用端口 8080 时一切正常。例如,部署在 GlassFish 上的 example hello.war application 运行良好:

http://www.mydomain.com:8080/hello/

我的问题是,我需要更改(或添加)什么,以便我可以使用这样的地址(并使用端口 80;因此我最终可以关闭端口 8080)访问 hello.war 应用程序:

http://www.mydomain.com/hello/

目标是让所有外部流量通过 Apache 网络服务器端口 80 访问 GlassFish。以this site's instructions 为灵感,我修改了 httpd.conf 以包含以下几行(在 www.mydomain.com 的预先存在的 VirtualHost 标记内)

JkMount /hello/* worker1
JkMount /hello worker1

然后我重新启动 Apache 网络服务器并转到:

http://www.mydomain.com/hello

网站挂起(旋转 30 秒)。可能是什么问题呢? Apache 和 Glassfish 之间没有防火墙,没有负载平衡,也没有集群。这是一个全新安装的全新 CentOS 6.2 服务器。

作为参考,我的 httpd.conf 文件包括以下内容(除其他外):

LoadModule jk_module /etc/httpd/modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/workers.properties
JkLogFile /etc/httpd/logs/mod_jk.log
JkLogLevel debug
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
...
Listen 0.0.0.0:80

glassfish-jk.properties 文件是:

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

更新:2012 年 2 月 11 日晚上 8:30 我修复了上面发布的原始问题。出现问题的原因是(1)有一个 GlassFish 错误(有关此发现,请参阅下面 Kevin 的回答),以及(2)我不知何故设法设置了多个正在侦听同一端口 8009 的 http 侦听器。当我删除所有听众然后创建我想要的一个听众,我能够解决这个帖子的初衷。但是在查看 server.log 时,我发现另一个问题...

当我启动 GlassFish 服务器时,我发出以下命令(注意:端口 4850 只是 GlassFish 提供的一个管理 Web 控制台;它需要用于某些命令(不确定是哪些命令)但它没有'似乎对所有人都没有伤害):

# ./asadmin
asadmin> asadmin start-domain --port 4850
asadmin> deploy /path/to/file/hello.war --port 4850
asadmin> create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server gf_listener --port 4850 
asadmin> create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector --port 4850
asadmin> set server-config.network-config.network-listeners.network-listener.jk-connector.jk-configuration-file=/home/glassfish/glassfish3/glassfish/domains/domain1/config/glassfish-jk.properties --port 4850
asadmin> restart-domain --port 4850

以上命令直接取自GlassFish Administration Guide(点击PDF链接,转到第150页。这将启动“启用mod_jk”部分,具体参见第151页的步骤5和6)。

我在下面的 GlassFish 服务器日志中包含了一个 sn-p,显示了一种严重错误和一个最大线程数太低的警告。

[#|2012-02-11T20:23:23.666-0800|INFO|glassfish3.1.1|javax.enterprise.system.core.com.sun.enterprise.v3.services.impl|_ThreadID=14;_ThreadName=Thread-2;|Grizzly Framework 1.9.36 started in: 43ms - bound to [0.0.0.0:8080]|#]
[#|2012-02-11T20:23:23.666-0800|INFO|glassfish3.1.1|javax.enterprise.system.core.com.sun.enterprise.v3.services.impl|_ThreadID=11;_ThreadName=Thread-2;|Grizzly Framework 1.9.36 started in: 6ms - bound to [0.0.0.0:3700]|#]
[#|2012-02-11T20:23:23.666-0800|INFO|glassfish3.1.1|javax.enterprise.system.core.com.sun.enterprise.v3.services.impl|_ThreadID=12;_ThreadName=Thread-2;|Grizzly Framework 1.9.36 started in: 24ms - bound to [0.0.0.0:4850]|#]
[#|2012-02-11T20:23:23.668-0800|INFO|glassfish3.1.1|javax.enterprise.system.core.com.sun.enterprise.v3.services.impl|_ThreadID=15;_ThreadName=Thread-2;|Grizzly Framework 1.9.36 started in: 2ms - bound to [0.0.0.0:7676]|#]
[#|2012-02-11T20:23:23.691-0800|INFO|glassfish3.1.1|javax.enterprise.system.core.com.sun.enterprise.v3.admin.adapter|_ThreadID=10;_ThreadName=Thread-2;|The Admin Console is already installed, but not yet loaded.|#]
[#|2012-02-11T20:23:23.781-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0169: Created HTTP listener [http-listener-1] on host/port [0.0.0.0:8080]|#]
[#|2012-02-11T20:23:23.788-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0169: Created HTTP listener [http-listener-2] on host/port [0.0.0.0:8181]|#]
[#|2012-02-11T20:23:23.793-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0169: Created HTTP listener [admin-listener] on host/port [0.0.0.0:4850]|#]
[#|2012-02-11T20:23:23.803-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0170: Apache mod_jk/jk2 attached to virtual-server [server]  listening on port [8,009]|#]
[#|2012-02-11T20:23:23.806-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0170: Apache mod_jk/jk2 attached to virtual-server [server]  listening on port [8,009]|#]
[#|2012-02-11T20:23:23.826-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0171: Created virtual server [server]|#]
[#|2012-02-11T20:23:23.828-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0171: Created virtual server [__asadmin]|#]
[#|2012-02-11T20:23:24.316-0800|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=10;_ThreadName=Thread-2;|WEB0172: Virtual server [server] loaded default web module []|#]
[#|2012-02-11T20:23:24.416-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker.worker1 worker|#]
[#|2012-02-11T20:23:24.416-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker.worker1 worker|#]
[#|2012-02-11T20:23:24.416-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker worker|#]
[#|2012-02-11T20:23:24.416-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker.worker1 worker|#]
[#|2012-02-11T20:23:24.417-0800|INFO|glassfish3.1.1|org.apache.jk.common.ChannelSocket|_ThreadID=10;_ThreadName=Thread-2;|JK: ajp13 listening on /0.0.0.0:8009|#]
[#|2012-02-11T20:23:24.426-0800|WARNING|glassfish3.1.1|org.apache.tomcat.util.threads.ThreadPool|_ThreadID=10;_ThreadName=Thread-2;|threadpool.max_threads_too_low|#]
[#|2012-02-11T20:23:24.428-0800|INFO|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|Jk running ID=0 time=0/25  config=null|#]
[#|2012-02-11T20:23:24.434-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker.worker1 worker|#]
[#|2012-02-11T20:23:24.434-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker.worker1 worker|#]
[#|2012-02-11T20:23:24.435-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker worker|#]
[#|2012-02-11T20:23:24.435-0800|SEVERE|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|No class name for worker.worker1 worker|#]
[#|2012-02-11T20:23:24.435-0800|INFO|glassfish3.1.1|org.apache.jk.common.ChannelSocket|_ThreadID=10;_ThreadName=Thread-2;|JK: ajp13 listening on /0.0.0.0:8009|#]
[#|2012-02-11T20:23:24.436-0800|WARNING|glassfish3.1.1|org.apache.tomcat.util.threads.ThreadPool|_ThreadID=10;_ThreadName=Thread-2;|threadpool.max_threads_too_low|#]
[#|2012-02-11T20:23:24.436-0800|INFO|glassfish3.1.1|org.apache.jk.server.JkMain|_ThreadID=10;_ThreadName=Thread-2;|Jk running ID=0 time=0/3  config=null|#]
and so on...

有人知道如何消除No class name for worker.worker1 worker 的严重错误,以及如何消除threadpool.max_threads_too_low WARNING?

他们指的是哪个线程池?例如,当我输入:asadmin> list-threadpools server 时,我得到以下信息:

admin-thread-pool
http-thread-pool
thread-pool-1

我将 http-thread-pool 大小从默认值 5 更改为值 200,然后重新启动 GlassFish 并查看 server.log 文件......没有任何变化(仍然收到上面相同的错误消息)。 admin-thread-pool 的最大线程数为 50,thread-pool-1 的最大线程数为 200。有什么办法解决这个问题吗?

【问题讨论】:

    标签: glassfish


    【解决方案1】:

    你的上下文根是什么?你的应用是否响应 uri "/glassfish-test" 或 "/hello" ?

    如果是“/hello”,先尝试一些简单的东西,成功后你可以尝试重定向

    JkMount /hello/* worker1

    更新:刚刚看到您的错误消息。确保 glassfish 确实在监听 8009 端口。

    【讨论】:

    • 我不知道上下文根是什么。除了我在上面为端口 8080 提供的 URL 之外,我不知道如何判断应用程序响应的内容。我发出命令让 GlassFish HTTP 侦听器在端口 8009 上,侦听器地址为 0.0.0.0,在端口 8009 上设置网络侦听器jkenabled 为真。你知道我可以输入一个命令来验证它们是否启动了吗?
    • 以下哪个网址有效? _ mydomain.com:8080/hello _ mydomain.com:8080/glassfish-test/hello 你可以对 8009 做一个 netstat 和 grep 来确保它在 8009 端口上监听
    • 这个网址可以正常工作:www.mydomain.com:8080/hello/ 如果我输入“netstat |grep 8009”(作为 root 用户),则不会返回任何内容。那是正确的 netstat 命令/格式吗?但是,如果我尝试从 GlassFish "create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server gf_listener" 发出,那么 GlassFish 会抱怨它无法创建侦听器,因为已经存在一个侦听器。 “create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector”的故事相同
    • 如果我简单地键入 netstat,我会看到一个很长的列表,并且该列表中的一行具有:Proto = TCP,Local Address = localhost:8009 和 Foreign Address = localhost:34686,State =已确立的。这足以说明听众在那里吗?
    • 如果 "/hello" 是有效的 uri,您需要将 "/hello" 添加到 JkMount,如上所示。
    【解决方案2】:

    在 GlassFish 开源论坛的帮助下终于弄清楚了问题所在(总结如下,供其他人参考)。在上面的原始帖子中,我使用了:

    问题 #1(mod_jk 和 GlassFish 之间的 AJP 连接断开,原始发布的问题)

    # ./asadmin
    asadmin> asadmin start-domain --port 4850
    asadmin> deploy /path/to/file/hello.war --port 4850
    asadmin> create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs  server gf_listener --port 4850 
    asadmin> create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector --port 4850
    asadmin> set server-config.network-config.network-listeners.network-listener.jk-connector.jk-configuration-file=/home/glassfish/glassfish3/glassfish/domains/domain1/config/glassfish-jk.properties --port 4850
    asadmin> restart-domain --port 4850
    

    这来自管理员指南。虽然 HTML 文件是正确的 here (http://docs.oracle.com/cd/E18930_01/html/821-2416/gfaad.html),但如果您选择 PDF 并转到第 151 页,则步骤 5 使用变量称为 listener-name。然而,这个 listener-name 必须同意在步骤 6 中使用 jk-connector。因此 listener-name 必须是步骤 5 中的 jk-connector,或者 jk-第 6 步中的连接器必须是第 5 步中的 listener-name。就我而言(请参阅上面的原始发布代码),我在第 5 步中将 listener-name 设置为 gf_listener 并使用步骤 6 中的 jk-connector。这造成了两个侦听器正在侦听同一端口的情况,这是不允许的。更好的解决方案是简单地避免发出 create-http-server 命令,该命令已被弃用并且仅出于向后兼容性而显示(尽管没有这样记录)。

    问题 #2(上述严重错误)

    另一个问题是worker属性必须进入文件~/apache/conf/worker.properties,并且所有连接器属性(例如和NO worker属性)都进入domain-dir/conf/glassfish-jk。属性文件。这很令人困惑,因为第 153 页示例 6-7 上方的 PDF 文档明确声明了 This example shows a workers.properties or glassfish-jk.properties file that is set for load balancing...,它们在 glassfish-jk.properties 文件中显示设置工作者属性的位置。这是错误的(鉴于上面在同一文档中使用的目录结构和命令)。

    问题 #3(上面提到的线程池警告)

    我消除了 threadpool.max_threads_too_low 的警告,因为我错误地增加了 Web 控制台中的默认配置而不是服务器配置的设置(在我增加服务器配置的设置后,警告消失了)。增加这个值可以在命令行中完成,甚至更容易使用 Web 管理控制台(配置 > 服务器配置 > 线程池)。命令行方式为:

    configs.config.server-config.thread-pools.thread-pool.http-thread-pool.max-thread-pool-size=200
    

    200 个线程(示例)。

    解决方案:

    这是我对 GlassFish 的最后完整的介绍:

    asadmin> start-domain
    asadmin> deploy /home/glassfish/apps/hello.war
    asadmin> create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector
    asadmin> set server-config.network-config.network-listeners.network-listener.jk-connector.jk-configuration-file=/home/glassfish/glassfish3/glassfish/domains/domain1/config/glassfish-jk.properties
    asadmin> restart-domain
    

    注意:没有 create-jvm-options 设置(如上面的管理指南 PDF 中的第 7 步),因为这与此处不再使用的 http-listener 有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 2019-09-03
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2016-06-10
      相关资源
      最近更新 更多