大型网站高并发实战-Tomcat
4. Tomcat服务器
4.1 编程语言概要
编程语言
系统级:C,C++, go (依赖于glibc)
应用级:C#,Java,Python, Perl, ruby (虚拟机)
动态网站:Java (servlet, jsp), Python(Django, Flask), Perl(module), ruby(ror),php
语言流派:指令+数据
面向过程:以指令为核心,围绕指令组织数据
面向对象:以数据为核心,围绕数据组织程序,程序存在的目的是为了加工数据
类:方法、属性
动态
客户端动态 apple
服务器端动态:
CGI ;
一次编译,到处运行
两种接口:开发接口、运行接口
jdk:
J2SE ==> Java 2 SE
J2EE ==> Java 2 EE
J2ME ==> Java 2 ME
webapp server
jsp --> tomcat, jboss, jetty
php --> php-fpm
python --> (Django)
Java语言
Green, Oak, Java
JDK:Java Development Kit
JVM:Java Virtual Machine
Java语言的特性:
面向对象、多线程、结构化错误处理
垃圾收集、动态连接、动态扩展
JAVA技术体系:
Java程序设计语言
Java应用编程接口(API)
Java class文件格式
Java虚拟机
java编译
源代码:.java
字节码:.class
安装jdk(java 开发工具包)环境
sun jdk :java官方开发的。
open jdk :开源组织开发的
server.xml:核心主配置文件
context.xml:每个webapp都有其配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC;此配置文件用于为所有的webapp提供默认配置;
web.xml:每个webapp部署之后才能被访问;此文件则用于为所有webapp提供默认部署方式的配置;
tomcat-users.xml:用户认证账号配置文件;
catalina.policy:当使用-security启动tomcat实例时会读取此配置文件来其安全运行策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些JVM性能调整的相关参数;
logging.properties:日志相关的配置信息;
顶级类组件:server(代表一个tomcat实例)
服务类组件:service (将连接器关联至内部的engine)
容器类组件:engine (代表一个web container #负责请求处理),host,context
连接器组件:connectorr 负责捕获客户端请求,支持如下三种协议。
http
https
ajp(apache jserv procotol,tomcat集群环境使用)
被嵌套类组件:valve, logger, realm, ...
#组件实例:
<server>
<service>
<connector port="80" protocol="HTTP/1.1" />
...
<engine>
<host name="www.lianshu.com" appBase="/webapps" unpackWARs="true" autoDeploy="true"> #类似于apache的虚拟主机,appBase 表示网站根目录
<Context path="/test" docBase="testapp2" reloadable="true"/>
#表示多个应用,如 proc,ws,ihdmgr等模块。
</context>
</host>
...
</engine>
</service>
...
</server>
测试页 #index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JSP test Page</title>
</head>
<body>
<% out.println("Hello,world"); %>
</body>
</html>
这段代码规定了Tomcat监听HTTP请求的端口号等信息。可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。
standalone:通过内置的web server直接接收来自于client的请求;
proxy:
in-process:使用独立的web server反代用户请求至jvm进程中的tomcat web container;web server和jvm在同一主机;独立/网络:web server和jvm在不同主机;
verson: 查看版本
configtest:语法检测
start:tomcat服务启动
stop [n] [-force] :tomcat服务停止
LAMT(linux apache mysql tomcat)架构
LNMT(linux Nginx mysql tomcat)架构
配置apache服务器
加载反向代理模块
mod_proxy_http #基于http的反向代理,通常默认是装载的
mod_proxy_ajp #基于ajp协议的反向代理,根据不同的协议选择不同的加载模块。
mod_proxy_balancer #负载均衡模块
配置apache的http反向代理
由于经常修改主配置文件容易出错,并且主配置文件中有一个include 指令可以自动加载 /etc/httpd/*.conf 文件,所以我们可以在目录/etc/httpd/conf.d中创建一个负载均衡模块mod_http.conf 文件,具体配置如下:
若是配置虚拟主机需要取消Main Server; 注释DocumentRoot指令即可;
ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
4.2 tomcat安装部署
rpm -ivh jdk-7u57-linux-x64.rpm
cd /usr/java
vim /etc/profile.d/java.sh #配置环境变量
export JAVA_HOME=/usr/java/latest #环境变量配置推荐风格,先写home,在拼接。
export PATH=$JAVA_HOME/bin:$PATH #PATH变量需要最后,因为搜索有优先级,若是放到前面容易不生效。
. /etc/profile.d/java.sh
java -version
2. 部署tomcat
tar xf apache-tomcat-7.0.55.tar.gz -C /usr/local
ln -sv apache-tomcat-7.0.55 tomcat
#添加环境变量
vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
#环境变量生效
/etc/profile.d/tomcat.sh
catalina start
#catalina stop
#查看端口是否启动 也可以访问 http://ip:8080
ss nutlp|grep 8080
配置文件:conf目录下
tomcat主配置的文件server.xml
tomcat组件:由java类实现;有些组件的实现方式不止一种;有些组件还要嵌套别的组件;每个组件在通过指定的类型实现时需要传递一些属性;
3. tomcat的运行模式:
4. catalina.sh脚本(总入口脚本,包括如下功能):
5. tomcat 可以处理静态资源,只是性能不如apache和nginx。
4.3 Tomcat 集群部署
注解:使用apache或者nginx的静态资源解析能力以及负载均衡能力;tomcat只负责动态请求处理。后端mysql可以使用N个实例(上图只画了一个)共同访问共享存储上的数据库文件。
NameVirtualHost *:80 #2.2版本需要配置,2.4版本不需要配置
#如下apache的配置类似nginx的upstream模式;
#loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
<Proxy balancer://tcsrvs> #tcsrvs 为负载名称:tomcat service集群
BalancerMember http://172.16.100.7:8080 loadfactor=1
BalancerMember http://172.16.100.8:8080 loadfactor=1
</Proxy>
#配置虚拟主机
<VirtualHost *:80>
ServerName www.lianshu.com
ProxyVia On #代理打开
ProxyRequests Off #否开启apache正向代理的功能
ProxyPreserveHost On #开启反向代理
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /status ! #是否允许状态页代理 !表示不允许代理过去。报404错误
ProxyPass / balancer://tcsrvs/ #根目录 负载均衡到后端,如果要实现动静分离,则可以使用正则表达式进行过滤处理,动态请求交给后端。
#stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。实现session绑定效果。但是动态负载就不可以体现了。
ProxyPassReverse / balancer://tcsrvs/ stickysession=JSESSIONID #反向代理重定向
<Location />
Order deny,allow
Allow from all
</Location>
</VirtualHost>
上述配置关键参数解释:
配置apache的ajp反向代理
需要加载的模块:mod_proxy_ajp, mod_proxy_balancer:
NameVirtualHost *:80
<Proxy balancer://tcsrvs>
BalancerMember ajp://172.16.100.7:8009 loadfactor=1 #和上面只有协议不同,端口不同
BalancerMember ajp://172.16.100.8:8009 loadfactor=1
</Proxy>
<VirtualHost *:80>
ServerName www.lianshu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /status !
#实现session绑定
ProxyPass / balancer://tcsrvs/ stickysession=JSESSIONID
ProxyPassReverse / balancer://tcsrvs/ stickysession=JSESSIONID
<Location />
Order deny,allow
Allow from all
</Location>
</VirtualHost>
配置tomcat服务器集群
若是为了实现session绑定,则需要在tomcat主配置文件engine(引擎)里面分别添加如下路由属性。
jvmRoute=tomcatA
jvmRoute=tomcatB
tomcatA 节点
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.lianshu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("lianshu.com","lianshu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
tomcatB 节点
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB.lianshu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("lianshu.com","lianshu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>