【问题标题】:Virtual Hosts with Tomcat + Mod JK使用 Tomcat + Mod JK 的虚拟主机
【发布时间】:2014-12-19 14:03:47
【问题描述】:

我的 cent os 服务器上有一个 tomcat(在 8080 上运行)应用程序,我可以使用 url 访问它:

SERVER_IP:8080/myapp

我的管理面板已打开

SERVER_IP:8080/myapp/admin

我有一个 apache 服务器在端口 80 上运行。

我有两个域名:

www.myapp.com
admin.myapp.com

我已经成功配置了 tomcat、mod_jk 和 apache 服务器,这样 admin.myapp.com url 就可以打开 tomcat 主页(SERVER_IP:8080)。

但我想要的是让 admin.myapp.com url 打开 SERVER_IP:8080/myapp/admin 和 www.myapp.com 打开 SERVER_IP:8080/myapp。

我需要让 apache 知道何时有请求到达 admin.myapp.com,它应该知道将请求重定向到 SERVER_IP:8080/myapp/admin。显然缺少了什么。

这是我的配置:

httpd.conf(admin.myapp.com.conf 实际上是因为它是由 plesk 面板创建的,但我认为它无关紧要)

<VirtualHost SERVER_IP:80 >
    ServerName "admin.myapp.com:80"
    ServerAlias "www.admin.myapp.com"
    ServerAlias "ipv4.admin.myapp.co"
    ServerAdmin "cuneyty@mycompany.com"
    UseCanonicalName Off

    JkMount / ajp13
    JkMount /* ajp13

    ....
</VirtualHost>

mod_jk.conf

# Load mod_jk module
# Update this path to match your modules location
LoadModule jk_module modules/mod_jk.so

# Where to find workers.properties
# Update this path to match your conf directory location
JkWorkersFile /usr/local/tomcat7/conf/workers.properties

# Where to put jk logs
# Update this path to match your logs directory location
JkLogFile /usr/local/tomcat7/logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel debug

# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"

workers.properties

# Define 1 real worker named ajp13
worker.list=ajp13

# Set properties for worker named ajp13 to use ajp13 protocol,
# and run on port 8009
worker.ajp13.type=ajp13
worker.ajp13.host=localhost
worker.ajp13.port=8009
worker.ajp13.lbfactor=50
worker.ajp13.cachesize=10
worker.ajp13.cache_timeout=600
worker.ajp13.socket_keepalive=1
worker.ajp13.socket_timeout=300

提前致谢。

【问题讨论】:

  • 我看到worker中配置了8009端口,但是tomcat在8080中运行。
  • 是的,但它是 AJP 连接器的定义,它在 8009 上运行并在我的 server.xml 中定义为

标签: apache tomcat vhosts mod-jk


【解决方案1】:

最简单的方法是使用mod_proxy
在你的 httpd.conf 中加载 mod_proxy 模块

<VirtualHost SERVER_IP:80>

     ServerName admin.myapp.com
     ServerAlias www.myapp.com
     ServerAlias www.admin.myapp.com
     ServerAlias ipv4.admin.myapp.co
     ServerAdmin cuneyty@mycompany.com
     # Any additional configuration/customization.

     RewriteEngine on
     RewriteCond %{HTTP_HOST} ^admin\.myapp\.com$ [NC]
     RewriteRule ^(.*)$ http://SERVER_IP:8080/myapp/admin/$1 [R=301,L]

     ProxyRequests Off    
     ProxyPass / ajp://SERVER_IP:8009/
     ProxyPass /myapp/ ajp://SERVER_IP:8009/myapp


</VirtualHost>

您还可以通过启用mod_proxy_balancer 来实现负载平衡。它是 mod_proxy 的扩展,用于负载平衡。

查看mod_proxymod_jk here 的优缺点

祝你好运!

【讨论】:

  • 谢谢,我试过了,但没用。相反 ProxyPass / http:// SERVER_IP:8080/ ProxyPass /myapp/ http:// SERVER_IP:8080/myapp 确实有效。但现在我遇到了一个关于为每个页面请求创建 cookie 的问题,所以我无法正确建立会话。在我的登录页面上,当我输入正确的凭据时,它不会进入错误页面(所以身份验证没问题),但它会再次重定向到登录页面,这意味着无法正确建立会话。你对此有什么想法吗?
  • 我来看看。您使用的是什么版本的 Apache?
  • 我通过添加这一行“ProxyPassReverseCookiePath /myapp /”解决了这个问题,实际答案在这里stackoverflow.com/questions/2659444/…。顺便说一句,它是 2.2。
【解决方案2】:

毕竟,我想出了这个解决方案,使用 mod_proxy 而不是 mod_jk 作为另一个答案中提到的斜线。但对我有用的是如下:

ProxyPass / http://SERVER_IP:8080/ 
ProxyPass /myapp/ http://SERVER_IP:8080/myapp

然后我为 cookie 添加了以下行:

ProxyPassReverseCookiePath /myapp /

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2012-06-21
    • 2023-03-04
    • 2012-08-13
    • 2014-04-09
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多