1.Apache为什么要整合Tomcat?
事实上Tomcat本身已经提供了HTTP服务,该服务默认的端口是8080,装好tomcat后通过8080端口可以直接使用Tomcat所运行的应用程序,你也可以将端口改为80.
既然Tomcat本身已经可以提供这样的服务,我们为什么还要引入Apache或者其他的一些专门的HTTP服务器呢?原因有下面几个:
1).提升对静态文件的处理性能
2).利用Web服务器来做负载均衡以及容错
3).无缝的升级应用程序
这三点对一个Web网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个Tomcat宕机或者是升级程序导致用户访问不了,而能完成这几个功能的、最好的HTTP服务器也就只有apache的http server了,它跟tomcat的结合是最紧密和可靠的。
2.Apache融合Tomcat的三种方式
JK
http_proxy
ajp_proxy
关于这三种方式的区别和好处详见: http://www.ibm.com/developerworks/cn/ opensource/ os-lo-apache-tomcat/
3.**Apache与Tomcat的整合方式
**Apache整合Tomcat采用经典的JK模式。JK模块是通过AJP协议与Tomcat服务器进行通讯的,Tomcat默认的AJP Connector的端口是8009。
**测试环境采用Apache(1)+Tomcat(N)的方式进行转发,即root帐户下一台Apache用于请求转发,每个用户下各配置一个Tomcat部署相关的应用。
配置步骤如下(以**##系统为例):
Apache安装目录:/opt/httpd-2.2.14/
Tomcat安装目录:/home/jd-lottery/jd-lottery
(1)向/opt/httpd-2.2.14/modules下添加mod_jk.so
(2)在/opt/httpd-2.2.14/conf/httpd.conf下添加如下配置(另引入两个配置文件)
# Virtual hosts
Include conf/extra/httpd-jk.conf
Include conf/extra/httpd-vhosts.conf
(3)在httpd-jk.conf中配置如下内容
</Directory>
#<Location /jkstatus>
# Order deny,allow
# Deny from all
#</Location>
#载入监控模块
LoadModule jk_module modules/mod_jk.so
#到Tomcat服务器的连接定义文件
JkWorkersFile "conf/workers.properties"
#URI映射文件,用来指定哪些URL由Tomcat处理,你也可以直接在httpd.conf中配置这些URI,但是独立这些配置的好处是JK模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动Apache服务器
JkMountFile "conf/uriworkermap.properties"
JkLogFile logs/mod_jk.log
JkLogLevel warn
(4)在/opt/httpd-2.2.14/conf/workers.properties下进行如下配置
# list the workers by name
worker.list=status, jd-caipiao
# status 监控JK本身的状态
worker.status.type=status
# ------------##------------
worker.jd-caipiao.port=8743
worker.jd-caipiao.host=127.0.0.1
worker.jd-caipiao.type=ajp13
(5)在httpd-vhosts.conf下进行如下配置
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot "/home/jd-lottery/jd-lottery-web.war"
ServerName caipiao.360buy.net
ServerAlias caipiao.360buy.com
<Directory "/home/jd-lottery/jd-lottery-web.war">
Options -Indexes +FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.htm
</IfModule>
JkMountFile "conf/jd-caipiao-uriworkermap.properties"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/home/jd-lottery/jd-lotteryman-web.war"
ServerName man.caipiao.360buy.net
ServerAlias man.caipiao.360buy.com
<Directory "/home/jd-lottery/jd-lotteryman-web.war">
Options -Indexes +FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.htm
</IfModule>
JkMountFile "conf/jd-caipiao-uriworkermap.properties"
</VirtualHost>
(6)在/opt/httpd-2.2.14/conf/jd-caipiao-uriworkermap.properties中进行如下配置
/*=jd-caipiao
/*.jsp=jd-caipiao
/*.action=jd-caipiao
(7)tomcat中虚拟主机和apj端口的配置
/home/jd-lottery/jd-lottery/conf/server.xml配置如下:
<?xml version="1.0" encoding="utf-8"?>
-<Server port="8741" shutdown="SHUTDOWN">
<ListenerclassName="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<ListenerclassName="org.apache.catalina.core.JasperListener" />
<ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<ListenerclassName="org.apache.catalina.mbeans.ServerLifecycleListener" />
<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
-<GlobalNamingResources>
<Resourcename="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
-<Service name="Catalina">
<!---HTTP协议监听端口,默认为8080->
<Connectorport="8742" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true" />
<!--APJ协议监听端口,apache通过此端口和tomcat通讯-->
<Connectorport="8743" protocol="AJP/1.3" redirectPort="8443" URIEncoding="gbk" useBodyEncodingForURI="true" />
-<Engine name="Catalina" defaultHost="localhost">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
<!-- 虚拟主机的配置,这里的配置要跟httpd-vhosts.conf里相对应-->
-<Host name="man.caipiao.360buy.net" appBase="webapps" unpackWARs="false" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false">
<Alias>man.caipiao.360buy.com</Alias>
</Host>
<Host name="caipiao.360buy.net" appBase="webapps" unpackWARs="false" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false" />
</Engine>
</Service>
</Server>
(8)tomcat设置虚拟目录
tomcat虚拟目录的配置方式有三种,**测试环境中主要是采用在/home/jd-lottery/jd-lottery/conf目录下添加Catalina目录的方式,目录结构如下:
Catalina/lottery.360buy.net/ROOT.xml,内容如下:
<Context path="" docBase="/home/jd-lottery/work/test/lottery" />
Catalina/man.caipiao.360buy.net/ROOT.xml,内容如下:
<Context path="" docBase="/home/jd-lottery/jd-lotteryman-web.war" />
备注:
(1)Apache默认发布目录为:%apache_home%\htdocs
修改默认发布目录的方式:
修改配置文件:httpd.conf
DocumentRoot "D:/apache2.2.4/htdocs" 修改为"D:/htdocs"
<Directory "D:/apache2.2.4/htdocs">
Order allow,deny
Allow from all
</Directory>
修改为
<Directory "D:/htdocs">
Order allow,deny
Allow from all
</Directory>
不过这里应该注意:如果配置了虚拟主机,即打开了Include conf/extra/httpd-vhosts.conf功能,则在httpd.conf配置的目录方面方式会失效,可以在httpd-vhost.conf增加如下配置:
<VirtualHost *:80>
DocumentRoot "D:/htdocs"
ServerName log
<Directory "D:/htdocs">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
从而打开目录发布功能。
(2)/opt/httpd-2.2.14/logs/access_log 里面可以看到访问每次的访问量。
(3)如果Apache启动不成功,可以通过Apache HTTP Server 2.2.4-->Configure Apache Server-->Test Configuration检测是哪个配置文件出了问题。
(4)加入JK监控的功能,在httpd-vhosts.conf中增加如下配置(也可以共用别的虚拟主机)
<VirtualHost *:80>
DocumentRoot "D:/htdocs"
ServerName localhost
<Directory "D:/htdocs">
Order allow,deny
Allow from all
</Directory>
<Location /jkstatus>
JkMount status
Order deny,allow
</Location>
JkMountFile "conf/uriworkermap.properties"
</VirtualHost>
在conf/uriworkermap.properties中增加如下配置:
/jkstatus=status
参与文档:
(1)http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html这个是JK的官网文档。
(2)http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/这个是IBM网站的一个总结性质的文档。
(3)http://wenku.baidu.com/view/6b08654ffe4733687e21aa1d.html这个是百度文库的一个讲解PPT。