把web应用运行在单个Tomcat上,在应付一些对稳定性要求不是很高的场合还是可以的。但试想,Tomcat或者是服务器停掉的话,可能会带来不必要甚至是很大的损失,这时候就需要多个Tomcat协同工作来保证应用永远工作。 首先,Tomcat本身是支持集群的。本文介绍了以apache和nginx作为前端代理的负载均衡。 以apache作为前端代理,需要jk模块的支持。而nginx则天生就有代理的功能,不需要添加其他模块。由此看来,nginx可以代理任何web服务器,而apache要和Tomcat联合的话必须要有jk。从这一点来看,nginx是占有优势的。
apt-get install libapache2-mod-jk libapache2-mod-jk - Apache 2 connector for the Tomcat Java servlet engine(这个是让apache和Tomcat合作的一个模块,很重要哦) Tomcat的安装很简单, 点击这里下载后解压即可。
/etc/apache2/mods-enabled/jk.conf [codesyntax lang="xml"]
<IfModule jk_module>
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel debug
JkShmFile /var/log/apache2/jk-runtime-status
JkWatchdogInterval 60
<Location /jk-status>
JkMount jk-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
<Location /jk-manager>
JkMount jk-manager
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
JkMount /*.html tomcat1
JkMount /*.js tomcat1
JkMount /*.css tomcat1
</IfModule>
[/codesyntax] JkMount /*.html tomcat1这个配置,可以使用通配符将某些请求分发到指定的Tomcat中。 JkMount /* loadbalancer这样就能把请求分发了。 /etc/libapache2-mod-jk/workers.properties [codesyntax lang="ini"]
workers.tomcat_home=/home/suren/apache-tomcat-6.0.37/
workers.java_home=/usr/lib/jvm/default-java
ps=/
worker.list=ajp13_worker, tomcat1, tomcat2, loadbalancer
worker.ajp13_worker.port=8009
worker.ajp13_worker.host=localhost
worker.ajp13_worker.type=ajp13
worker.ajp13_worker.lbfactor=1
worker.tomcat2.port=8009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
worker.tomcat1.port=8009
worker.tomcat1.host=10.0.32.4
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp13_worker,tomcat1,tomcat2
worker.loadbalancer.sticky_session=false
worker.loadbalancer.sticky_session_force=1
[/codesyntax] sticky_sesion是黏性session的意思。
config/server.xml [codesyntax lang="xml"]
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<GlobalNamingResources>
<Resource name="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">
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="utf-8"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
</Service>
</Server>
[/codesyntax] 上面配置中,最重要的是jvmRoute="tomcat1"。如果你有多个Tomcat的话,每个jvmRoute的值都已经不一样,因为这个是jk模块用于区分Tomcat的唯一标识。 如果多个Tomcat在同一个服务器中的话,注意要把端口修改成不一样的,不然Tomcat会无法启动。
在Tomcat目录中添加index.html文件:webapps/test/index.html 重启apache服务(service apache2 restart)以及所有的Tomcat。 然后,访问apache所在的地址(192.168.1.12:80)就可以看到效果了。 http://192.168.1.12/test/index.html
安装:apt-get install nginx 配置文件:/etc/nginx/sites-available/default [codesyntax lang="ini"]
upstream localhost {
server 10.0.32.39:80 weight=1;
}
server {
listen 8012 default_server;
listen [::]:8012 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
# F displaying a 404.
try_files $uri $uri/ =404;
}
location /test {
index index.html;
proxy_pass http://localhost;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
[/codesyntax] proxy_pass会把请求转发到对应的服务器。 proxy_set_header这些配置都是用于转发http协议头的。
Tomcat的基本配置,请看这里。 Tomcat原理分分析。 http://www.iteye.com/topic/1125301