之前在公司配mod_jk,看教程很简单,但就是实现不出来,官方文档中提到了Apache的虚拟主机,我也注意到了,但当时怎么都没发现,抓心挠肝之下,去入职培训时的那个班群里面吼了一句,还好,kentwang接话了,哈哈,像抓到救命稻草一样,kentwang在看了我的配置之后,深深的怀疑虚拟主机。我这是才认真的去检查了一下,发现一个conf文件被Include进来,里面都是虚拟主机。要不是kentwang,不知道我还有多久才会去仔细的检查。
/*--------------------------------我是分割线--------------------------------*/
回顾一下这次配置mod_jk的经历。
如果Apache能够把Servlet的请求自动的转发给Tomcat,那么就相当于Apache能够支持Servlet请求。并且,对于用户来说,他在访问Tomcat中的服务时,能够沿用Apache所使用的域名,并且不需要输入Tomcat的端口号,如8080 。
下载合适的插件
Apache组织对此提供了插件,mod_jk.so。下载的时候,需要注意插件的版本与Apache版本兼容。
比如,服务器上的Apache版本为2.2.3 。我下载的mod_jk.so为mod_jk-1.2.28-httpd-2.2.X.so。
文件名中的红色部分,标识该版本的so所支持的Apache版本。
在Apache中加入配置
在Apache中对mod_jk 进行配置,可以分三步:
1. 让Apache加载mod_jk
2. 让Apache知道,对需要转发的链接,如何进行转发
3. 让Apache知道对哪些链接,通过mod_jk进行转发
下面依次对上面进行描述。
1 让Apache加载mod_jk
在httpd.conf中,加入下面的命令,就可以加载mod_jk。
#加载so文件,指定mod_jk.so的路径。
LoadModule jk_module modules/mod_jk.so
#加载workers的配置文件
JkWorkersFile conf/workers.properties
#指定mod_jk 的日志文件
JkLogFile logs/mod_jk.log
JkLogLevel info
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
在workes.properties文件中,将会配置若干个worker实例,每一个worker实例都会按照我们配置的规则,将Apache交给它的链接,进行转发。
2 让Apache知道,对需要转发的链接,如何进行转发。
在workers.properties文件中,配置如何对需要转发的链接,进行转发。
# Defining a worker named worker1 and of type ajp13
worker.list=worker1
# Set properties for worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
这段代码,定义了一个worker实例,id为worker1,在Apache的其他地方,就可以通过worker1对该worker实例进行引用。
对于worker1的属性配置,表示该worker1将会把收到的请求,通过ajp1.3协议,转发到localhost的8009端口。
3 让Apache知道对哪些链接,通过mod_jk进行转发
下面要让Apache知道对哪些链接进行转发,通过JkMount关键字进行定义。因为Apache中通常会定义Virtual Host,所以JkMount需要在Virtual Host中进行定义,才能够对通过server name进行访问的请求生效。
比如,Apache配置了一个VH,Server Name为pnr.tenpay.com。
我在pnr.tenpay.com定义的节点中加入语句:
JkMount /pnrbill_webApp/pages/*.jsp worker1
ServerAdmin webmaster@tencent.com
DocumentRoot /usr/local/cftair/htdocs/b2bPNR
ServerName pnr.tenpay.com
ScriptAlias /cgi-bin/ "/usr/local/cftair/cgi-bin/"
DirectoryIndex Login.shtml index.shtml index.html
ErrorLog "|/usr/local/apache/bin/rotatelogs /data/logs/cftair_err_%Y%m%d 86400"
CustomLog "|/usr/local/apache/bin/rotatelogs /data/logs/cftair_access_%Y%m%d_%H.txt 3600" ClickFlowLogFormat env=!dontlog
Options +Includes FollowSymLinks IncludesNoExec
AllowOverride Options
Order allow,deny
Allow from all
XBitHack on
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
表示,当Apache在ip.ip.ip.ip这块网卡上,收到通过pnr.tenpay.com域名进入的请求时,会应用JkMount的规则,将/pnrbill_webApp/pages/目录下的jsp请求,都通过worker1实例进行转发,即,转发到localhost地址的8009端口。
那么当Apache在ip.ip.ip.ip这块网卡上,收到通过air.qq.com域名进入的请求时,即便是请求/pnrbill_webApp/pages/目录下的jsp,由于Apache没有配置此时如何转发,所以会返回错误:“文件无法找到”。
Tomcat的配合
转发的过程自然不能缺少Tomcat的配合,Tomcat的配合工作很简单,就是能够在与Apache约定好的地址和端口等待请求,并保证使用的协议一致。
按照上面的配置,Apache会把请求,按照AJP1.3协议,转发到localhost的8009端口。那么在ip.ip.ip.ip服务器上,Tomcat对本机的8009端口,使用AJP1.3协议进行监听就可以了。
在Tomcat中,AJP1.3 Connector是默认存在的,代码如下:
相关文档:
http://www.juexiang.com/tomcat/tomcat3.2-4.0/tomcat-3.2.3/doc/tomcat-apache-howto.html
http://tomcat.apache.org/connectors-doc/
/*--------------------------------我是分割线--------------------------------*/
附图一张:
类别:默认分类 查看评论