Friday, April 03, 2009

关于 Apache httpd 的模块 mod_jk.so

Apache Http 整合 Tomcat 集群及负载均衡,首先,Apache Http整合Tomcat有很多方法,主要的两个方法是用mod_jk和mod_proxy_ajp模块整合,其中jk是Tomcat专供链接Apache Http使用的,性能稳定,但缺点是配置稍比porxy_ajp复杂;porxy_ajp使用代理转发,他们都是通过把符合条件的URI通过ajp通讯交给Tomcat的ajp通讯端口处理实现整合;其中,jk通过更详细的URI配置,可以详细到文件名,但proxy_ajp就只能实现匹配目录,所以jk更适合Tomcat与Apache Http的整合。

首先使用jk来整合,Linux和Windows平台,可直接下载Tomcat编译好的二进制模块文件mod_jk.so,使用Unix平台部分需要手动编译;

在FreeBSD7中安装编译,已经安装配置好JDK16和Tomcat6还有Apache22,推荐使用ports安装,安装编译mod_jk更方便,基本不会出错:

#cd /usr/ports/www/mod_jk-apache2 ; make install clean ; rehash

完成后,在/usr/local/libexec能找到编译好的mod_jk.so,说明成功。在/usr/local/etc/apache22里能找到jk配置的例子文件mod_jk.conf.sample和workers.properties.sample,参考配置。

#ee /usr/local/etc/apache22/httpd.conf

include etc/apache22/extra/httpd-jk.conf

#ee /usr/local/etc/apache22/extra/httpd-jk.conf

LoadModule jk_module libexec/apache22/mod_jk.so

JkWorkersFile etc/apache22/workers.properties
JkMountFile etc/apache22/uriworkermap.properties
JkLogFile /var/log/mod_jk.log
JkLogLevel error

# ee etc/apache22/workers.properties

worker.list = tomcat

worker.tomcat.port = 8009
worker.tomcat.host= tomcat-hostname
worker.tomcat.type= ajp13
worker.tomcat.lbfactor= 1

#ee etc/apache22/uriworkermap.properties

/*.jsp = tomcat
/*servlet/* = tomcat
/*.do = tomcat
/*.action = tomcat

启用Tomcat的ajp通讯,默认是开启的端口是8009,上面的配置能实现Apache Http和Tomcat的整合;

稍后在下面的方法是用多个Tomcat实现集群和负载均衡,性能增强,容错能力增加。(未完,待续...)

关于Apache Http模块的性能优化

提高Apache性能,使用基于内存和磁盘的缓存管理,添加下面4个模块:

file_cache_module 此模块提供文件描述符缓存支持,从而提高Apache性能

cache_module 此模块提供基于URI键的内容动态缓存(内存或磁盘),从而提高Apache性能,必须与mod_disk_cache/mod_mem_cache同时使用

disk_cache_module 此模块为mod_cache提供基于磁盘的缓存管理

mem_cache_module 此模块为mod_cache提供基于内存的缓存管理

Wednesday, April 01, 2009

关于Apache httpd模块的一点笔记

Apache httpd 是个很好的web服务器选择,性能强大,扩展性强,合理配置好apache的模块(module)是非常重要的,直接影响到性能。最近在Unix上配置Apache时,琢磨出些东西,于是就写了下来:

如果是目前单单配一个提供静态服务的功能,且考虑到以后的功能扩展,安装编译时就用动态共享对象(DSO)模式,编译参数里带上自己需要额外添加的模块,后续需要扩展直接配置httpd.conf即可,方便易于维护。

若提供单一的静态服务,只需加载下面5个模块:

authz_host_module 供基于主机名、IP地址、请求特征的访问控制,最基本的。
logio_module 对每个请求的输入/输出字节数以及HTTP头进行日志记录,简单的日志,必备。
mime_module 通过读取部分文件内容自动猜测文件的MIME类型,不然就不能正确打开html文件,也不能正确显示图片,等等,但可以输出的。
dir_module 指定目录索引文件以及为目录提供"尾斜杠"重定向,这样方便使用。
speling_module 自动纠正URL中的拼写错误,也是容错,方便使用的。

如果再加上一个自动索引目录和文件的功能,在加上下面1个模块:

autoindex_module
自动对目录中的内容生成列表,类似于"ls"或"dir"命令。

为了安全,这个功能最好在特定的目录下使用,比如只在archive这个目录下使用:

首先去掉apache主目录的索引:
Options -indexes FollowSymLinks

然后添加下面的一个新的目录配置:
<Directory "/usr/home/holeo/webapps/ROOT/archive">
Options indexes
IndexOptions FancyIndexing NameWidth=60 FoldersFirst
ServerSignature on
</Directory>

为了提高传输效率,尚且还可增加一个Gzip功能,压缩输出的文件到客户端,减少传输时间和带宽,对静态文件如html,css,js很实用,可增加下面3个模块:

deflate_module 压缩发送给客户端的内容,这是主角。
headers_module 允许通过配置文件控制任意的HTTP请求和应答头信息,发送带gzip的消息。
setenvif_module 根据客户端请求头字段设置环境变量,浏览器类型比对(BrowserMatch),因为有些客户端浏览器不支持gzip,所以这个时候就不能压缩内容,否则客户端就不能正确显示内容;还有请求文件类型的比对,比如只压缩html,css,js,其他gif,jpg,zip等就不压缩,如果压缩图像以及zip等会增加服务器的额外负担,这样得不偿失。

使用gzip,还需配置下面的内容,这是本人使用的配置代码:

<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|bmp|ico|exe|bin|rar|zip|iso|7z|rpm|tar|gz|bz|bz2|mp3|wav|avi|mkv|mov|wmv|wma|swf|flv)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>

这些就是最常用的模块配置了,当然更多的功能,更强劲的还在其他更多的模块中,才能体现出Apache httpd真正的伟大。哈哈~