首页 > 学技术 > 技术网文 > Web服务器 > 正文

[原创] [安装配置] Tomcat JK(NOT JK2) Apache2 带SSL/vHost 整合


来源 chinaunix.net 酷勤网整理

# ver 1.0  by jhsea3do (Jul.9th.2005)
# 本文仅涉及配置,不涉及各插件的安装
# 本文适合对apache配置比较熟悉的朋友,文中配置内容均最为最简化,但附有注释,请自行修改添加内容
# 本文参考文档为apache网站的官方文档,对于文中没有涉及或者不解之处请多参考该文档。
# 本文中的调试环境将在下面提到,但应该同样适合于其他环境,比如linux, tomcat4, 本文可能对apache 1.x 不适用
# 如转载本文,请注明作者为 jhsea3do@gmail.com, 谢谢

=========================================================


看到论坛上老有人对JK配置不解,结合我长期的使用经验,我再炒一次冷饭, 希望有问题的人能够细细品尝

另外本文中提到的JK不是指mod_jk2,jk2项目已经停止了开发和技术支持,原因是效率方面的问题,apache官方推荐使用mod_jk

以下配置为文中涉及的内容
jakarta-tomcat-5.0.30
Apache/2.0.52 (Win32) 
mod_ssl/2.0.52 OpenSSL/0.9.7e 
mod_jk/1.2.13

文章分以下三部分进行说明
1. 配置Apache虚拟主机(基于域名)
3. 配置JK
2. 配置SSL

如打算按照本文内容试验,可以先做好以下3个域名的本地解析
   

   # %windir%\system32\drivers\etc\hosts  ||  /etc/hosts
   127.0.0.1       localhost lcl.javaws.com
   192.168.1.2 www.javaws.com dyn.javaws.com
   



=========================================================

[ 本帖最后由 HonestQiao 于 2006-7-13 11:48 编辑 ]



 jhsea3do 回复于:2005-07-09 15:51:28

1. 配置Apache虚拟主机
---------------------

a. 注释httpd.conf中的以下内容,删除默认主机
   

   #ServerAdmin
   #ServerName
   #DocumentRoot
   


b. 确保vhost的支持模块被apache加载
   

   LoadModule vhost_alias_module modules/mod_vhost_alias.so
   


c. 并添加如下内容,其中3个conf文件代表了3个虚拟主机lcl, dns, dyn
   

   # Use vHost
   NameVirtualHost *:80
   NameVirtualHost *:443
   <IfModule mod_vhost_alias.c>;
     Include conf/sites/com.javaws.lcl.conf
     Include conf/sites/com.javaws.www.conf
     Include conf/sites/com.javaws.dyn.conf
   </IfModule>;
   


d. 在conf目录下建立sites目录,创建 com.javaws.lcl.conf文件,并配置lcl主机的内容
   

   # lcl.javaws.com
   #
 <VirtualHost *:80>;
   ServerAdmin jhsea3do@lcl.javaws.com
   DocumentRoot "D:/www/com/javaws/lcl"
   ServerName lcl.javaws.com
   ServerAlias 127.0.0.1 localhost # 该虚拟主机别名
   ErrorLog logs/sites/lcl.javaws.com-error_log # 注意建立在logs目录下建立相关的sites目录
   CustomLog logs/sites/lcl.javaws.com-access_log common
   #
   <Directory "D:/www/com/javaws/lcl">; 
     Options FollowSymLinks
     AllowOverride None
     Order allow,deny
     Deny from all
   </Directory>;
   #
 </VirtualHost>;
   


e. 根据上面的文件配置其他的主机内容,保存httpd.conf,重启apache2,在3个虚拟主机上放置不同的文件,应该能在浏览器中使用对应的域名访问到


 jhsea3do 回复于:2005-07-09 15:51:58

2. 配置JK
---------

a. 确保mod_jk的支持模块被apache加载
   

   LoadModule jk_module modules/mod_jk.so
   


b. 配置httpd.conf使其加载workers的配置文件(该文件为全局配置文件,请勿放入虚拟机的配置文件中)
   

   # Use mod_jk
   <IfModule mod_jk.c>;
     JkWorkersFile conf/jks/workers.properties
   </IfModule>;
   


   以下为workers.properties文件的内容
   

   # workers.properties.minimal
   #
   worker.list=localhost,jkstatus # 共有两个worker可供使用
   #
   worker.localhost1.type=ajp13 # worker localhost1 对应的 jk socket (private worker)
   worker.localhost1.host=localhost
   worker.localhost1.port=8009
   #
   worker.localhost.type=lb # worker localhost 使用负载均衡模式 (public worker)
   worker.localhost.balance_workers=localhost1 # 仅使用 localhost1 作为 localhost 的负载均衡,
   # # 如果你有多个private worker,可以放在balance中
   #
   worker.jkstatus.type=status # worker jkstatus 使用 status 模式
   


c. 编辑com.javaws.lcl.conf,配置lcl主机,使其支持 jk
   * 该配置代码应该和<Directory />;配置平级
   

   #
   <IfModule mod_jk.c>;
     JkMountFile conf/jks/jk1.com.javaws.lcl.urimaps.properties # urimaps 配置文件
     JkLogFile logs/sites/lcl.javaws.com-jk-info_log # jk的日志
     JkLogLevel info # jk的日志纪录等级
   </IfModule>;
   


   以下为jk1.com.javaws.lcl.urimaps.properties文件的内容
   

   # jk1.com.javaws.lcl.urimaps.properties
   #
   /*.jsp=localhost # 所有uri为*.jsp结尾的http请求均转交localhost worker处理
   /*.jspa=localhost # 所有uri为*.jspa结尾的http请求均转交localhost worker处理
   /*.do=localhost # 所有uri为*.do结尾的http请求均转交localhost worker处理
   /servlets/*=localhost # 所有uri为/servlets/目录下的http请求均转交localhost worker处理
   /admin/*=localhost # 所有uri为/admin/目录下的http请求均转交localhost worker处理
   #
   !/admin/*.gif=localhost # /admin/ 目录下的 gif, jpg 无需由jk处理
   !/admin/*.jpg=localhost # ...
   !/servlets/*.gif=localhost
   !/servlets/*.jpg=localhost
   #
   /jkmanager=jkstatus # 所有uri为/jkmanager/目录下的http请求均转交jkstatus worker处理
   
 

d. 启动 tomcat , 确保 tomcat 加载了 ajp13 handle

e. 保存以上配置,重启apache2, 这样可以访问对应的java uri


 jhsea3do 回复于:2005-07-09 15:52:44

3. 配置SSL(如果不需要配置,可以略过)
------------------------------------

a. 制作密钥和证书:ssl-javaws.com.crt、ssl-javaws.com.key, 确保mod_ssl的支持模块被apache加载,win32版本的bin building不提供ssl支持(出于安全考虑),请用msvc60自行编译
   

   LoadModule ssl_module modules/mod_ssl.so
   


b. 为需要SSL支持的站点配置加密的主机,比如lcl主机,可以在该主机的配置文件下加入:
   * 该配置代码应该和<VirtualHost />;配置平级
   

 <VirtualHost *:443>;
   ServerAdmin jhsea3do@lcl.javaws.com
   DocumentRoot "D:/www/com/javaws/lcl"
   ServerName lcl.javaws.com
   ServerAlias 127.0.0.1 localhost # 该虚拟主机别名
   ErrorLog logs/sites/lcl.javaws.com-error_log # 注意建立在logs目录下建立相关的sites目录
   CustomLog logs/sites/lcl.javaws.com-access_log common
   #
   <IfModule mod_ssl.c>;
     SSLEngine on
     SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNUL
     SSLCertificateFile "conf/certs/ssl-javaws.com.crt"
     SSLCertificateKeyFile "conf/certs/ssl-javaws.com.key"
     <Files ~ "\.(cgi|shtml|phtml|php3?)$">; # 对于CGI文件设置环境变量
       SSLOptions +StdEnvVars
     </Files>;
     SetEnvIf User-Agent ".*MSIE.*" \ # 对于一些浏览器设置环境变量
       nokeepalive ssl-unclean-shutdown \
       downgrade-1.0 force-response-1.0
     CustomLog logs/ssl-request_log \ # 日志纪录
       "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
   </IfModule>;
   #
   <Directory "D:/www/com/javaws/lcl">; 
     Options FollowSymLinks
     AllowOverride None
     Order allow,deny
     Deny from all
   </Directory>;
   #
 </VirtualHost>;
   


c. 配置原80端口的主机的所有请求均转发到443端口上,此处需要打开mod_rewrite
   

   LoadModule rewrite_module modules/mod_rewrite.so
   

   * 以下配置内容位于80端口虚拟主机的配置文件中,配置代码应该和<Directory />;配置平级
   

    <IfModule mod_ssl.c>;
      RewriteCond  %{REMOTE_HOST} lcl\.javaws\.com\.org$
      RedirectMatch ^/(.*) https://lcl.javaws.com/$1
      RewriteCond  %{REMOTE_HOST} localhos\.org$
      RedirectMatch ^/(.*) https://localhost/$1
      RewriteCond  %{REMOTE_HOST} 127\.0\.0\.1$
      RedirectMatch ^/(.*) https://127.0.0.1/$1
    </IfModule>;
   


d. 保存,使设置生效,开浏览器检查实际结果


=========================================================

Fin


 fei 回复于:2005-07-21 13:19:26

好文--现在还有人说用jk2呢。


 perryhg 回复于:2005-08-16 02:44:05

<VirtualHost *:443>;这个有什么意义吗?
https不支持virtualhost的,不是技术的原因,而是安全策略的原因。

补充一下,我的意思是说https不支持name-based virtualhost,使用不同的端口还是可以的。解释在这里http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts2

[ 本帖最后由 perryhg 于 2006-7-4 13:30 编辑 ]


 jhsea3do 回复于:2005-08-16 10:40:54

按我的配置方法的确可以多个https站点并存

我的确是不知道这方面相关安全策略方面的知识,你能说一下或者介绍相关的文章么?


 tony-jia 回复于:2005-09-14 09:54:24

为什么我配置虚拟主机时 需要在APACHE  和 TOMCAT里面都进行配置?
jhsea3do能帮我解答解答吗?


 小粥 回复于:2005-09-14 16:03:20

引用:原帖由 "tony-jia" 发表:
为什么我配置虚拟主机时 需要在APACHE  和 TOMCAT里面都进行配置?
jhsea3do能帮我解答解答吗?



因为apache和tomcat工作在不同的端口,两个不同的服务
你配置虚拟主机就必须两个都配置


 jhsea3do 回复于:2005-09-14 20:53:17

对于jk而言

他只是把apache收到的web请求传递给tomcat进行处理

并不是说tomcat就可以按照apache的配置来跑

所以apache和tomcat配置虚拟主机是分开来配


 perryhg 回复于:2006-07-04 01:23:07

你使用的是RedirectMatch,这个不算是虚拟主机啊,用户的浏览器会被重定向到最终指定的目标上去。这个跟<VirtualHost *:443>没有任何关系。


 perryhg 回复于:2006-07-04 01:26:56

若干年前jk2是提出要取代jk的,结果现在jk2发展不下去了,jk又成为了首选。不过现在apache2.2又有了mod_proxy_ajp


 jhsea3do 回复于:2006-07-05 17:54:38

RedirectMatch是为了约束用户只能通过443 https来访问site

这篇文章是去年7月份的了,当时httpd22好像没有正式发布,其实我现在手上有一台低负载的服务器已经用httpd22了。

同意perryhg的话,https不适合在同一个IP上多名称的虚拟器,尽管理论上可行。


 perryhg 回复于:2006-07-11 00:38:30

理论上也不可行,apache的文档里面有解释,主要是http 1.1赖以区分主机名的hostname header在传达https服务器的时候尚未被解码,因此服务器无法读出用户请求的hostname,所以无法实现基于域名的虚拟主机。

[ 本帖最后由 perryhg 于 2006-7-11 00:39 编辑 ]


 jiangjiazeng 回复于:2006-07-13 11:37:28

我在gentoo linux上直接用emerge  就可以安装apache 和mod_jk,仔细的查看了一下,配置也是真确的,可就是不行。tomcat和apache各自运行是可以的,就是在apache运行jsp的时候就是不行,奇怪的是在log里面。居然都没有jk的log文件,不知道是什么原因,希望高手支持一下,不胜感激!◎


 perryhg 回复于:2006-07-14 14:25:19

没有jk的log文件说明apache没有将jsp请求转发至tomcat


 wangrujun 回复于:2006-07-14 15:05:08

引用:原帖由 perryhg 于 2006-7-4 01:23 发表
你使用的是RedirectMatch,这个不算是虚拟主机啊,用户的浏览器会被重定向到最终指定的目标上去。这个跟<VirtualHost *:443>没有任何关系。 



楼主的这篇文章不错.
不过贴主的关于ssl不能支持虚拟主机确实是事实. ssl根本不支持域名,它只识别已经发送到主机的包.

2002年试图做支持ssl的虚拟主机,但是没有成功.当时看到过apache或是另外一个组织,声称要在ssl的下一版中解决这个问题.
看了楼主的标题,偶本以为真的出了ssl的第二版了呢.

不过楼主的文章确实写得很清楚,不错.




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=574865
转载请注明作者名及原文出处



收藏本页到: