申精:原创笔记:apache+tomcat的配置,实现负载均衡

weixin_38106414 2010-05-09 09:07:50

我3年前的笔记了,今天偶尔翻出来看了下,发现当时做的还是很工整的!发出来供有需求的童鞋参考。
转载请注明来源:http://eabax.blog.163.com/blog/static/1133486422010499038901/


前提:java分为三个版本,即j2ee,j2se,j2me。而jsp,servlet,javabean,jdbc是j2ee的组件。
早先是java servlet,因为servlet书写起来比较烦,所以有了jsp,jsp也就是嵌入了html的java程序,jsp编译后就成为一个servlet
jsp运行之前会被先转化成为字节马文件,也就是servlet后缀名是.java 。

1、java环境的配置
这个简单,就是安装一个jdk,设置一下环境变量就ok了,编译过程省略,说一下环境变量的设置:

#vi .bashrc

#java PATH jdk 1.6.0_05
#定义变量
JAVA_HOME=/usr/local/server/jdk1.6
JAVA_BIN=/usr/local/server/jdk1.6/bin
PATH=$PATHJAVA_HOME/bin
CLASSPATH=.JAVA_HOME/lib/dt.jarJAVA_HOME/lib/tools.jar
#把变量输出,完成PATH的设定
export JAVA_HOME JAVA_BIN PATH CLASSPATH


2、解析jsp有多种方式,常用的有tomcat jboss resion等,其他有weblogic, 本文提及两种方式:

第一种: apache+resion  jsp平台(不推荐,比起tomcat来效率稍高,稳定性欠佳,不利于平台的迁移)。前提是jdk已经安装好


第二种: apache + tomcat(sun推荐平台,标准,效率一般,但是负载平衡简单)+jk(连接器)  jsp平台。前提是jdk已经安装好

(1)前提apache 编译安装完成。(见LAMP配置)

(2)tomcat安装

解压tomcat
#tar -zxvf apache-tomcat-6.0.18.tar.gz
#./bin/startup.sh
OK,就这么简单,完成tomcat的安装,默认8080端口就可以看得到tomcat的欢迎页面了。

(3)连接器的选择安装:

连接器:常见的有两种,一种是jk,再就是proxy模式

JK:
是最常见的方式,JK 本身有两个版本分别是 1 和 2,而版本 2 早已经废弃了,建议采用版本1。
JK是通过AJP协议与Tomcat服务器进行通讯的,Tomcat 默认的AJP Connector的端口是8009。JK 本身提供了一个监控以及管理的页面 jkstatus,
通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置

proxy:
又分2种 http_proxy 和 ajp_proxy

http_proxy
利用Apache自带的mod_proxy模块使用代理技术来连接Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x 版本对这个模块进行了重写,大大的增强了其功能和稳定性。
http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。
一个最简单的配置如下:
ProxyPass /images !
            ProxyPass /css !
            ProxyPass /js !
            ProxyPass / http://localhost:8080/

在这个配置中,把所有 http://localhost 的请求代理到 http://localhost:8080/ ,
这也就是 Tomcat 的访问地址,除了 images、css、js 几个目录除外。同样可以利用 mod_proxy 来做负载均衡

ajp_proxy
ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。
采用 proxy 的连接方式,需要在 Apache 上加载所需的模块,mod_proxy 相关的模块有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so,
其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。
如果是采用 http_proxy 方式则需要加载 mod_proxy.so 和 mod_proxy_http.so;如果是 ajp_proxy 则需要加载 mod_proxy.so 和 mod_proxy_ajp.so这两个模块。

比较:
相对于JK的连接方式,后两种在配置上是比较简单的,灵活性方面也一点都不逊色。但就稳定性而言就不像 JK 这样久经考验,毕竟 Apache 2.2.3 推出的时间并不长,采用这种连接方式的网站还不多。
因此,如果是应用于关键的互联网网站,还是采用 JK 的连接方式。

JK的编译安装,(采用JK1做连接器)

注意:切记 apache2.2.9要使用mod_jk-1.2.23 ,不能使用1.2.26,否则连接器不能正常工作

采用tomcat-connectors-1.2.23-src 安装
编译生成mod_jk
#tar zxvf tomcat-connectors-1.2.23-src
#cd native
#./configure --with-apxs=/usr/local/server/http/bin/apxs
#make
#cp apache2.0/mod_jk.so /usr/local/server/http/modules/

配置 :
在/usr/local/server/http/conf/下面建立两个配置文件mod_jk.conf(或写到APACHE的主配置文件中)和workers.properties。

  vi mod_jk.conf 添加以下内容:

# 指出mod_jk模块工作所需要的工作文件workers2.properties的位置
JkWorkersFile /usr/local/server/http/conf/workers2.properties
# Where to put jk logs
JkLogFile /usr/local/server/http/logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# 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"
# 将所有servlet 和jsp请求通过ajp13的协议送给Tomcat,让Tomcat来处理
JkMount /servlet/* lb-server
JkMount /*.jsp lb-server

vi workers.properties 添加以下内容:
# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009
worker.worker1.lbfactor=1
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
#worker.worker1.reclycle_timeout=300

配置httpd.conf,作以下修改:
在DirectoryIndex中添加 index.jsp
我的网页放在/usr/local/server/www下,所以要修改DocumentRoot
DocumentRoot "/usr/local/server/www"
<Directory "/usr/local/server/www">
    Options Includes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
    XBitHack on #在本目录使用ssi指令,解析网页中的ssi指令,注意会降低apache的效率,可以不开。
</Directory>
<Directory "/usr/local/server/www/WEB-INF">     
    Order deny,allow
    Deny from all
</Directory>

增加关于加载mod_jk的语句:
LoadModule jk2_module modules/mod_jk2.so
Include /usr/local/server/conf/mod_jk.conf

编辑Tomcat的配置文件server.xml,在HOST段中加入:
<Context path="" docBase="/usr/local/server/www" debug="0" reloadable="true" crossContext="true"/>

在/usr/local/server/www 下建立一个index.jsp,启动Apache和Tomcat,看到正确的页面,代表配置成功。

以上也可以写到APACHE配置文件中,即可以更改HTTPD.CONF文件,如下:
LoadModule jk2_module modules/mod_jk2.so
# Configure mod_jk
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /*.jsp lb-server

修改workers.properties,把需要的WORKLIST加上,然后,将页面传到到网站指定主目录,启动TOMCAT,APACHE即可看到页面。
测试:如果在80端口能访问.jsp,.do等文件说明配置连接器成功。

配置静态页面压缩输出模块: deflate

这个扩展模块在安装apache的时候已经动态的编译到apache里去了。现在进行配置。
cd /usr/local/server/http/conf/Includes 添加的是apache扩展配置文件的目录
vi mod_deflate.conf 在配置文件里添加如下语句:
DeflateMemLevel 9
SetOutputFilter DEFLATE
DeflateFilterNote ratio
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary

配置mod_cache模块

cd /usr/local/server/http/conf/Includes
vi mod_cache.conf 在配置文件里添加如下语句
<IfModule mod_cache.c>
#LoadModule disk_cache_module modules/mod_disk_cache.so
<IfModule mod_disk_cache.c>
CacheRoot /
CacheSize 256
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
</IfModule>
LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>
</IfModule>

安装apache日志切割工具cronolog

# tar zxf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure --prefix=/usr/local/server/cronolog && make && make install

apache基本虚拟主机配置

比如某一机器 域名 www.test.com IP: 59.42.25.35
在apache安装目录下 vi conf/httpd.conf
在最后一行添加全局虚拟主机配置
NameVirtualHost 59.42.25.35
# vi conf/Includes/www.test.com.conf
建立www.test.com 虚拟主机 配置文件
<Directory "/www/www.test.com /www/htdocs">
order allow,deny
allow from all
</Directory>
<Directory "/www/www.test.com /www/htdocs/WEB-INF">
order deny,allow
deny from all
allow from 127.0.0.1 10.10.10.86 59.34.215.86 61.144.207.69
</Directory>
<VirtualHost 59.42.25.35>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /www/www.test.com /www/htdocs
ServerName /www.test.com
ErrorDocument 404 /error/404.html
ErrorDocument 500 /error/500.html
#LoadModule deflate_module modules/mod_deflate.so
#DeflateFilterNote ratio
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
ErrorLog "|/usr/local/cronolog/sbin/cronolog /www//www.test.com /www/logs/%Y/%m/%d/error.log"
#SetEnvIf Request_URI "^[/im/checkIM]\.jsp|\.do|\.html|.jsps" please_log
SetEnvIf Request_URI "\.jsp" please_log
SetEnvIf Request_URI "\.jsps" please_log
SetEnvIf Request_URI "\.do" please_log
SetEnvIf Request_URI "\.html" please_log
CustomLog "|/usr/local/cronolog/sbin/cronolog /www/www.test.com /www/logs/%Y/%m/%d/%p/access.log" combined env=please_log
</VirtualHost>

tomcat基本虚拟主机配置

在tomcat安装目录下 vi conf/server.xml
在文件的标签 </Engine>添加

<Host name="www.test.com" debug="0" appBase="/www/www.test.com/www/htdocs" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="test."
suffix=".log" timestamp="true"/>
<Context path="/manager" docBase="${catalina.home}/server/webapps/manager"
debug="0" privileged="true">
<ResourceLink name="users" global="UserDatabase" type="org.apache.catalina.UserDatabase"/>
</Context>
<Context docBase="/www/www.test.com/www/htdocs" path="" reloadable="true">
</Context>
<alias>mail.test.com</alias>
<alias>forum.test.com</alias>
<alias>group.test.com</alias>
<alias>favorites.test.com</alias>
<alias>classifieds.test.com</alias>
</Host>


本节所出现错误:

1、如果出现类似如下错误:
loading mod_jk.so, undefined symbol; map_name_at
说明mod_jk.so并没有编译完全,没有将所以的.o文件或者.c文件编译进去, 需要重新编译。

2、提示
httpd: Syntax error on line 473 of /usr/local/server/http/conf/httpd.conf: Can't locate API module structure `jk_module' in file /usr/local/server/http/modules/mod_jk2.so: /usr/local/server/http/modules/mod_jk2.so: undefined symbol: jk_module
需要更改http.conf中将载入jk文件的语句更改为:LoadModule jk2_module modules/mod_jk2.so

3、常见版本错误引起连接器不工作


转载请注明来源:http://eabax.blog.163.com/blog/static/1133486422010499038901/
...全文
24 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧