apache
别名
<VirtualHost *:80>
ServerAdmin [email protected]
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 [email protected]
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/
ProxyPassReverse / 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 [email protected]
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
ProxyPassReverse / 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/
ProxyPassReverse / 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框架用于实现展示和应用逻辑的分离