Apache+Tomcat实现负载均衡

Apache+Tomcat详解

  1. Apache 通过mod_proxy 和mod_jk 与tomcat进行连接
  其实tomcat只不过是一个容器,相比较Apache来比较的话,tomcat的功能还是比较小的。mod_proxy 只不过是apache的一个模块,但是mod_jk就需要下载。

手动安装apache

1、解决依赖关系

httpd-2.4.4需要较新版本的apr和apr-util,因此需要事先对其进行升级。升级方式有两种,一种是通过源代码编译安装,一种是直接升级rpm包。这里选择使用编译源代码的方式进行,它们的下载路径为ftp://172.16.0.1/pub/Sources/new_lamp。

    #检查是否安装了apache
[root@localhost /]# rpm -qa | grep httpd
httpd-2.2.15-15.el6.centos.1.x86_64
httpd-tools-2.2.15-15.el6.centos.1.x86_64
#卸载系统自带的apache
[root@localhost /]# rpm -e --nodeps httpd-2.2.15-15.el6.centos.1.x86_64
[root@localhost /]# rpm -e --nodeps httpd-tools-2.2.15-15.el6.centos.1.x86_64

#使用yum卸载
[root@localhost apache]# yum remove apache

#检验apr版本,卸载安装新版本
[root@localhost apache]# rpm -qa | grep apr
apr-1.3.9-5.el6_2.x86_64
apr-util-1.3.9-3.el6_0.1.x86_64
apr-util-ldap-1.3.9-3.el6_0.1.x86_64
#卸载apr
[root@localhost apache]# yum remove apr
yum remove apr-util-devel apr apr-util-mysql apr-docs apr-devel apr-util apr-util-docs
#安装pcre
[root@localhost local]#  tar -zxv -f pcre-8.32.tar.gz
[root@localhost local]#  cd pcre-8.32
[root@localhost apr-1.4.6]# ./configure
[root@localhost apr-1.4.6]# make
[root@localhost apr-1.4.6]# make install

#安装新版本apr
[root@localhost local]#  tar -zxv -f apr-1.4.6.tar.gz
[root@localhost local]#  cd apr-1.4.6
[root@localhost apr-1.4.6]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.4.6]# make
[root@localhost apr-1.4.6]# make install

#安装apr-util
[root@localhost local]#  tar -zxv -f apr-util-1.5.1.tar.gz
[root@localhost local]# cd apr-util-1.5.1
[root@localhost apr-util-1.5.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@localhost apr-util-1.5.1]# make
[root@localhost apr-util-1.5.1]# make install


同时还需要C++的环境

2.安装编译apache
# tar xf httpd-2.4.4.tar.bz2 //解压
# cd httpd-2.4.4 
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=most --with-mpm=event
# make && make install  //编译安装
3、修改httpd的主配置文件,设置其Pid文件的路径
    编辑/etc/httpd/httpd.conf,添加如下行即可:
    PidFile  "/var/run/httpd.pid"

4、提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下:

#!/bin/bash
#
# httpdStartup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#      HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0

start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} -d 10 $httpd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=$?
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
fi
echo
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
status -p ${pidfile} $httpd
    RETVAL=$?
    ;;
  restart)
    stop
    start
    ;;
  condrestart)
    if [ -f ${pidfile} ] ; then
        stop
        start
    fi
    ;;
  reload)
reload
    ;;
  graceful|help|configtest|fullstatus)
    $apachectl $@
    RETVAL=$?
    ;;
  *)
    echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
    exit 1
esac

exit $RETVAL

而后为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/httpd

加入服务列表:
# chkconfig --add httpd
启动service httpd start

使用系统自带的Apache 基础知识

Apache的 Httpd-2.2.0版本以后就自动安装了代理功能不需要进行任何的配置
查看Apache 已经安装的模块
cd /usr/lib/httpd/modules 如果是64位系统使用 cd /usr/lib64/httpd/modules
查看Apache打开的模块
httpd -M  //注意必须是大写M
httpd -t 检查语法是否正确

Centos下apache启动时httpd: apr_sockaddr_info_get() failed for 报错

今天安装Apache httpd web服务器时,从官方网站上http://www.apache.org/dyn/closer.cgi下载httpd,然后在centos下解压,安装过程分为三部分:

  (1)./configure

  (2)make

  (3)make install (需要root权限)

默认安装在/usr/sbin/下,执行apachectl start时候,提示如下错误:

httpd: apr_sockaddr_info_get() failed for shiwei
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

于是上网查了一下,根据前人的经验,问题终于解决了。总结一下,方便以后使用。

原因:这个问题应该是没有在 /etc/httpd/conf/httpd.conf 中设定 ServerName。所以apache会用主机上的名称来取代,首先会去找 /etc/hosts 中有没有主机的定义。

解决办法:

(1)可以设定httpd.conf文件中的 ServerName,如下:ServerName localhost:80

(2)在 /etc/hosts 中填入自己的主机名称 bogon,如下:127.0.0.1 shiwei (用户名称)

tomcat 的安装操作:

catalina.sh 运行的时候需要一些环境变量,如果不配置的话,就会使用默认的
1.添加  vim /etc/profile.d/tomcat.sh(记得添加权限)
export CATALINA_HOME=/usr/local/tomcat //注意这里一定要填写自己的路径
export PATH=$CATALINA_HOME/bin:$PATH
2. 刷新文件 . /etc/profile.d/tomcat.sh
3. 查看版号  catalina.sh version

   启动文件的时候需要注意的是:
 进入tomcat 的文件夹以后,  需要先来个点  ./bin/ 必须使用这种格式的才能够吧tomcat启动起来


4.检查配置文件 catalina.sh configtest
5.启动tomcat catalina.sh start
 6. ss -tnlp 可以看到java 可以监听8080端口 (tomcat就是一个java程序)

 7.通过jps 也可以看到tomcat也已经运行了  bootstrap   (在bin中也有bootstrap.jar这个文件)
 如果bootstrap 启动成功表明tomcat 启动成功
   在tomcat 的页面做的如下 

8. Host Manager 表示管理虚拟主机的   


编写tomcat 启动文件,通过linux 的服务就可以启动
vim /etc/init.d/tomcat

#!/bin/sh
# Tomcat init script for Linux
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container
# JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/root/zdcApp/jdk1.7.0_55  //注意这两个路径要填写软件的解压路径
CATALINA_HOME=/root/zdcApp/apache-tomcat-7.0.47
export JAVA_HOME CATALINA_HOME

case $1 in
start)
exec $CATALINA_HOME/bin/catalina.sh start ;;
stop)
exec $CATALINA_HOME/bin/catalina.sh stop ;;
restart)
 $CATALINA_HOME/bin/catalina.sh stop
  sleep 2
exec $CATALINA_HOME/bin/catalina.sh start;;
*)
echo "Usage: basename $0 {start|stop|restart}"
exit 1
;;
esac

8.5 注意需要在给tomcat 的文件中添加执行的权限,否则将会添加失败  chmod +x /etc/init.d/tomcat
9.为了服务能够自动的运行,还得降服务添加到系统中去
终端运行命令,将tomcat 服务添加到系统服务中
chkconfig --add tomcat

 系统服务的添加,删除,查询 --list 
chkconfig --list []

1.tomcat 常识问题

   catalina 是toumcat的引擎, 
    启动tomcat的方式:
    1.catalina.sh start 启动tomacat (需要添加配置文件)
    2.进入文件夹中,进行启动 ./start.sh
    3.把tomcat 添加到Service中添加,启动tomcat
    4.启用manager功能:
        编辑tomcat-user.xml,添加如下行:
        <role rolename="manager-gui"/>
        <role rolename="manager-script"/>
        <role rolename="standard"/>
        <user username="tomcat" password="secret" roles="admin-gui,manager-script,standard"/>

      而后重启tomcat。

    5.启用host-manager和server status功能:
    <role rolename="admin-gui"/>
    <user username="tomcat" password="s3cret" roles="admin-gui"/>
   6.tomcat 会话管理器有6中
        1.StandarManager 单个tomcat使用
        2.PersistenManager ,解决内存吃紧,空闲的时候写入到swap包中
        3.DeltManager 会话管理,不能够适用大规模的集群布置,适用两三台的tomcat ,他通过将改变了的会话数据同步给集群中的其他节点,实现会话复制
        4.BackupManager 会话管理器,

Apache 反向代理

1.Apache ProxyPass出现503 Service Temporarily Unavailable错误的解决方案

 1.页面错误提示
   Service Temporarily Unavailable  
    The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.  
  Apache Server at localhost Port 80


 2.查看apache日志/var/log/httpd/error_log:

  [Wed Aug 10 21:02:27 2011] [error] (13)Permission denied: proxy: HTTP: attempt to connect to 10.140.0.109:7080 (127.0.0.1) failed  
 [Wed Aug 10 21:02:27 2011] [error] ap_proxy_connect_backend disabling worker for (10.140.0.109)  
[Wed Aug 10 20:30:51 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)  

日志/var/log/httpd/access_log:
日志代码  
127.0.0.1- - [10/Aug/2011:21:02:27 -0400] "GET /jsp/ HTTP/1.0" 503 401 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" 

3.解决方案
 经过查资料和分析怀疑是SELinux的原因,于是查看果然是:

Liunx命令代码  
[root@ logs]# /usr/sbin/getsebool -a |grep httpd_can_network_connect  
httpd_can_network_connect --> off  

于是尝试解决方案:
 方法一:
我们需要将httpd_can_network_connect设置为on:

Linux命令代码  
[root@ logs]# /usr/sbin/setsebool -P httpd_can_network_connect=1  
[root@ logs]# /usr/sbin/getsebool -a |grep httpd_can_network_connect  
httpd_can_network_connect --> on  
   www.2cto.com  
重新访问,页面果然可以访问了,但是如果重启的话,将会又不能进访问了,而且仅仅能够同过Mod_proxy.conf 并不能够通过mod_jk.conf第二种方式mod_proxy.conf和mod_jk.conf 都可以通过,所以下面的是推荐使用的

方法二  直接关掉SELinux也是可以解决这个问题的:
修改/etc/selinux/config 然后重启:
Liunx代码代码  
SELINUX=disabled  

或者实时生效的方式:

Linux命令代码  
[root@ var]# /usr/sbin/setenforce 0  

2.在httpd.conf 的全局配置段或者虚拟主机中添加如下内容

配置方式两种 ,
 **第一种是直接在httpd.conf中添加入一下内容,**
ProxyVia Off  正向代理
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
  Require all granted  //授权所有的用户都能范文
</Proxy>
  ProxyPass  /   ajp://172.16.100.1:8009/       设置反向代理 注意这里的 斜杠 一定要对应,
  ProxyPassReverse  /  ajp://172.16.100.1:8009/
<Location  / >
  Require all granted
</Location>

** 第二种方式,在/etc/httpd/conf.d 创建文件mod_proxy.conf 同样添加如上内容**

安装tomcat连接器
1.如果是apache是系统自带的需要安装 依赖组件
rpm -ql httpd |grep apxs 检查apxs 是否安装,默认未安装
yum install httpd-devel //安装apxs
如果是编译安装的话,不需要安装,默认已经安装完成了

   2.检查apxs 的安装路径
     rpm -ql httpd-devel | grep apxs
     系统自带apache的路径是 /usr/sbin/apxs
   3.进入tomcat连接器中 tomcat-connectors-1.2.41-src/native 中进行配置 ./configure --with-apxs=/usr/sbin/apxs
   4. make && make install
   5. /usr/lib/httpd/modules/ 在此目录下会有mod_jk.so生成
   6.  配置完成

apaceh 和 tomcat 配置文件设置

1. mod_proxy.conf 文件配置

ProxyVia on
ProxyRequests Off
ProxyPreserveHost on

ServerAdmin 983625108@qq.com
ProxyPass  /  ajp://192.168.9.134:8009/
ProxyPassReverse  /  ajp://192.168.9.134:8009/

<Location  / >
 Order Allow,Deny
 Allow from all
</Location>

mod_proxy.conf 集群配置,实现负载均衡


ProxyVia on
       ProxyRequests Off
       ProxyPreserveHost on
    <Proxy balancer://lb>
    BalancerMember  http://www1.magedu.com:8080 loadfactor=1
    BalancerMember  http://www2.magedu.com:8080 loadfactor=2
    ProxySet  lbmethod=bytraffic
    </Proxy>
    <Location /lbmanager>
      SetHandler balancer-manager
    </Location>

    ProxyPass /lbmanager !   //表示不向后代理   可以通过野蛮进行查看状态信息
    ProxyPass  / balancer://lb/stickysession=JSESSION  //注意这里一定得大写  
    ProxyPassReverse  / balancer://lb/  //表示向后代理


    <Location  / >
     Order Allow,Deny
     Allow from all
    </Location>

2.mod_jk.conf 文件配置

LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/conf.d/workers.properties  //注意还需要设置works.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  error
JkMount  /*  TomcatA
JkMount  /status/  stat1

mod_jk.conf 子文件 works.properties文件配置

worker.list = TomcatA,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 192.168.9.134
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 1
worker.stat1.type = status 

mod_jk.conf 可以通过前端进行访问,查看后端的代理tomcat信息

访问路径 http://192.168.9.132/status/  //注意一定要在status后面加上/不然会出现404错误

3.mod_jk.conf 集群设置

LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/conf.d/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*  lbcluster1
JkMount  /jkstatus/  stat1

mod_jk.conf 子文件 works.properties文件配置

worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.100.1
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.100.2
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 1  //这里设置是否保持会话
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status    

注意还需要在对应的tomcat 的server.xml做出相对应的配置

  <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA" >

4.使用DelManager做会话管理

 编辑server.xml 在`<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB" ></Engine>` 节点下添加如下内容

   <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
             channelSendOptions="8">

      <Manager className="org.apache.catalina.ha.session.DeltaManager"
               expireSessionsOnShutdown="false"
               notifyListenersOnReplication="true"/>

      <Channel className="org.apache.catalina.tribes.group.GroupChannel">
        <Membership className="org.apache.catalina.tribes.membership.McastService"
                    address="228.0.0.4"   //这里一定得记住去添加路由,否则将会出错,切记
                    port="45564"
                    frequency="500"
                    dropTime="3000"/>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="auto"  //这里应该修改成自己的IP地址,切记
                  port="4000"
                  autoBind="100"
                  selectorTimeout="5000"
                  maxThreads="6"/>

        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
          <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
        </Sender>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
      </Channel>

      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
             filter=""/>
      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                tempDir="/tmp/war-temp/"
                deployDir="/tmp/war-deploy/"
                watchDir="/tmp/war-listen/"
                watchEnabled="false"/>

      <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>****

5 对 项目中web.xml 添加节点

 <distributable />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值