apache

别名

<VirtualHost *:80>

    ServerAdmin webmaster@dummy-host.example.com

    DocumentRoot /data/httpd

    ServerName node144.xy.com

    ServerAlias  beta.xy.com

    ErrorLog  /data/logs/httpd/node144.xy.com-error_log 

    CustomLog /data/logs/httpd/node144.xy.com-access_log common


alias /test/ "/data/httpd/zabbix/" #最后的/前面加了后面也要加,不加都不加


#ErrorDocument 403 http://www.xy.com/403.html 定义错误码页面

ErrorDocument 403 /403.html  

ErrorDocument 404 /404.html


RewriteEngine on

#RewriteRule ^/$     http://www.xy.com/pg/index.html   [R=301]

RewriteRule ^/$     /test   [R=301]  #把/重写,访问/就是访问/test


RewriteEngine on

        RewriteMap  hosts-deny txt:/data/tomcat/xy.blacklist

        RewriteMap  hosts-allow txt:/data/tomcat/xy.whitelist

        RewriteCond     ${hosts-allow:%{REMOTE_ADDR}|NOT-FOUND}  NOT-FOUND

        RewriteCond     ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}  !=NOT-FOUND

        RewriteRule ^(.*)$   -   [F,L]

#允许和拒绝某些ip访问,两个 RewriteCond 是且关系。只有两个同时满足才重写拒绝

如果改成或 [OR] 则只有当allow有deny没有的ip才能访问

[root@node144 conf.d]# tail /data/tomcat/xy.whitelist

192.168.113.47  allow   ## xf

[root@node144 conf.d]# tail /data/tomcat/xy.blacklist

192.168.113.60 deny # 20141203 456 xy

######

RewriteEngine on

        RewriteCond %{HTTP_USER_AGENT} ^(.*)Googlebot [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^Baiduspider [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^Sosospider [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^Sogou [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^YodaoBot [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^YoudaoBot [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^mvtech-spider [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^FyberSpider  [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^bjspider [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^Nutch [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^Tasapspider [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^(.*)IEShow [NC,OR]

        RewriteCond %{HTTP_USER_AGENT} ^Gecko [NC]

        RewriteRule ^(.*)$ - [F]

RewriteCond指令可以在RewriteRule中使用,没有匹配的将被RewriteRule忽略

格式:RewriteCond TestString CondPattern

NC:忽略大小写

OR:或关系

######

#<Directory "/data/httpd">  

#DirectoryIndex index.html index.html.var

#Options Indexes FollowSymLinks  #不加默认关闭,没index.html时列目录,和软连接跟随

#        AllowOverride AuthConfig FileInfo  

#       Order allow,deny  

#       Allow from all  

#    </Directory>  

</VirtualHost>


安装tomcat

vi /etc/profile.d/java.sh

JAVA_HOME=/usr/java/latest

PATH=/usr/java/latest/bin:$PATH

CATALINA_HOME=/usr/local/tomcat

export JAVA_HOME CATALINA_HOME PATH


启动脚本

#!/bin/sh

# Tomcat init script for Linux.

#

# chkconfig: 2345 96 14

# description: The Apache Tomcat servlet/JSP container.

# JAVA_OPTS='-Xms64m -Xmx128m'

JAVA_HOME=/usr/java/latest

CATALINA_HOME=/usr/local/tomcat

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 ;;

configtest)

  exec $CATALINA_HOME/bin/catalina.sh configtest ;;

*)

  exec $CATALINA_HOME/bin/catalina.sh * ;;

esac


建立一个testapp

<%@ page language="java" %>

<html>

  <head><title>TomcatA</title></head>

  <body>

    <h1><font color="red">TomcatA.magedu.com</font></h1>

    <table align="centre" border="1">

      <tr>

        <td>Session ID</td>

    <% session.setAttribute("magedu.com","magedu.com"); %>

        <td><%= session.getId() %></td>

      </tr>

      <tr>

        <td>Created on</td>

        <td><%= session.getCreationTime() %></td>

     </tr>

    </table>

  </body>

</html>


<%@ page language="java" %>

<html>

  <head><title>TomcatB</title></head>

  <body>

    <h1><font color="blue">TomcatB.magedu.com</font></h1>

    <table align="centre" border="1">

      <tr>

        <td>Session ID</td>

    <% session.setAttribute("magedu.com","magedu.com"); %>

        <td><%= session.getId() %></td>

      </tr>

      <tr>

        <td>Created on</td>

        <td><%= session.getCreationTime() %></td>

     </tr>

    </table>

  </body>

</html>

-------------------------------------

apache反向代理tomcat


ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。


ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。


ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。


ProxyPass  [path]  !|url  [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。

另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:

◇ min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。

◇ max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。

◇ loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。

◇ retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。


如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:

◇lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。

◇ maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。

◇ nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。

◇ stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。

上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:

<proxy balancer://lbcluster1>

BalancerMember ajp://172.16.100.1:8009 loadfactor=10 route=TomcatA

BalancerMember ajp://172.16.100.2:8009 loadfactor=10 route=TomcatB

</proxy>


集群配置修改后一定要重启apache,不能从读配置文件,不然负载会不均衡,而且有很多问题


apache配置文件

[root@node144 conf.d]# cat virt.conf

<VirtualHost *:80>

    ServerAdmin webmaster@dummy-host.example.com

    DocumentRoot /data/httpd

    ServerName node144.xy.com

ServerAlias beta.xy.com

#ErrorDocument 403 http://www.ule.com/403.html

ErrorDocument 403 /403.html

ErrorDocument 404 /404.html

    ErrorLog  /data/logs/httpd/node144.xy.com-error_log 

    CustomLog /data/logs/httpd/node144.xy.com-access_log common

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

<Proxy balancer://lbcluster1>

BalancerMember ajp://192.168.211.147:8009 loadfactor=10 route=TomcatA

BalancerMember ajp://192.168.211.146:8009 loadfactor=10 route=TomcatB

</Proxy>

ProxyPass / balancer://lbcluster1/ 

ProxyPa***everse / balancer://lbcluster1/

<Directory "/data/httpd">  

    </Directory>  

RewriteEngine on

#RewriteRule ^/$     http://www.xy.com/pg/index.html   [R=301]

RewriteRule ^/$     /test   [R=301]

</VirtualHost>

当一个掉了后,后面的请求都只会到另一台上,起来后又会负载均衡。相当于高可用


---------------

配置Session绑定

<VirtualHost *:80>

    ServerAdmin webmaster@dummy-host.example.com

    DocumentRoot /data/httpd

    ServerName node144.xy.com

ServerAlias beta.xy.com

#ErrorDocument 403 http://www.ule.com/403.html

ErrorDocument 403 /403.html

ErrorDocument 404 /404.html

    ErrorLog  /data/logs/httpd/node144.xy.com-error_log 

    CustomLog /data/logs/httpd/node144.xy.com-access_log common

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

ProxyPass / balancer://lbcluster1/  stickysession=JSESSIONID

ProxyPa***everse / balancer://lbcluster1/

<Proxy balancer://lbcluster1>

BalancerMember ajp://192.168.211.147:8009 loadfactor=10 route=TomcatB

BalancerMember ajp://192.168.211.146:8009 loadfactor=10 route=TomcatA

</Proxy>

<Directory "/data/httpd">  

    </Directory>  

</VirtualHost>

或者这样

ProxyPass / balancer://lbcluster1/ 

ProxyPa***everse / balancer://lbcluster1/

<Proxy balancer://lbcluster1>

BalancerMember ajp://192.168.211.147:8009 loadfactor=10 route=TomcatB

BalancerMember ajp://192.168.211.146:8009 loadfactor=10 route=TomcatA

ProxySet stickysession=JSESSIONID

</Proxy>


后端tomcat

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

jvmRoute="TomcatA" 要与在apache上配置的对应


mod_jk


worker.list=router17

worker.jvm1.port=8009

worker.jvm1.host=192.168.112.251

worker.jvm1.type=ajp13

worker.jvm1.lbfactor=1

#worker.jvm1.redirect=jvm2

worker.jvm1.connection_pool_timeout=3

worker.jvm1.socket_timeout=3

worker.jvm2.port=8009

worker.jvm2.host=192.168.112.32

worker.jvm2.type=ajp13

worker.jvm2.lbfactor=1

#worker.jvm2.redirect=jvm1

worker.jvm2.connection_pool_timeout=3

worker.jvm2.socket_timeout=3

worker.router17.type=lb

worker.router17.sticky_session=1

worker.router17.balance_workers=jvm1,jvm2


LoadModule  jk_module  modules/mod_jk.so

JkWorkersFile  /etc/httpd/workers.properties

JkLogFile  logs/mod_jk.log

JkLogLevel  debug

JkMount  /*  router17


JkUnMount /index.html router17

--------------

基于内存session复制集群

1,修改项目下的WEB-INF目录下的web.xml在里面添加

<distributable />


2,修改tomcat server.xml的engine,也可以改在hosts,注意不同的版本不同,去tomcat官网看

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


        <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.20.0.4" ##要修改

                        port="45564"

                        frequency="500"

                        dropTime="3000"/>

            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

                      address="192.168.211.146" ##要修改

                      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>


3,在各节点为使用组播地址添加组播路由,格式:

route add -net $MCAST_ADDRESS netmask 255.255.255.255 dev eth0

一般可以不用添加的

-----------------------

tomcat连接线程配置

<Connector port="8009" maxHttpHeaderSize="8192" maxThreads="8192"  minSpareThreads="256" maxSpareThreads="1024" acceptCount="2048"   connectionTimeout="20000" enableLookup

s="false" compression="on"   compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"  redirectPort="8443" protocol="AJP/1.3" URIEncoding="UTF-8" packetSize="

65536" />

1) address:指定连接器监听的地址,默认为所有地址,即0.0.0.0;

2) maxThreads:支持的最大并发连接数,默认为200;

3) port:监听的端口,默认为0;

4) protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3;

5) redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;

6) connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;

7) enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true;

8) acceptCount:设置等待队列的最大长度;通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;


 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"    maxThreads="8192"  compression="on"   compressableMimeType="text/html,text/xml,text/pla

in,text/javascript,text/css" URIEncoding="UTF-8" />


别名配置

<Host name="cart.xy.com"  appBase="/data/postmall/tomcat/webapps_cart" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

    <Alias>cart.ulechina.tom.com</Alias>

    <Alias>cart.xy.tom.com</Alias>

    <Alias>cart.xy.cn.com</Alias>

 </Host>


日志配置

catalina.sh 

$CATALINA_OUT


在第一次调用之后,JSP会被编译成一个servlet类,在后续的操作中则可以直接使用此类,从而避免了对每一次调用的都要重新分析和编译。因此,类似servlet,JSP的执行需要在container中完成。JSP的container跟servlet的container基本相同,但在JSP执行之前,需要一些额外的步骤如与servlet代码建立会话等。Tomcat包含了一个叫做Catalina的Servlet container(执行servlet和编译过的JSP)和一个JSP编译器(Jasper编译器)。事实上,一个包含了JSP编译器和Servlet容器的应用程序组合通过被称作Web容器。


JSP和Servlet的最大区别在于,Servlet通常需要事先编译好,而JSP则并非必须事先编译。这意味着Servlet通常放置于私有资源区域,而JSP则通常以嵌入代码的方式包含于HTML页面文件中,这些HTML文件通常放置在公开资源区域。


MVC架构:

Controller,Model和View各自独立,一个流行的开源实现是Apache Structs框架;目今,设计优良的Web应用程序通常用相就的技术实现相应的功能,比如:

1、Servlet用于实现应用逻辑;

2、JSP用于内容展示;

3、标签库和JSP扩展语言用于替换在JSP内部嵌入Java代码,进而降低了HTML维护的复杂度;

4、MVC框架用于实现展示和应用逻辑的分离