使用mod_jk通过Apache webserver端口80访问Web容器?

时间:2012-02-10 00:16:34

标签: glassfish

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

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

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

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

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

JkMount /hello/* worker1
JkMount /hello worker1

然后我重启Apache webserver并转到:

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

更新时间:2/11/2012 8:30 pm我修复了上面发布的原始问题。之所以出现这样的问题,是因为(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服务器日志中包含了一个片段,其中显示了一种类型的SEVERE错误,以及针对最大线程的警告太低。

[#|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警告?

他们指的是哪个线程池?例如,当我输入:asadmin> list-threadpools服务器,我得到以下内容:

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.任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

如果是“/ hello”,请首先尝试一些简单的方法,然后在它工作后尝试重定向

JkMount / hello / * worker1

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

答案 1 :(得分:1)

最后在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 的变量。但是,此侦听器名称必须同意在步骤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页的PDF文档示例6-7明确指出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管理控制台(Configuration> server-config>线程池)更轻松地完成。命令行方式是:

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有关。