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/
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 [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
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框架用於實現展示和應用邏輯的分離