一, 常见 Javaweb 服务器
1,WebLogic: 是 BEA 公司的产品, WebSphereAS: 是 IBM 公司的产品, JBossAS: 红帽公司的产品, 可以自行了解
2,Tomcat 服务器: Sun 公司在推出的小型 Servlet/JSP 调试工具的基础上发展起来的一个优秀的 Servlet 容器, Tomcat 本身完全用 java 语言编写, 所以 tomcat 的运行需要 java 的支持, 所以要先安装 JDK, 才能运行.
目前是 Apache 开源软件组织的一个软件项目, 它的官网 : http://tomcat.apache.org/
Tomcat 得到了广大开源代码志愿者的大力支持, 且可以和目前大部分的主流 Web 服务器 (IIS,Apache 服务器) 一起工作, 它运行稳定, 可靠且高效. 已成为目前开发企业 JavaWeb 应用的最佳 Servlet 容器选择之一.
二, Tomcat 的目录结构及常用配置
1,Tomcat 的目录层次结构
bin: 存放启动和关闭 Tomcat 的脚本文件
conf: 存放 Tomcat 服务器的各种配置文件
lib: 存放 tomcat 服务器支撑的 jar 包
logs: 存放 Tomcat 的日志文件
temp: 存放 Tomcat 运行时产生的临时文件
webapps:web 应用虽在目录, 即供外界访问的 web 资源的存放目录
work:Tomcat 的工作目录
2,JavaWeb 应用的组成结构
mail---------------------------Web 应用所在目录
|----html,jsp,CSS,js 等文件, 根目录下的文件外界可以直接访问
|----WEB-INF 目录
|---------classes 目录(java 类)
|---------lib 目录(java 类运行所需的 jar 包)
|---------web.xml(web 应用的配置文件)
WEB-INF 这个目录下的文件外界无法直接访问, 由 web 服务器负责调用
3,JavaWeb 应用的发布
开放式目录方式:
打包 war 方式: 使用 Jar -cvf *.war .
4,Tomcat 的组成结构
Tomcat 本身由一系列可配置的组件构成, 其中核心组件是 Servlet 容器组件, 它是所有其他 Tomcat 组件的顶层容器.
每个组件都可以在 Tomcat 安装目录 / conf/server.xml 文件中进行配置, 每个 Tomcat 组件在 server.xml 文件中对应一种配置元素. 下面用 XML 的形式展示各种 Tomcat 组件之间的关系
代表整个 Servlet 容器组件, 是最顶层元素, 可以包含一个或多个元素
包含一个元素以及一个或多个元素, 这些共享一个
代表和客户程序实际交互的组件, 负责接收客户请求, 以及向客户返回响应
每个元素只能包含一个元素, 它处理在同一个中所有接收到的客户请求
在一个中可以包含多个, 它代表一个虚拟主机(即一个服务器程序可以部署在多个有不同 IP 的服务器主机上), 它可以包含一个或多个应用
使用最频繁的元素, 代表了运行在虚拟主机上的单个 web 应用
5,Tomcat 体系结构
6, 虚拟目录的映射方式
从 Tomcat6 开始, Tomcat 支持自动映射, 即 tomcat 服务器会自动管理 webapps 目录下的所有 web 应用, 并把它映射成虚拟目录, 换句话说, 只需把 web 应用放在 webapps 目录下, 不需要配置 Context, 外界可以直接访问.
但是如果你不想讲项目放在 webapps 下, 而是放在其他地方, 还是需要配置 Context, 比如我的 tomcat 在 C 盘, 我的项目在 D 盘, 则需要在 Host 下增加如下虚拟目录映射语句.
7,Context 元素配置
tomcat 在加载一个 web 应用时, 会一次按照以下五种方式查找 web 应用中的元素, 优先级一次降低, 直到找到为止
到 Tomcat 安装目录 / conf/Context.xml 文件中查找元素.
到 Tomcat 安装录 / conf/[enginename]/[hostname]/context.xml.default 文件中查找元素.[enginename]: 表示的 name 属性
[hostname]: 表示 d 的那么属性
到 Tomcat 安装目录 / conf/[enginename]/[hostname]/[contextpath].xml 文件中查找元素
[contextpath]: 表示单个 Web 应用的 URL 入口
到 Web 应用的 META-INF/context.xml 文件中查找元素
到 Tomcat 安装目录 / conf/server.xml 文件中查找元素. 只适用于单个 Web 应用
8, 将项目部署为 Tomcat 默认应用
即访问 http://localhost:8080 时出来的是 tomcat 自带的欢迎页面, 改为登录到自己的项目主页.
方法一:
在 Tomcat 默认安装后, tomcat 的主目录是 webapps/root 目录, 所以如果想改变 tomcat 的主目录的话可以如下所做:
在 / conf/server.xml 文件的之间加入代码
docBase 改为自己需要的项目路径
如果建立了 Apache 和 tomcat 集群, Apache server 的默认端口是 80 ,IE 访问的方法只需输入: http://localhost, 就可以自动定位到 xx 工程下面去
-->
方法二:
将 tomcat 安装目录下的 ROOT 下的所有文件删除, 换成自己项目的文件, 此法有点暴力.
方法三:
Tomcat5.0 以下版本在 C:/Tomcat/conf/Catalina/localhost 目录下会自动生成了一个 ROOT.Xml, 但是 5.0 以上版本不再生成此文件.
所以可以新建个 ROOT.xml, 在里面加入如下代码:
9,Context 元素的属性
path: 指定访问该 Web 应用的 URL 入口
docBase: 指定 Web 应用的文件路径, 可以写绝对路径, 也可以写相对于 appBase 属性的相对路径
className: 指定实现 Context 组件的 Java 类的名字, 这个类必须实现 org.apache.catalina.Contex 接口, 该属性默认值为 org.apache.catalina.core.StandardContext(不建议大家改动)
reloadable: 如果为 true,Tomcat 服务器在运行状态下回监视在 WEB-INF/classes 和 WEB-INF/lib 目录下的 class 文件的改动, 以及监视 Web 应用的 WEB-INF/web.xml 文件的改动, 如果检测到有更新, 服务器会自动更新加载 web 应用.
其默认值为 false. 在开发和调试阶段, 将其改为 true, 一般像 Eclipse 等开发环境都会默认改为 true. 在正式发布阶段, 应将其该为 false, 可以降低 Tomcat 的运行负荷, 提高 Tomcat 的运行性能
在一般情况下, 元素都会使用默认的标准 Context 组件, 即 className 属性采用默认值 org.apache.catalina.core.StandardContext, 它除了拥有上面介绍到的属性外, 还有自身专有的属性:
cachingAllowed: 是否允许启用静态资源 (HTML, 图片, 声音等) 的缓存. 默认值为 true.
cacheMaxSize: 设置静态资源缓存的最大值, 单位为 K.
workDir: 指定 Web 应用的工作目录.
uppackWAR: 如果为 true, 会把 war 文件展开为开放目录后再运行. 为 false, 直接运行 war 文件. 默认值为 true.
10,web.xml 文件
该文件必须放在 / WEB-INF 目录下, 但是从 7.0 版本开始, Tomcat 可以不使用 web.xml 文件, 而是使用注解方式.
三, Tomcat 的优化
1, 内存使用配置
Tomcat 是依赖于 JVM 的, 所以 Tomcat 的使用内存配置实质上是 JVM 的内存配置.
在 / bin 目录下的 catalina.bat 可以直接通过 Tomcat 设置 JVM 内存参数, windows 下打开 catalina.bat 文件, 在大概中间的位置, 找到
set "JAVA_OPTS=%JAVA_OPT% -server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"
通过内存设置充分利用服务器内存
-server: 模式启动应用慢, 但是极大程度提高运行性能
-Xms2048m -Xmx2048m: 设置的是堆内存
java8 开始, PermSize 被 MetaspaceSize 代替, MetaspaceSize 共享 heap, 不会再有 java.lang.OutOfMemoryError:PermGen space, 可以不设置
Headless=true: 适用于 Linux 系统, 与图形操作有关, 如生成验证码含义是当前的是无显示器的服务器, 应用中如果获取系统显示有关的参数会抛出异常, windows 系统可不用设置
可通过 jmap -heap process_id 查看设置是否成功
2, 最大连接数配置(并发能力)
在 / conf/server.xml 里进行配置
在属性中将 protocol 属性改为
"org.apache.coyote.http11.Http11NioProtocol",
NIO 模型的效率更高
加入
- maxThreads="500"
- // 当前可以同时处理的最大用户访问数
- minSpareThreads="100"
- // 最小空闲线程连接数, 用于优化线程池
- maxSpareThreads="200"
- acceptCount="200"
- // 当所有的线程以分配, 仍然允许连接进来, 但是出于等待状态的用户数.
- // 等待线程数 + 工作线程数 = 总的可最大连接数, 如果超过此数,
- // 新的连接将不会被接受, 就会产生一个 http 错误
- enableLookups="false"
- // 是否允许 DNS 反查, 如果为 true,request.getRemoteHost 会执行 DNS 查找, 反向解析 ip 对应域名或主机名,
- // 当没有这样需要的时候, 可以将这个功能关闭, 在一定程度上提高了 Tomcat 服务器的性能
四, 负载均衡配置
负载均衡是提高应用负载量和容错的有效手段, 可以结合 Nginxs 与 Tomcat 实现, Nginx 是一款性能优异的反向代理服务器.
1, 负载均衡配置实现
反向代理原理示意图:
负载均衡示意图:
负载均衡策略:
Nginx 提供轮询 (round robin), 用户 IP 哈希(client IP) 和指定权重 3 种方式
2, 负载均衡时 Session 的处理策略
Session 是 Tomcat 服务器上的内存空间, 如果一个用户发出多个请求, 却发到了多个 tomcat 服务器中, 那么就会出现 Session 不同步的问题
解决方案 1
将一个用户的请求锁定到某一台服务器上, 简单, 但是缺乏容错性, 一旦某个服务器发生故障, Session 可能丢失,(但是服务器发生故障是一个低概率事件, 如果一个服务器经常挂掉, 要么是硬件有问题, 要么是应用有问题)
可以使用用户 IP 哈希实现
解决方案 2
Session 复制策略, 基于网络的广播策略, 一个节点 Session 变化, 其他节点同步复制, 具有容错性, 但节点多或复制量大时对网络负荷大, 使网络效率低下, 甚至阻塞
1 在 / conf/server.xml 文件中开启 Session 复制的选项, 将注释去掉, 7.0 默认值以配置好, 需要接收器绑定内网 (一般服务器都有两块网卡) 网卡地址, 修改端口>.
2 在应用中指定应用是在分布式部署之下, 在 web.xml 中添加选项
解决方案 3
额外创建一个共享的空间用来存放 Session, 所有服务器共享一个 Session
memcached 缓存共享方案基本原理
粘性 Session 与非粘性 Session 方式:
需要一些工具 jar 包, 官网有目录和下载连接, 在 / conf/context.xml 中进行配置, 全局有效.
3, 集群环境中应用代码应注意的问题
传递 Session 需要实体类序列化支持, 实现可序列化接口, 设置版本号.
获取用户 IP 地址方法的变化, 获取真实客户端 ip 而不是 Nginx 代理地址.
动静分离结构的预规划. 一般高并发的网站上, 资源类的文件, 如 js,css, 图片通常是由静态服务器处理, Nginx 处理静态文件效率就非常高, 而 tomcat 处理静态文件是它很大的一个弱势, tomcat 只负责动态请求的处理.
那么编码的时候就要考虑静态资源最后可能要被拿出去, 地址会有变化, 所以在开发的时候应该规划访问地址, 保持最大灵活性.
来源: http://server.51cto.com/sOS-583258.htm