tomcat访问控制
① 服务器如何关闭端口
问题一:怎样关闭服务器端口 如果瑞星还提示有漏洞攻击,就没办法了。注:关闭的端口有,135、137、138、139、445、1025、2475、 3127、6129、3389、593,还有tcp. 具体操作如下:默认情况下,Windows 有很多端口是键尘罩开放的,在你上网的时候,网络病毒和黑客可以通过这些端口连上你的电脑。 为了让你的系统变为铜墙铁壁,应该封闭这些端口,主要有:TCP 135、 139、445、593、1025 端口和UDP 135、137、138、445 端口,一些流行病毒的后门端口(如TCP 2745、3127、6129 端口),以及远程服务访问端口3389。下面介绍如何在WindowsXP/2000/2003 下关闭这些网络端口: 第一步,点击开始菜单/设置/控制面板/管理工具,双击打开本地安全策略,选中IP 安全策略,在本地计算机,在右边窗格的稿闹空白位置右击鼠标,弹出快捷菜单,选择创建IP 安全策略,于是弹出一个向导。在向导中点击 下一步按钮,为新的安全策略命名;再按下一步,则显示安全通信请求画面,在画面上把激活默认相应规则左边的钩去掉,点击完成按钮就创建了一个新的IP 安全策略。 第二步,右击该IP 安全策略,在属性对话框中,把使用添加向导左边的钩去掉,然后单击添加按钮添加新的规则,随后弹出新规则属性对话框,在画面上点击添加按钮,弹出IP 筛选器列表窗口;在列表中,首先把使用添加向导左边的钩去掉,然后再点击右边的添加按钮添加新的筛选器。 第三步,进入筛选器属性对话框,首先看到的是寻址,源地址选任何 IP 地址,目标地址选我的IP 地址;点击协议选项卡,在选择协议类型 的下拉列表中选择TCP,然后在到此端口下的文本框中输入135,点击确定按钮,这样就添加了一个屏蔽TCP 135(RPC)端口的筛选器,它可以防止外界通过135 端口连上你的电脑。 点击确定后回到筛选器列表的对话框,可以看到已经添加了一条策略,重复以上步骤继续添加TCP 137、139、445、593 端口和UDP 135、139、445 端口,为它们建立相应的筛选器。 重复以上步骤添加TCP 1025、2745、3127、6129、3389 端口的屏蔽策略,建立好上述端口的筛选器,最后点击确定按钮。 第四步,在新规则属性对话框中,选择新IP 筛选器列表,然后点击其左边的圆圈上加一个点,表示已经激活,最后点击筛选器操作选项卡。在筛选器操作选项卡中,把使用添加向导左边的钩去掉,点击添加按钮,添加 阻止操作:在新筛选器操作属性......>>
问题二:window服务器怎么关闭端口 网络安全专家建议,用户要断网开机,即先拔掉网线再开机,这样基本可以避免被勒索软件感染。开机后应尽快想办法打上安全补丁,或安装各家网络安全公司针对此事推出的防御工具,才可以联网。建议尽快备份电脑中的重要文件资料到移动硬盘、U 盘,备份完后脱机保存该磁兄塌盘,同时对于不明链接、文件和邮件要提高警惕,加强防范。
临时解决方案:
1、开启系统防火墙
2、利用系统防火墙高级设置阻止向445端口进行连接(该操作会影响使用445端口的服务)
3、打开系统自动更新,并检测更新进行安装
Win7、Win8、Win10的处理流程
1、打开控制面板-系统与安全-Windows防火墙,点击左侧启动或关闭Windows防火墙。
2、选择启动防火墙,并点击确定
3、点击高级设置
4、点击入站规则,新建规则
5、选择端口,下一步
6、特定本地端口,输入445,下一步
7、选择阻止连接,下一步
8、配置文件,全选,下一步
9、名称,可以任意输入,完成即可。
XP系统的处理流程
1、依次打开控制面板,安全中心,Windows防火墙,选择启用
2、点击开始,运行,输入cmd,确定执行下面三条命令:net stop rdr 、net stop srv 、net stop netbt
问题三:如何关闭与开启端口 如何关闭与开启端口?
端口概念、什么是端口在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于ftp服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。
查看端口在Windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令:依次点击“开始→运行”,键入“cmd”并回车,打开命令提示符窗口。在命令提示符状态下键入“netstat -a -n”,按下回车键后就可以看到以数字形式显示的TCP和UDP连接的端口号及状态。
关闭/开启端口在Windows中如何关闭/打开端口,因为默认的情况下,有很多不安全的或没有什么用的端口是开启的,比如Telnet服务的23端口、FTP服务的21端口、SMTP服务的25端口、RPC服务的135端口等等。为了保证系统的安全性,我们可以通过下面的方法来关闭/开启端口。
1.关闭端口比如在Windows 2000/XP中关闭SMTP服务的25端口,可以这样做:首先打开“控制面板”,双击“管理工具”,再双击“服务”。接着在打开的服务窗口中找到并双击“Simple Mail Transfer Protocol(SMTP)”服务,单击“停止”按钮来停止该服务,然后在“启动类型”中选择“已禁用”,最后单击“确定”按钮即可。这样,关闭了SMTP服务就相当于关闭了对应的端口。
2.开启端口如果要开启该端口只要先在“启动类型”选择“自动”,单击“确定”按钮,再打开该服务,在“服务状态”中单击“启动”按钮即可启用该端口,最后,单击“确定”按钮即可。提示:在Windows 98中没有“服务”选项,你可以使用防火墙的规则设置功能来关闭/开启端口。
各种端口的作用端口:0服务:Reserved说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。
端口:1服务:tcpmux说明:这显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者,默认情况下tcpmux在这种系统中被打开。Irix机器在发布是含有几个默认的无密码的帐户,如:IP、GUEST UUCP、NUUCP、DEMOS、TUTOR、DIAG、OUTOFBOX等。许多管理员在安装后忘记删除这些帐户。因此HACKER在INTERNET上搜索tcpmux并利用这些帐户。
端口:7服务:Echo说明:能看到许多人搜索Fraggle放大器时,发送到X.X.X.0和X.X.X.255的信息。
端口:19服务:Character Generator说明:这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。TCP连接时会发送含有垃圾字符的数据流直到连接关闭。HACKER利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。同样Fraggle DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。
端口:21服务:FTP说明:FTP服务器......>>
问题四:服务器可以关闭3389端口吗 可以关闭,但服务器就无法远程桌面登录了,一些远程应用程序或者平台就无法登录
问题五:如何关闭服务器其他端口 查看开放端口: netstat -na关闭端口貌似服务器没有这类命令.可以使用IPSEC过滤和端口过滤功能实现.
问题六:服务器如何关闭一些安全端口啊 设置安全策略:“控制面板”――〉“管理工具”――〉“本地安全策略”选择IP安全策略―创建IP安全策略―建立名称―默认下一步中国_网管联盟OK 建立新的策略完成选择你新建的策略 C属性然后填加下一步中国网管联盟选择WIN2000默认值(Kerberos V5协议) 继续下一步选择是选择所有IP通讯继续下一步完成选中“所有 IP 通讯”――〉点“编辑”按钮,打开“IP筛选器列表”――〉继续点“编辑”按钮,打开“筛选器 属性”_bits_完成上面配置后在你刚配置的策略有键指派验证安全策略指派“控制面板”――〉“网络和拨号连接”――〉选中本机使用的网卡,比如“本地连接”――〉双击打开“属性”――〉选中“Internet 协议(TCP/IP)”,打开其“属性”――〉“高级”看到“高级 TCP/IP 设置”――〉选中“选项”标签――〉选中“IP 安全机制”――〉打开其“属性”中国网管论坛――〉“使用此 IP 安全策略”的下拉框中选中是否就是刚才设置的“SQL 1433”配置完成后重新启动机器。方法二:局域网内找一个机器(非本机),在dos控制台下,输入telnet EP服务器IP 1433如果安全策略应用成功的话,应该不能够连接,会出现如下的话:正在连接到xxxxxxx...无法打开到主机的连接 在端口 : 连接失败。
问题七:如何打开和关闭常用端口 关闭服务器端口具体方法如下: 1、 本地连接的属性中,选择intelnet协议再寻属性”如下图: 2、进入 网络属性 后 点底部的“高级”,进入高级属性后,切换到“选项”选项卡,选择 ICP/IP 再进入属性: 3、填写需要关闭的端口
问题八:高分!!!求教如何关掉服务器端口。 每一项服务都对应相应的端口,比如众如周知的WWW服务的端口是80, *** tp是25,ftp是21,win2000安装中默认的都是这些服务开启的。对于个人用户来说确实没有必要,关掉端口也就是关闭无用的服务。 “控制面板”的“管理工具”中的“服务”中来配置。
1、关闭7.9等等端口:关闭Simple TCP/IP Service,支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。
2、关闭80口:关掉WWW服务。在“服务”中显示名称为World Wide Web Publishing Service,通过 Internet 信息服务的管理单元提供 Web 连接和管理。
3、关掉25端口:关闭Simple Mail Transport Protocol (SMTP)服务,它提供的功能是跨网传送电子邮件。
4、关掉21端口:关闭FTP Publishing Service,它提供的服务是通过 Internet 信息服务的管理单元提供 FTP 连接和管理。
5、关掉23端口:关闭Telnet服务,它允许远程用户登录到系统并且使用命令行运行控制台程序。
6、还有一个很重要的就是关闭server服务,此服务提供 RPC 支持、文件、打印以及命名管道共享。关掉它就关掉了win2k的默认共享,比如ipc$、c$、admin$等等,此服务关闭不影响您的共他操作。
7、还有一个就是139端口,139端口是NetBIOS Session端口,用来文件和打印共享,注意的是运行samba的unix机器也开放了139端口,功能一样。以前流光2000用来判断对方主机类型不太准确,估计就是139端口开放既认为是NT机,现在好了。 关闭139口听方法是在“网络和拨号连接”中“本地连接”中选取“Internet协议(TCP/IP)”属性,进入“高级TCP/IP设置”“WINS设置”里面有一项“禁用TCP/IP的NETBIOS”,打勾就关闭了139端口。 对于个人用户来说,可以在各项服务属性设置中设为“禁用”,以免下次重启服务也重新启动,端口也开放了。
每一项服务都对应相应的端口,比如众如周知的WWW服务的端口是80, *** tp是25,ftp是21,win2000安装中默认的都是这些服务开启的。对于个人用户来说确实没有必要,关掉端口也就是关闭无用的服务。
“控制面板”的“管理工具”中的“服务”中来配置。
1、关闭7.9等等端口:关闭Simple TCP/IP Service,支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。
2、关闭80口:关掉WWW服务。在“服务”中显示名称为World Wide Web Publishing Service,通过 Internet 信息服务的管理单元提供 Web 连接和管理。
3、关掉25端口:关闭Simple Mail Transport Protocol (SMTP)服务,它提供的功能是跨网传送电子邮件。
4、关掉21端口:关闭FTP Publishing Service,它提供的服务是通过 Internet 信息服务的管理单元提供 FTP 连接和管理。
5、关掉23端口:关闭Telnet服务,它允许远程......>>
问题九:怎样查看服务器的那些端口是开的,那些是关闭的? 查看开放端口: netstat -na
关闭端口貌似服务器没有这类命令.
可以使用IPSEC过滤和端口过滤功能实现.
问题十:怎样关闭tomcat服务器端口 如何修改Tomcat的端口号 Tomcat的默认端口号为8080,假如我们使用服务器安装Tomcat,使用网址访问的时候,总是需要在后面加上8080端口,如何修改端口号。让其和其他的网站一样,直接输入网址即可访问呢? 方法/步骤 首先我们需要知道,的默认端口是80,也就是说,如果我们将端口号修改为80,输入网址的时候就可以不用输入端口了,直接输入网址即可。 首先我们需要找到Tomcat目录下面的Conf文件夹。找到server.xml文件,将其打开。 找到63行的 这句话 假如找不到,可以搜索8080等关键性词语 只需要将这个8080修改为80即可 修改成功后,重新启动服务器。看看,只需要输入localhost即可访问Tomcat主页了。
② Tomcat篇02-整体架构和I/O模型
本文主要包括tomcat服务器的目录结构、工作模式、整体架构、I/O模型以及NIO、NIO2、APR三者的对比介绍。
我们先来看一下tomcat8.5和tomcat9中的home目录中的文件:
可以看到除掉一些说明文件之后,还有7个目录:
实际上除了主目录里有lib目录,在webapps目录下的web应用中的WEB-INF目录下也存在一个lib目录:
两者的区别在于:
●Tomcat主目录下的lib目录:存放的JAR文件 不仅能被Tomcat访问,还能被所有在Tomcat中发布的java Web应用访问
●webapps目录下的Java Web应用的lib目录:存放的JAR文件 只能被当前Java Web应用访问
既然有多个lib目录,那么肯定就有使用的优先顺序,Tomcat类加载器的目录加载优先顺序如下:
Tomcat的类加载器负责为Tomcat本身以及Java Web应用加载相关的类。假如Tomcat的类加载器要为一个Java Web应用加载一个类,类加载器会按照以下优先顺序到各个目录中去查找该类的.class文件,直到找到为止,如果所有目录中都不存在该类的.class文件,则会抛出异常:
Tomcat不仅可以单独运行,还可以与其他的Web服务器集成,作为其他Web服务器的进程内或进程外的servlet容器。集成的意义在于:对于不支持运行Java Servlet的其他Web服务器,可通过集成Tomcat来提供运行Servlet的功能。
Tomcat有三种工作模式:
我们先从tomcat的源码目录来分析一下tomcat的整体架构,前面我们配置jsvc运行tomcat的时候,我们知道tomcat中启动运行的最主要的类是 org.apache.catalina.startup.Bootstrap ,那么我们在tomcat的源码中的java目录下的org目录的apache目录可以找到主要的源码的相对应的类。
图中的目录如果画成架构图,可以这样表示:
Tomcat 本质上就是一款Servlet 容器,因此 catalina 才是Tomcat的核心 ,其他模块都是为 catalina 提供支撑的。
单线程阻塞I/O模型是最简单的一种服务器I/O模型,单线程即同时只能处理一个客户端的请求,阻塞即该线程会一直等待,直到处理完成为止。对于多个客户端访问,必须要等到前一个客户端访问结束才能进行下一个访问的处理,请求一个一个排队,只提供一问一答服务。
如上图所示:这是一个同步阻塞服务器响应客户端访问的时间节点图。
这种模型的特点在于单线程和阻塞I/O。 单线程即服务器端只有一个线程处理客户端的所有请求,客户端连接与服务器端的处理线程比是 n:1 ,它无法同时处理多个连接,只能串行处理连接。而阻塞I/O是指服务器在读写数据时是阻塞的,读取客户端数据时要等待客户端发送数据并且把操作系统内核复制到用户进程中,这时才解除阻塞状态。写数据回客户端时要等待用户进程将数据写入内核并发送到客户端后才解除阻塞状态。 这种阻塞带来了一个问题,服务器必须要等到客户端成功接收才能继续往下处理另外一个客户端的请求,在此期间线程将无法响应任何客户端请求。
该模型的特点:它是最简单的服务器模型,整个运行过程都只有一个线程,只能支持同时处理一个客户端的请求(如果有多个客户端访问,就必须排队等待), 服务器系统资源消耗较小,但并发能力低,容错能力差。
多线程阻塞I/O模型在单线程阻塞I/O模型的基础上对其进行改进,加入多线程,提高并发能力,使其能够同时对多个客户端进行响应,多线程的核心就是利用多线程机制为每个客户端分配一个线程。
如上图所示,服务器端开始监听客户端的访问,假如有两个客户端同时发送请求过来,服务器端在接收到客户端请求后分别创建两个线程对它们进行处理,每条线程负责一个客户端连接,直到响应完成。 期间两个线程并发地为各自对应的客户端处理请求 ,包括读取客户端数据、处理客户端数据、写数据回客户端等操作。
这种模型的I/O操作也是阻塞的 ,因为每个线程执行到读取或写入操作时都将进入阻塞状态,直到读取到客户端的数据或数据成功写入客户端后才解除阻塞状态。尽管I/O操作阻塞,但这种模式比单线程处理的性能明显高了,它不用等到第一个请求处理完才处理第二个,而是并发地处理客户端请求,客户端连接与服务器端处理线程的比例是 1:1 。
多线程阻塞I/O模型的特点:支持对多个客户端并发响应,处理能力得到大幅提高,有较大的并发量,但服务器系统资源消耗量较大,而且如果线程数过多,多线程之间会产生较大的线程切换成本,同时拥有较复杂的结构。
在探讨单线程非阻塞I/O模型前必须要先了解非阻塞情况下套接字事件的检测机制,因为对于单线程非阻塞模型最重要的事情是检测哪些连接有感兴趣的事件发生。一般会有如下三种检测方式。
当多个客户端向服务器请求时,服务器端会保存一个套接字连接列表中,应用层线程对套接字列表轮询尝试读取或写入。如果成功则进行处理,如果失败则下次继续。这样不管有多少个套接字连接,它们都可以被一个线程管理,这很好地利用了阻塞的时间,处理能力得到提升。
但这种模型需要在应用程序中遍历所有的套接字列表,同时需要处理数据的拼接,连接空闲时可能也会占用较多CPU资源,不适合实际使用。
这种方式将套接字的遍历工作交给了操作系统内核,把对套接字遍历的结果组织成一系列的事件列表并返回应用层处理。对于应用层,它们需要处理的对象就是这些事件,这是一种事件驱动的非阻塞方式。
服务器端有多个客户端连接,应用层向内核请求读写事件列表。内核遍历所有套接字并生成对应的可读列表readList和可写列表writeList。readList和writeList则标明了每个套接字是否可读/可写。应用层遍历读写事件列表readList和writeList,做相应的读写操作。
内核遍历套接字时已经不用在应用层对所有套接字进行遍历,将遍历工作下移到内核层,这种方式有助于提高检测效率。 然而,它需要将所有连接的可读事件列表和可写事件列表传到应用层,假如套接字连接数量变大,列表从内核复制到应用层也是不小的开销。 另外,当活跃连接较少时, 内核与应用层之间存在很多无效的数据副本 ,因为它将活跃和不活跃的连接状态都复制到应用层中。
通过遍历的方式检测套接字是否可读可写是一种效率比较低的方式,不管是在应用层中遍历还是在内核中遍历。所以需要另外一种机制来优化遍历的方式,那就是 回调函数 。内核中的套接字都对应一个回调函数,当客户端往套接字发送数据时,内核从网卡接收数据后就会调用回调函数,在回调函数中维护事件列表,应用层获取此事件列表即可得到所有感兴趣的事件。
内核基于回调的事件检测方式有两种
第一种是用 可读列表readList 和 可写列表writeList 标记读写事件, 套接字的数量与 readList 和 writeList 两个列表的长度一样 。
上面两种方式由操作系统内核维护客户端的所有连接并通过回调函数不断更新事件列表,而应用层线程只要遍历这些事件列表即可知道可读取或可写入的连接,进而对这些连接进行读写操作,极大提高了检测效率,自然处理能力也更强。
单线程非阻塞I/O模型最重要的一个特点是,在调用读取或写入接口后立即返回,而不会进入阻塞状态。虽然只有一个线程,但是它通过把非阻塞读写操作与上面几种检测机制配合就可以实现对多个连接的及时处理,而不会因为某个连接的阻塞操作导致其他连接无法处理。在客户端连接大多数都保持活跃的情况下,这个线程会一直循环处理这些连接,它很好地利用了阻塞的时间,大大提高了这个线程的执行效率。
单线程非阻塞I/O模型的主要优势体现在对多个连接的管理,一般在同时需要处理多个连接的发场景中会使用非阻塞NIO模式,此模型下只通过一个线程去维护和处理连接,这样大大提高了机器的效率。一般服务器端才会使用NIO模式,而对于客户端,出于方便及习惯,可使用阻塞模式的套接字进行通信。
在多核的机器上可以通过多线程继续提高机器效率。最朴实、最自然的做法就是将客户端连接按组分配给若干线程,每个线程负责处理对应组内的连接。比如有4个客户端访问服务器,服务器将套接字1和套接字2交由线程1管理,而线程2则管理套接字3和套接字4,通过事件检测及非阻塞读写就可以让每个线程都能高效处理。
多线程非阻塞I/O模式让服务器端处理能力得到很大提高,它充分利用机器的CPU,适合用于处理高并发的场景,但它也让程序更复杂,更容易出现问题(死锁、数据不一致等经典并发问题)。
最经典的多线程非阻塞I/O模型方式是Reactor模式。首先看单线程下的Reactor,Reactor将服务器端的整个处理过程分成若干个事件,例如分为接收事件、读事件、写事件、执行事件等。Reactor通过事件检测机制将这些事件分发给不同处理器去处理。在整个过程中只要有待处理的事件存在,即可以让Reactor线程不断往下执行,而不会阻塞在某处,所以处理效率很高。
基于单线程Reactor模型,根据实际使用场景,把它改进成多线程模式。常见的有两种方式:一种是在耗时的process处理器中引入多线程,如使用线程池;另一种是直接使用多个Reactor实例,每个Reactor实例对应一个线程。
Reactor模式的一种改进方式如下图所示。其整体结构基本上与单线程的Reactor类似,只是引入了一个线程池。由于对连接的接收、对数据的读取和对数据的写入等操作基本上都耗时较少,因此把它们都放到Reactor线程中处理。然而,对于逻辑处理可能比较耗时的工作,可以在process处理器中引入线程池,process处理器自己不执行任务,而是交给线程池,从而在Reactor线程中避免了耗时的操作。将耗时的操作转移到线程池中后,尽管Reactor只有一个线程,它也能保证Reactor的高效。
Reactor模式的另一种改进方式如下图所示。其中有多个Reactor实例,每个Reactor实例对应一个线程。因为接收事件是相对于服务器端而言的,所以客户端的连接接收工作统一由一个accept处理器负责,accept处理器会将接收的客户端连接均匀分配给所有Reactor实例,每个Reactor实例负责处理分配到该Reactor上的客户端连接,包括连接的读数据、写数据和逻辑处理。这就是多Reactor实例的原理。
Tomcat支持的I/O模型如下表(自8.5/9.0 版本起,Tomcat移除了对BIO的支持),在 8.0 之前 , Tomcat 默认采用的I/O方式为 BIO , 之后改为 NIO。 无论 NIO、NIO2 还是 APR, 在性能方面均优于以往的BIO。
Tomcat中的NIO模型是使用的JAVA的NIO类库,其内部的IO实现是同步的(也就是在用户态和内核态之间的数据交换上是同步机制),采用基于selector实现的异步事件驱动机制(这里的异步指的是selector这个实现模型是使用的异步机制)。 而对于Java来说,非阻塞I/O的实现完全是基于操作系统内核的非阻塞I/O,它将操作系统的非阻塞I/O的差异屏蔽并提供统一的API,让我们不必关心操作系统。JDK会帮我们选择非阻塞I/O的实现方式。
NIO2和前者相比的最大不同就在于引入了异步通道来实现异步IO操作,因此也叫AIO(Asynchronous I/O)。NIO.2 的异步通道 APIs 提供方便的、平台独立的执行异步操作的标准方法。这使得应用程序开发人员能够以更清晰的方式来编写程序,而不必定义自己的 Java 线程,此外,还可通过使用底层 OS 所支持的异步功能来提高性能。如同其他 Java API 一样,API 可利用的 OS 自有异步功能的数量取决于其对该平台的支持程度。
异步通道提供支持连接、读取、以及写入之类非锁定操作的连接,并提供对已启动操作的控制机制。Java 7 中用于 Java Platform(NIO.2)的 More New I/O APIs,通过在 java.nio.channels 包中增加四个异步通道类,从而增强了 Java 1.4 中的 New I/O APIs(NIO),这些类在风格上与 NIO 通道 API 很相似。他们共享相同的方法与参数结构体,并且大多数对于 NIO 通道类可用的参数,对于新的异步版本仍然可用。主要区别在于新通道可使一些操作异步执行。
异步通道 API 提供两种对已启动异步操作的监测与控制机制。第一种是通过返回一个 java.util.concurrent.Future 对象来实现,它将会建模一个挂起操作,并可用于查询其状态以及获取结果。第二种是通过传递给操作一个新类的对象, java.nio.channels.CompletionHandler ,来完成,它会定义在操作完毕后所执行的处理程序方法。每个异步通道类为每个操作定义 API 副本,这样可采用任一机制。
Apache可移植运行时(Apache Portable Runtime,APR) 是Apache HTTP服务器的支持库,最初,APR是作为Apache HTTP服务器的一部分而存在的,后来成为一个单独的项目。其他的应用程序可以使用APR来实现平台无关性(跨平台)。APR提供了一组映射到下层操作系统的API,如果操作系统不支持某个特定的功能,APR将提供一个模拟的实现。这样程序员使用APR编写真正可在不同平台上移植的程序。
顺利安装完成后会显示apr的lib库路径,一般都是 /usr/local/apr/lib
安装完成之后我们还需要修改环境变量和配置参数
这里我们使用的是systemd调用jsvc来启动tomcat,所以我们直接在systemd对应的tomcat的unit文件中的 ExecStart 中添加一个路径参数 -Djava.library.path=/usr/local/apr/lib 指向apr库的路径:
然后我们在tomcat的home目录下的conf子目录中对server.xml文件进行修改
把8080端口对应的配置修改成apr:(其他端口配置也类似)
重启tomcat服务我们从tomcat的日志中就可以看到协议已经从默认的NIO变成了apr。
NIO性能是最差的这是毋庸置疑的,如果是考虑到高并发的情况,显然异步非阻塞I/O模式的NIO2和APR库在性能上更有优势,实际上NIO2的性能表现也和APR不相上下,但是NIO2要求Tomcat的版本要在8.0以上,而APR只需要5.5以上即可,但是APR需要额外配置库环境,相对于内置集成的NIO2来说APR这个操作比较麻烦,两者各有优劣。具体使用哪个还是需要结合实际业务需求和环境进行测试才能决定。
③ myeclipse中tomcat正常启动,web也应用访问也正常,但是myeclipse的控制台日志不动,为什么呢
你锁定了面板。或者你面板没有选择正确
④ 取消tomcat 控制台所有日志打印输出
闲杂网上很多资料都是怎么把tomcat的日志输出到指定文件,或者文件过大怎么处理,方法到处都是!
而我遇到的问题是 tomcat 运行时输出大量的(专业说法:各种级别的日志),每次都输出几百行 当请求频繁时就想疯了一样输出刷屏,于是就想避免输出这些信息;宴枣
1 这些信息的界别都有这些:
一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 。
二是访问日志信息,它记录的访问的时间,IP ,访问的资料等相关信息。
其中访问日志:
{默认 tomcat 不记录访问日志,如晌镇拆下方法可以使 tomcat 记录访问日志
编辑 ${catalina}/conf/server.xml 文件. 注 :${catalina} 是 tomcat 的安装目录
把以下的注释 () 去掉即可。
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>}
Tomcat 日志分为下面5类:
catalina 、 localhost 、 manager 、 admin 、 host-manager
每类日志的级别分为如下 7 种:
SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)
3.2 日志级别的设定方法
修改 conf/logging.properties 中的内容,设定某类日志的级别
示例:
设置 catalina 日志的级别为: FINE
1catalina.org.apache.juli.FileHandler.level = FINE
禁用 catalina 日志的输出:
1catalina.org.apache.juli.FileHandler.level = OFF
输出 catalina 所有的日志消息均输出:
1catalina.org.apache.juli.FileHandler.level = ALL
那么我的具体修改方法如下:在logging.properties修改设置
############################################################
随后旅搜 我的tomcat就正常输出自己大的日志和警告界别的日志 再也没有其他信息疯着出来了!
-->
⑤ java.lang.IllegalArgumentException: Property 'sessionFactory' is required
类似
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
...
</bean>
<bean id="Dao" class="Dao">
<property name="sessionFactory" ref="sessionFactory"></悄物property>老迅
</bean>
都启含液有了么,tomcat启动的时候报的错么
⑥ 请教一个Tomcat 6.0运行的问题
可能这次启动tomcat的端梁枯衡口发生了变化不是8080了(因为那个端口被别的程序占用了),你在访问页面http://localhost:8080/就访问不到了。所以,你看一败念下启动的控制台,确认一下启橡做动的端口,再进行访问
⑦ Tomcat正常启动,可以访问tomcat主页,却不能访问webapp中的项目的jsp文件,这是什么原因
能访问tomcat说明服务器已经开启了,不能访问项目说明判脊你的项目可能没部署上去。
如果不是,那么就要看看你访问项目的时候是报的什么错?
如果是404,那么就是页面的路径不对,你要检查一下友帆你的项目名称和jsp页面的名称了。
如果是500,那么就是你jsp页面有错误,你要掘告渗检查下了。。
⑧ tomcat有哪些性能调优方法
Tomcat性能调优方案
一、操作系统调优
对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU的处理能力越强,系统运行速度越快。。
【适用场景】 任何项目。
二、Java虚拟机调优
应该选择SUN的JVM,在满足项目需要的前提下,尽量选用版本较高的JVM,一般来说高版本产品在速度和效率上比低版本会有改进。
JDK1.4比JDK1.3性能提高了近10%-20%,JDK1.5比JDK1.4性能提高25%-75%。
因此对性能要求较高的情况推荐使用 JDK1.6。
【适用场景】 任何项目。
三、Apache集成Tomcat
Web服务器专门处理HTTP请求,应用服务器是通过很多协议为应用提供商业逻辑。虽然Tomcat也可以作web服务器,但其处理静态html的速度比不上Apache,且其作为web服务器的功能远不如Apache,因此把Apache和Tomcat集成起来,将html和Jsp的功能部分进行明确分工,让Tomcat只处理Jsp部分,其他的由Apache,IIS等web服务器去处理,由此大大提高Tomcat的运行效率。
如果一个项目中大量使用了静态页面、大量的图片等,并有有较大的访问量,推荐使用Apache集成Tomcat的方式来提高系统的整体性能。
Apache和Tomcat的整合有三种方式,分别是JK、http_proxy和ajp_proxy.其中JK方式是最常见的方式,JK本身有两个版本分别是1和2,目前1最新版本是1.2.8,而版本2早已经废弃了。http_proxy是利用Apache自带的mod_proxy模块使用代理技术来连接Tomcat。Ajp_proxy连接方式其实跟http_proxy方式一样,都是由mod_proxy所提供的功能。只需要把配置中的http://换成ajp://,同时连接的是Tomcat的AJP Connector所在的端口。
相对于JK的连接方式,后两种在配置上比较简单的,灵活性方面也一点都不逊色。但就稳定性而言不像JK这样久经考验,所以建议采用JK的连接方式。
Apache+JK+Tomcat配置:
使用到的两个配置文件分别是:httpd.conf和mod_jk.conf。其中httpd.conf是Apache服务器的配置文件,用来加载JK模块以及指定JK配置文件信息。mod_jk.conf是到Tomcat服务器的连接定义文件。
【部署步骤】
1.安装Apache服务器
2.部署Tomcat
3.将mod_jk.so拷贝到moles目录下面
4.修改httpd.conf和mod_jk.conf
【适用场景】 大量使用静态页面的应用系统。
四、Apache和Tomcat集群
对于并发要求很高的系统,我们需要采取负载均衡的方式来分担Tomcat服务器的压力。负载均衡实现大概有四种:第一是通过DNS,但只能简单的实现轮流分配,不能处理故障;第二是基于MS IIS,windows 2003 server本身就带了负载均衡服务;第三是硬件方式,通过交换机功能或专门的负载均衡设备来实现;第四种是软件的方式,通过一台负载均衡服务器进行,上面安装软件。使用Apache Httpd Server做负载均衡器,Tomcat集群节点使用Tomcat就可以做到上述第四种方式,这种方式比较灵活,成本相对比较低,另外一个很大的优点就是可以根据应用情况和服务器的情况做一些灵活的配置。所以推荐使用Apache+Tomcat集群来实现负载均衡。
采用Tomcat集群可以最大程度的发挥服务器的性能,可以在配置较高的服务器上部署多个Tomcat,也可以在多台服务器上分别部署Tomcat,Apache和Tomcat整合的方式还是JK方式。经过验证,系统对大用户量使用的响应方面,Apache+3Tomccat集群> Apache+2Tomcat集群 > Apache集成Tomcat > 单个Tomcat。并且采用Apache+多Tomcat集群的部署方式时,如果一个Tomcat出现宕机,系统可以继续使用,所以在硬件系统性能足够优越的情况下,需要尽量发挥软件的性能,可以采用增加Tomcat集群的方式。
Apache+Tomcat集群的方式使用到得配置文件有httpd.conf、mod_jk.conf、workers.properties。其中mod_jk.conf是对JK信息的配置,包括JK的路径等,workers.properties配置文件是对Tomcat服务器的连接定义文件。
Apache需要调整运行参数,这样才能构建一个适合相应网络环境的web服务。其中可进行的优化配置如下:
1. 设置MPM(Multi Processing Moles多道处理模块)。ThreadPerChild,这个参数用于设置每个进程的线程数,在Windows环境下默认值是64,最大值是1920,建议设置为100-500之间,服务器性能高的话值大一些,反之小一些。MaxRequestPerChild表示每个子进程能够处理的最大请求数。这个参数的值更大程度上取决于服务器的内存,如果内存比较大的话可以设置为很大的参数,否则设置一个较小的值,建议值是3000.
2. 关闭DNS和名字解析 HostnameLookups off
3. 打开UseCanonicalName模块 UseCanonicalName on
4. 关闭多余模块 一般来说,不需要加载的模块有,mod_include.so、mod_autoindex.so、mod_access.so、mod_auth.so.
5. 打开KeepAlive支持
KeepAlive on, KeepAliveTimeout 15 MaxKeepAliveRequests 1000
根据实际经验,通过Apache和Tomcat集群的方式提高系统性能的效果十分明显,这种方式可以最大化的利用硬件资源,通过多个Tomcat的处理来分担单Tomcat时的压力。
【部署步骤】
1.安装Apache服务器
2.部署Tomcat集群,即多个相同的Tomcat。
3.将mod_jk.so拷贝到moles目录下面
4.修改httpd.conf、mod_jk.conf和workers.properties
【适用场景】 并发用户量及在线使用用户数量比较高的系统。
五、Tomcat自身优化
1. JVM参数调优:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。在catalina.bat中,设置JAVA_OPTS='-Xms256m -Xmx512m',表示初始化内存为256MB,可以使用的最大内存为512MB。
2. 禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
3. 调整线程数
通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。
Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。
在Tomcat5对这些参数进行了调整,请看下面属性:
maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
connnectionTimeout 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
minSpareThreads Tomcat初始化时创建的线程数。
maxSpareThreads 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。
六、APR库使用
Tomcat中使用APR库,其实就是在Tomcat中使用JNI的方式来读取文件以及进行网络传输。可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
一般在Windows下,可以直接下载编译好的二进制版本的dll库文件来使Tomcat启用APR,一般建议拷贝库文件tcnative-1.dll到Tomcat的bin目录下。而在Linux下,可以直接解压和安装bin目录下的tomcat_native.tar.gz文件,编译之前要确保apr库已经安装。
怎么才能判断Tomcat是否已经启用了APR库呢?方法是通过看Tomcat的启动日志:
如果没有启用APR,则启动日志一般有这么一条:
org.apache.coyote.http11.Http11Protocol start
如果启用了APR,则这条日志就会变成:
org.apache.coyote.http11.Http11AprProtocol start
tcnative-1.dll 下载地址:http://tomcat.heanet.ie/native/
调优综述
根据以上分析,如果想要Tomcat达到最优的效果,首先要争取使得操作系统以及网络资源达到最优,并且最好使用高版本的JDK。对于有大量静态页面的系统,采用Apache集成Tomcat的方式,把静态页面交由Apache处理,动态部分交由Tomcat处理,能极大解放Tomcat的处理能力。使用ARP库也能极大的提高Tomcat对静态文件的处理能力。对于并发要求较高的系统,采用Apache加Tomcat集群的方式,将负载分别分担到多个Tomcat上,能很大的提高系统的性能,充分利用硬件资源。同时需要对Tomcat自身进行优化,包括增大内存、调节并发线程数等。
⑨ 详解 Tomcat 配置文件 server.xml
前言
Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛。server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的一个组件;通过对xml文件中元素的配置,可以实现对Tomcat中各个组件的控制。因此,学习server.xml文件的配置,对于了解和使用Tomcat至关重要。
本文将通过实例,介绍server.xml中各个组件的配置,并详细说明厅谨Tomcat各个核心组件的作用以及各个组件之间的相互关系。
说明:由于server.xml文件中元素与Tomcat中组件的对应关系,后文中为了描述方便,“元素”和“组件”的使用不严格区分。
一、一个server.xml配置实例
server.xml位于$TOMCAT_HOME/conf目录下;下面是一个server.xml实例。后文中将结合该实例讲解server.xml中,各个元素的含义和作用;在阅读后续章节过程中,可以对照该xml文档便于理解。
二、server.xml文档的元素分类和整体结构
1、整体结构
server.xml的整体结构如下:
该结构中只给出了Tomcat的核心组件,除了核心组件外,Tomcat还有一些其他组件,下面介绍一下组件的分类扮纤基。
2、元素分类
server.xml文件中的元素可以分为以下4类:
(1)顶层元素:和
元素是整个配置文件的根元素,元素则代表一个Engine元素以及一组与之相连的Connector元素。
(2)连接器:
代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口。
(3)容器:
容器的功能是处理Connector接收进来的请求,并产生相应的响应。Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求。
(4)内嵌组件:可以内嵌到容器中的组件。实际上,Server、Service、Connector、Engine、Host和Context是最重要的最核心的Tomcat组件,其他组件都可以归为内嵌组件。
下面将详细介绍Tomcat中各个核心组件的作用,以及相互之间的关系。
三、核心组件
本部分将分别介绍各个核心组件的作用、特点以及配置方式等。
1、Server
Server元素在最顶层,代表整个Tomcat容器,因此它必须是server.xml中唯一一个最外层的元素。一个Server元素中可以有一个或多个Service元素。
在第一部分的例子中,在最外层有一个元素,shutdown属性表示关闭Server的指令;port属性表示Server接收shutdown指令的端口号,设为-1可以禁掉该端口。
Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
2、Service
Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。
在第一部分的例子中,Server中包含一个名称为“Catalina”的Service。实际上,Tomcat可以提供多个Service,不同的Service监听不同的端口,后文会有介绍。
3、Connector
Connector的主要功能,是接收连接请求,创建Request和Response对象用竖卖于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
通过配置Connector,可以控制请求Service的协议及端口号。在第一部分的例子中,Service包含两个Connector:
在这个例子中,Tomcat监听HTTP请求,使用的是8080端口,而不是正式的80端口;实际上,在正式的生产环境中,Tomcat也常常监听8080端口,而不是80端口。这是因为在生产环境中,很少将Tomcat直接对外开放接收请求,而是在Tomcat和客户端之间加一层代理服务器(如nginx),用于请求的转发、负载均衡、处理静态文件等;通过代理服务器访问Tomcat时,是在局域网中,因此一般仍使用8080端口。
(2)通过配置第2个Connector,客户端可以通过8009端口号使用AJP协议访问Tomcat。AJP协议负责和其他的HTTP服务器(如Apache)建立连接;在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接。Tomcat与Apache等集成的原理如下图(图片来源):
4、Engine
Engine组件在Service组件中有且只有一个;Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。
前面已经提到过,Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。
在第一部分的例子中,Engine的配置语句如下:
其中,name属性用于日志和错误信息,在整个Server中应该唯一。defaultHost属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理;因此,defaultHost的值,必须与Engine中的一个Host组件的name属性值匹配。
5、Host
(1)Engine与Host
Host是Engine的子容器。Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机。Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配。
(2)Host的作用
Host虚拟主机的作用,是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用。
Host组件代表的虚拟主机,对应了服务器中一个网络名实体(如”www.test.com”,或IP地址”116.25.25.25”);为了使用户可以通过网络名连接Tomcat服务器,这个名字应该在DNS服务器上注册。
客户端通常使用主机名来标识它们希望连接的服务器;该主机名也会包含在HTTP请求头中。Tomcat从HTTP头中提取出主机名,寻找名称匹配的主机。如果没有匹配,请求将发送至默认主机。因此默认主机不需要是在DNS服务器中注册的网络名,因为任何与所有Host名称不匹配的请求,都会路由至默认主机。
(3)Host的配置
在第一部分的例子中,Host的配置如下:
下面对其中配置的属性进行说明:
name属性指定虚拟主机的主机名,一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配;一般情况下,主机名需要是在DNS服务器中注册的网络名,但是Engine指定的defaultHost不需要,原因在前面已经说明。
unpackWARs指定了是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。
Host的autoDeploy和appBase属性,与Host内Web应用的自动部署有关;此外,本例中没有出现的xmlBase和deployOnStartup属性,也与Web应用的自动部署有关;将在下一节(Context)中介绍。
6、Context
(1)Context的作用
Context元素代表在特定虚拟主机上运行的一个Web应用。在后文中,提到Context、应用或Web应用,它们指代的都是Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录)。
Context是Host的子容器,每个Host中可以定义任意多的Context元素。
在第一部分的例子中,可以看到server.xml配置文件中并没有出现Context元素的配置。这是因为,Tomcat开启了自动部署,Web应用没有在server.xml中配置静态部署,而是由Tomcat通过特定的规则自动部署。下面介绍一下Tomcat自动部署Web应用的机制。
(2)Web应用自动部署
Host的配置
要开启Web应用的自动部署,需要配置所在的虚拟主机;配置的方式就是前面提到的Host元素的deployOnStartup和autoDeploy属性。如果deployOnStartup和autoDeploy设置为true,则tomcat启动自动部署:当检测到新的Web应用或Web应用的更新时,会触发应用的部署(或重新部署)。二者的主要区别在于,deployOnStartup为true时,Tomcat在启动时检查Web应用,且检测到的所有Web应用视作新应用;autoDeploy为true时,Tomcat在运行时定期检查新的Web应用或Web应用的更新。除此之外,二者的处理相似。
通过配置deployOnStartup和autoDeploy可以开启虚拟主机自动部署Web应用;实际上,自动部署依赖于检查是否有新的或更改过的Web应用,而Host元素的appBase和xmlBase设置了检查Web应用更新的目录。
其中,appBase属性指定Web应用所在的目录,默认值是webapps,这是一个相对路径,代表Tomcat根目录下webapps文件夹。
xmlBase属性指定Web应用的XML配置文件所在的目录,默认值为conf//,例如第一部分的例子中,主机localhost的xmlBase的默认值是$TOMCAT_HOME/conf/Catalina/localhost。
检查Web应用更新
一个Web应用可能包括以下文件:XML配置文件,WAR包,以及一个应用目录(该目录包含Web应用的文件结构);其中XML配置文件位于xmlBase指定的目录,WAR包和应用目录位于appBase指定的目录。
Tomcat按照如下的顺序进行扫描,来检查应用更新:
A、扫描虚拟主机指定的xmlBase下的XML配置文件
B、扫描虚拟主机指定的appBase下的WAR文件
C、扫描虚拟主机指定的appBase下的应用目录
元素的配置
Context元素最重要的属性是docBase和path,此外reloadable属性也比较常用。
docBase指定了该Web应用使用的WAR包路径,或应用目录。需要注意的是,在自动部署场景下(配置文件位于xmlBase中),docBase不在appBase目录中,才需要指定;如果docBase指定的WAR包或应用目录就在docBase中,则不需要指定,因为Tomcat会自动扫描appBase中的WAR包和应用目录,指定了反而会造成问题。
path指定了访问该Web应用的上下文路径,当请求到来时,Tomcat根据Web应用的 path属性与URI的匹配程度来选择Web应用处理相应请求。例如,Web应用app1的path属性是”/app1”,Web应用app2的path属性是”/app2”,那么请求/app1/index.html会交由app1来处理;而请求/app2/index.html会交由app2来处理。如果一个Context元素的path属性为””,那么这个Context是虚拟主机的默认Web应用;当请求的uri与所有的path都不匹配时,使用该默认Web应用来处理。
但是,需要注意的是,在自动部署场景下(配置文件位于xmlBase中),不能指定path属性,path属性由配置文件的文件名、WAR文件的文件名或应用目录的名称自动推导出来。如扫描Web应用时,发现了xmlBase目录下的app1.xml,或appBase目录下的app1.WAR或app1应用目录,则该Web应用的path属性是”app1”。如果名称不是app1而是ROOT,则该Web应用是虚拟主机默认的Web应用,此时path属性推导为””。
reloadable属性指示tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动。如果值为true,那么当class文件改动时,会触发Web应用的重新加载。在开发环境下,reloadable设置为true便于调试;但是在生产环境中设置为true会给服务器带来性能压力,因此reloadable参数的默认值为false。
下面来看自动部署时,xmlBase下的XML配置文件app1.xml的例子:
在该例子中,docBase位于Host的appBase目录之外;path属性没有指定,而是根据app1.xml自动推导为”app1”;由于是在开发环境下,因此reloadable设置为true,便于开发调试。
自动部署举例
最典型的自动部署,就是当我们安装完Tomcat后,$TOMCAT_HOME/webapps目录下有如下文件夹:
当我们启动Tomcat后,可以使用http://localhost:8080/来访问Tomcat,其实访问的就是ROOT对应的Web应用;我们也可以通过http://localhost:8080/docs来访问docs应用,同理我们可以访问examples/host-manager/manager这几个Web应用。
(3)server.xml中静态部署Web应用
除了自动部署,我们也可以在server.xml中通过元素静态部署Web应用。静态部署与自动部署是可以共存的。在实际应用中,并不推荐使用静态部署,因为server.xml 是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而自动部署可以在Tomcat运行时通过定期的扫描来实现,不需要重启服务器。
server.xml中使用Context元素配置Web应用,Context元素应该位于Host元素中。举例如下:
1
docBase:静态部署时,docBase可以在appBase目录下,也可以不在;本例中,docBase不在appBase目录下。
path:静态部署时,可以显式指定path属性,但是仍然受到了严格的限制:只有当自动部署完全关闭(deployOnStartup和autoDeploy都为false)或docBase不在appBase中时,才可以设置path属性。在本例中,docBase不在appBase中,因此path属性可以设置。
reloadable属性的用法与自动部署时相同。
四、核心组件的关联
1、整体关系
核心组件之间的整体关系,在上一部分有所介绍,这里总结一下:
Server元素在最顶层,代表整个Tomcat容器;一个Server元素中可以有一个或多个Service元素。
Service在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;Connector接收请求,Engine处理请求。
Engine、Host和Context都是容器,且 Engine包含Host,Host包含Context。每个Host组件代表Engine中的一个虚拟主机;每个Context组件代表在特定Host上运行的一个Web应用。
2、如何确定请求由谁处理?
当请求被发送到Tomcat所在的主机时,如何确定最终哪个Web应用来处理该请求呢?
(1)根据协议和端口号选定Service和Engine
Service中的Connector组件可以接收特定端口的请求,因此,当Tomcat启动时,Service组件就会监听特定的端口。在第一部分的例子中,Catalina这个Service监听了8080端口(基于HTTP协议)和8009端口(基于AJP协议)。当请求进来时,Tomcat便可以根据协议和端口号选定处理请求的Service;Service一旦选定,Engine也就确定。
通过在Server中配置多个Service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。
(2)根据域名或IP地址选定Host
Service确定后,Tomcat在Service中寻找名称与域名/IP地址匹配的Host处理该请求。如果没有找到,则使用Engine中指定的defaultHost来处理该请求。在第一部分的例子中,由于只有一个Host(name属性为localhost),因此该Service/Engine的所有请求都交给该Host处理。
(3)根据URI选定Context/Web应用
这一点在Context一节有详细的说明:Tomcat根据应用的 path属性与URI的匹配程度来选择Web应用处理相应请求,这里不再赘述。
(4)举例
以请求http://localhost:8080/app1/index.html为例,首先通过协议和端口号(http和8080)选定Service;然后通过主机名(localhost)选定Host;然后通过uri(/app1/index.html)选定Web应用。
3、如何配置多个服务
通过在Server中配置多个Service服务,可以实现通过不同的端口号来访问同一台机器上部署的不同Web应用。
在server.xml中配置多服务的方法非常简单,分为以下几步:
(1)复制元素,放在当前后面。
(2)修改端口号:根据需要监听的端口号修改元素的port属性;必须确保该端口没有被其他进程占用,否则Tomcat启动时会报错,而无法通过该端口访问Web应用。
以Win7为例,可以用如下方法找出某个端口是否被其他进程占用:netstat -aon|findstr “8081″发现8081端口被PID为2064的进程占用,tasklist |findstr “2064″发现该进程为FrameworkService.exe(这是McAfee杀毒软件的进程)。
(3)修改Service和Engine的name属性
(4)修改Host的appBase属性(如webapps2)
(5)Web应用仍然使用自动部署
(6)将要部署的Web应用(WAR包或应用目录)拷贝到新的appBase下。
以第一部分的server.xml为例,多个Service的配置如下:
http://localhost:8080/docs/
http://localhost:8084/docs/
五、其他组件
除核心组件外,server.xml中还可以配置很多其他组件。下面只介绍第一部分例子中出现的组件,如果要了解更多内容,可以查看Tomcat官方文档。
1、Listener
Listener(即监听器)定义的组件,可以在特定事件发生时执行特定的操作;被监听的事件通常是Tomcat的启动和停止。
监听器可以在Server、Engine、Host或Context中,本例中的监听器都是在Server中。实际上,本例中定义的6个监听器,都只能存在于Server组件中。监听器不允许内嵌其他组件。
监听器需要配置的最重要的属性是className,该属性规定了监听器的具体实现类,该类必须实现了org.apache.catalina.LifecycleListener接口。
下面依次介绍例子中配置的监听器:
VersionLoggerListener:当Tomcat启动时,该监听器记录Tomcat、Java和操作系统的信息。该监听器必须是配置的第一个监听器。
AprLifecycleListener:Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime,是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成。
JasperListener:在Web应用启动之前初始化Jasper,Jasper是JSP引擎,把JVM不认识的JSP文件解析成java文件,然后编译成class文件供JVM使用。
:与类加载器导致的内存泄露有关。
:通过该监听器,初始化< GlobalNamingResources>标签中定义的全局JNDI资源;如果没有该监听器,任何全局资源都不能使用。< GlobalNamingResources>将在后文介绍。
:当Web应用因thread-local导致的内存泄露而要停止时,该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时,活跃线程会一个一个的更新。只有当Web应用(即Context元素)的属性设置为true时,该监听器才有效。
2、GlobalNamingResources与Realm
第一部分的例子中,Engine组件下定义了Realm组件:
Realm,可以把它理解成“域”;Realm提供了一种用户密码与web应用的映射关系,从而达到角色安全管理的作用。在本例中,Realm的配置使用name为UserDatabase的资源实现。而该资源在Server元素中使用GlobalNamingResources配置:
GlobalNamingResources元素定义了全局资源,通过配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。
关于Tomcat域管理的更多内容,可以参考:Realm域管理
3、Valve
在第一部分的例子中,Host元素内定义了Valve组件:
单词Valve的意思是“阀门”,在Tomcat中代表了请求处理流水线上的一个组件;Valve可以与Tomcat的容器(Engine、Host或Context)关联。
不同的Valve有不同的特性,下面介绍一下本例中出现的AccessLogValve。
AccessLogValve的作用是通过日志记录其所在的容器中处理的所有请求,在本例中,Valve放在Host下,便可以记录该Host处理的所有请求。AccessLogValve记录的日志就是访问日志,每天的请求会写到一个日志文件里。AccessLogValve可以与Engine、Host或Context关联;在本例中,只有一个Engine,Engine下只有一个Host,Host下只有一个Context,因此AccessLogValve放在三个容器下的作用其实是类似的。
本例的AccessLogValve属性的配置,使用的是默认的配置;下面介绍AccessLogValve中各个属性的作用:
(1)className:规定了Valve的类型,是最重要的属性;本例中,通过该属性规定了这是一个AccessLogValve。
(2)directory:指定日志存储的位置,本例中,日志存储在$TOMCAT_HOME/logs目录下。
(3)prefix:指定了日志文件的前缀。
(4)suffix:指定了日志文件的后缀。通过directory、prefix和suffix的配置,在$TOMCAT_HOME/logs目录下,可以看到如下所示的日志文件。
(5)pattern:指定记录日志的格式,本例中各项的含义如下:
%h:远程主机名或IP地址;如果有nginx等反向代理服务器进行请求分发,该主机名/IP地址代表的是nginx,否则代表的是客户端。后面远程的含义与之类似,不再解释。
%l:远程逻辑用户名,一律是”-”,可以忽略。
%u:授权的远程用户名,如果没有,则是”-”。
%t:访问的时间。
%r:请求的第一行,即请求方法(get/post等)、uri、及协议。
%s:响应状态,200,404等等。
%b:响应的数据量,不包括请求头,如果为0,则是””-。
例如,下面是访问日志中的一条记录
pattern的配置中,除了上述各项,还有一个非常常用的选项是%D,含义是请求处理的时间(单位是毫秒),对于统计分析请求的处理速度帮助很大。
开发人员可以充分利用访问日志,来分析问题、优化应用。例如,分析访问日志中各个接口被访问的比例,不仅可以为需求和运营人员提供数据支持,还可以使自己的优化有的放矢;分析访问日志中各个请求的响应状态码,可以知道服务器请求的成功率,并找出有问题的请求;分析访问日志中各个请求的响应时间,可以找出慢请求,并根据需要进行响应时间的优化。