`

Java面试汇总(六)之tomcat

 
阅读更多

一、Tomcat的缺省是多少,怎么修改

Tomcat的缺省端口号是8080.
修改Tomcat端口号:
1.找到Tomcat目录下的conf文件夹
2.进入conf文件夹里面找到server.xml文件
3.打开server.xml文件
4.在server.xml文件里面找到下列信息
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />
5.把port=”8080″改成port=”8888″,并且保存
6.启动Tomcat,并且在IE浏览器里面的地址栏输入http://127.0.0.1:8888/

7、tomcat默认采用的BIO模型,在几百并发下性能会有很严重的下降。tomcat自带还有NIO的模型,另外也可以调用APR的库来实现操作系统级别控制。
  NIO模型是内置的,调用很方便,只需要将上面配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重启即可生效。如下面的参数配置,默认的是HTTP/1.1。
    <Connector port=”8080″   
               protocol=”org.apache.coyote.http11.Http11NioProtocol”  
               connectionTimeout=”20000″  
               redirectPort=”8443″   
               maxThreads=”500″   
               minSpareThreads=”20″  
               acceptCount=”100″ 
               disableUploadTimeout=”true” 
               enableLookups=”false”   
               URIEncoding=”UTF-8″ />

二、tomcat 如何优化?

 1、优化连接配置.这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,修改连接数,关闭客户端dns查询。

参数解释:

 URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译

 maxSpareThreads : 如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

 minSpareThreads : 最小备用线程数,tomcat启动时的初始化的线程数。

 enableLookups : 这个功效和Apache中的HostnameLookups一样,设为关闭。

 connectionTimeout : connectionTimeout为网络连接超时时间毫秒数。

 maxThreads : maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。

 acceptCount : acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection

 maxProcessors与minProcessors : 在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

通常Windows是1000个左右,Linux是2000个左右。

 useURIValidationHack:

我们来看一下tomcat中的一段源码:

【security】

        if (connector.getUseURIValidationHack()) {

            String uri = validate(request.getRequestURI());

            if (uri == null) {

                res.setStatus(400);

                res.setMessage(“Invalid URI”);

                throw new IOException(“Invalid URI”);

            } else {

                req.requestURI().setString(uri);

                // Redoing the URI decoding

                req.decodedURI().duplicate(req.requestURI());

                req.getURLDecoder().convert(req.decodedURI(), true);

            }

        }

可以看到如果把useURIValidationHack设成”false”,可以减少它对一些url的不必要的检查从而减省开销。

 enableLookups=”false” : 为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值。

 disableUploadTimeout :类似于Apache中的keeyalive一样

给Tomcat配置gzip压缩(HTTP压缩)功能

compression=”on” compressionMinSize=”2048″

compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。

1)compression=”on” 打开压缩功能

2)compressionMinSize=”2048″ 启用压缩的输出内容大小,这里面默认为2KB

3)noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩

4)compressableMimeType=”text/html,text/xml” 压缩类型

最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置,对吧?

<!–enable tomcat ssl–>

    <Connector port=”8443″ protocol=”HTTP/1.1″

               URIEncoding=”UTF-8″  minSpareThreads=”25″ maxSpareThreads=”75″

          enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″

          acceptCount=”300″  maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″

          useURIValidationHack=”false”

                    compression=”on” compressionMinSize=”2048″

                    compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

                SSLEnabled=”true”

           scheme=”https” secure=”true”

           clientAuth=”false” sslProtocol=”TLS”

           keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”

      />

好了,所有的Tomcat优化的地方都加上了。

2、优化JDK 
Tomcat默认可以使用的内存为128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下设置: 
JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化内存大小] -Xmx[可以使用的最大内存] 
或 
设置环境变量:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化内存大小] -Xmx[可以使用的最大内存]” 
一般说来,你应该使用物理内存的 80% 作为堆大小。如果本机上有Apache服务器,可以先折算Apache需要的内存,然后修改堆大小。建议设置为70%;建议设置[[初始化内存大小]等于[可以使用的最大内存],这样可以减少平凡分配堆而降低性能。 
本例使用加入环境变量的方式: 
# vi /etc/profile 
加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700 
# source /etc/profile

【参数说明】

-Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的 快一点,但是也可能会导致机器暂时间变慢。

-Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占 用更多的内存,超出了这个设置值,就会抛出OutOfMemory 异常。

-Xss 是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。

-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64 。

-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

三、tomcat 有那几种Connector 运行模式?

tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。

1)bio

默认的模式,性能非常低下,没有经过任何优化处理和支持.

2)nio

利用java的异步io护理技术,no blocking IO技术.

想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为

 <Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol” 
    connectionTimeout=”20000″ 
    URIEncoding=”UTF-8″ 
    useBodyEncodingForURI=”true” 
    enableLookups=”false” 
    redirectPort=”8443″ />

启动后,就可以生效。

3)apr

安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.

必须要安装apr和native,直接启动就支持apr。下面的修改纯属多余,仅供大家扩充知识,但仍然需要安装apr和native

如nio修改模式,修改protocol为org.apache.coyote.http11.Http11AprProtocol

 

1、如何在tomcat集群中实现Session共享

Apache集群实现Tomcat的Session共享配置其实很简单,在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html ),只不过是英语的,所以联合
下面根据说下怎么配置吧:
1、既然是集群肯定要多准备几个Tomcat来模拟,比如分别为Tomcat01、Tomcat02、Tomcat03。
如果各Tomcat程序放在不同的机器上,那么就不会有端口的冲突。如果是放在同一台机器上的话,那就简单改几个端口,防止端口占用造成的冲突。打开conf文件夹中的server.xml文件,需要修改的端口有:

1、<Server port=”8015″ shutdown=”SHUTDOWN”>  
2、<Connector port=”8081″ protocol=”HTTP/1.1″  connectionTimeout=”20000″ redirectPort=”8443″ />  
3、<Connector port=”8019″ protocol=”AJP/1.3″ redirectPort=”8443″ />  
 
以上port需要修改,至于修改成什么样子,看你自己了,只要不出现端口冲突就可以了,要保证各个Tomcat实例间没有端口冲突
 
2、配置Tomcat的集群设置:
还是修改server.xml文件,最简单的集群配置只需要将<Engine/>节点中注释掉的下面这句取消注释并改为(官网上http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html可以看到)

<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.0.0.4″  
                        port=”45564″  
                        frequency=”500″  
                        dropTime=”3000″/>  
            <Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”  
                      address=”auto”  
                      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、修改项目的web.xml文件:
web.xml文件的修改很简单:只需要在<web-app/>节点中添加<distributable/>这个节点就可以了。
经过这三步就实现了Tomcat的集群下的Session的共享了。

2、Tomcat集群方式的优缺点

Tomcat集群方式有三种,分别是:

1.使用DNS轮询.

2.使用Apache R-proxy方式。

3.使用Apache mod_jk方式.

DNS轮询

缺点:当集群中某台服务器停止之后,用户由于dns缓存的缘故,便无法访问服务,必须等到dns解析更新,或者这台服务器重新启动。

还有就是必须把集群中的所有服务端口暴露给外界,没有用apache做前置代理的方式安全,并且占用大量公网IP地址,而且tomcat还要负责处理静态网页资源,影响效率。

优点:集群配置最简单,dns设置也非常简单。

R-proxy(反向代理)

缺点:当其中一台tomcat停止运行的时候,apache仍然会转发请求过去,导致502网关错误。但是只要服务器再启动就不存在这个问题。

mod_jk

优点:Apache 会自动检测到停止掉的tomcat,然后不再发请求过去。

缺点:当停止掉的tomcat服务器再次启动的时候,Apache检测不到,仍然不会转发请求过去。

R-proxy和mod_jk的共同优点是.可以只将Apache置于公网,节省公网IP地址资源。

可以通过设置来实现Apache专门负责处理静态网页,让Tomcat专门负责处理jsp和servlet等动态请求。

共同缺点是:如果前置Apache代理服务器停止运行,所有集群服务将无法对外提供。

R-proxy和mod_jk对静态页面请求的处理,都可以通设置来选取一个尽可能优化的效果。

这三种Tomcat集群方式对实现最佳负载均衡都有一定不足,mod_jk相对好些,可以通过设置lbfactor参数来分配请求任务,但又因为mod_jk2方式不被推荐,mod_jk2已经不再被更新了。

 

在 做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果 session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态。所以本文就根据这种情况给出三种不同的方法来解决这个问题:

一,利用数据库同步session

在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法:

1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。

2,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。

说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担

二,利用cookie同步session

session 是文件的形势存放在服务器端的,cookie是文件的形势存在客户端的,怎么实现同步呢?方法很简单,就是把用户访问页面产生的session放到 cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session把它放到cookie里面了,你访问被分配到web服务器 B,这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果也没 有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的 同步了。

说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

三,利用memcache同步session

memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。

优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。

缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

四,总结

上面三种方法都是可行的

第一种方法,最影响系统速度的那种,不推荐使用;

第二种方法,效果不错,不过安全隐患一样的存在;

第三种方法,个人觉得第三种方法是最好的,推荐大家使用

其实这么写,可能对你帮助不是很大,但了解一些大概关于集群的知识,对你的面试还是有些帮助的。

分享到:
评论

相关推荐

    2023最新JAVA面试题集

    最新JAVA面试题总结之基础/框架/数据库/JavaWeb/Redis BIO,NIO,AIO,Netty面试题 35道 BTA 常问的 Java基础39道常见面试题及详细答案 Dubbo面试题 47道 ElasticSearch面试题 30道 Git常用命令面试题 60道 Java并发...

    Java架构面试专题汇总

    Java架构面试专题汇总 zookeeper面试.pdf SQL优化面试.pdf Tomcat面试.pdf Netty面试.pdf Nginx面试.pdf RabbitMQ消息中间件面试.pdf redis面试题及答案(上).pdf Redis面试专题及答案(下).pdf Spring面试.pdf ...

    Java面试题资料合集-44套.rar

    java面试-BIO,NIO,AIO,Netty面试题 35道 ...java面试-Tomcat面试题 14道 java面试-Zookeeper面试题 20道 java面试-大数据面试题 100道 java面试-多线程面试59题(含答案) java面试-设计模式面试题 14道

    java面试资料汇总

    Java面试资料汇总的知识点可以从多个方面来总结: 面向对象的编程特性包括封装、继承、多态和抽象,它们是面向对象编程的基础。 String在Java中不是基本数据类型,而是一个不可变的字符序列对象。 int是基本数据...

    【BAT必备】Java面试汇总,全网最全一份

    2020年最新Java面试题整理,全网最全一份,包含各个技术栈,Java基础,Java集合,多线程,Java异常,spring,spring MVC,spring boot,spring cloud,netty,dubbo,activemq,Java web,jvm,kafka,MongoDB,...

    Java面试题大汇总(2021年Java面试题大全带答案)

    Java面试题大汇总(2021年Java面试题大全带答案) Java是一种流行的编程语言,广泛应用于Web开发、Android应用开发、桌面应用开发等领域。作为一名Java开发者,需要具备扎实的基础知识和实践经验。以下是Java面试题...

    Java架构面试专题汇总(含答案)和学习笔记.rar

    首先,`Java基础面试题`是任何Java面试的基础,它涵盖了从语法、面向对象设计到异常处理、集合框架等核心概念。例如,你需要熟悉类与对象的创建,封装、继承和多态的概念,以及如何使用ArrayList、HashMap等集合类。...

    整理的2018 java面试汇总,要面试的抓紧看了

    ### Java面试知识点总结 #### 一、Java基础与核心概念 **1.1 Java关键字与异常处理** - **final, finally, finalize的区别** - `final`:用于声明变量、方法或类为不可更改(常量)。 - `finally`:在异常处理...

    java面试笔试题分类汇总

    这份"java面试笔试题分类汇总"涵盖了多个核心Java技术领域的知识点,对于准备Java面试或笔试的人员来说,是一份非常宝贵的学习资源。以下是对每个领域的详细解读: 1. **EJB (Enterprise JavaBeans)**:EJB是Java ...

    最全Java面试题汇总(一)

    ### 最全Java面试题汇总(一):详细解析与知识点扩展 #### 1. Java面试题概述 本文将对一份“最全Java面试题汇总”中的部分题目进行详细解析,并结合实际应用场景,深入探讨相关知识点。 #### 2. 题目101:变量...

    从入门到精通38万字超详细的Java面试题&amp;八股文&amp;知识点全面汇总

    1、Java基础&框架&容器面试题 ​ 1.1 Java基础面试题 ​ 1.2 java容器面试题 ​ 1.3 JVM面试题 ​ 1.4 Java并发编程面试题 ​ 1.5Java异常面试题 ​ 1.6IO流面试题 ​ 1.7设计模式面试题 ​ 1.8Tomcat、Servlet面试...

    互联网大厂Java面试专题汇总.pdf

    Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、...

    Java面试题、JVM面试题、多线程面试题、并发编程、设计模式面试题

    Java面试题、JVM面试题、多线程面试题、并发编程、设计模式面试题、SpringBoot面试题、SpringCloud面试题、MyBatis面试题、Mysql面试题、VUE面试题、算法面试题、运维面试题。 收集汇总各行业笔试or编程题解题思路 ...

    java面试题汇总

    Java面试题汇总涵盖了众多核心概念,对于准备Java面试或者深入理解Java技术的人员至关重要。以下是一些关键知识点的详细说明: 1. 类继承性:在Java中,不是所有的类都可以被继承。例如,`java.lang.Math`、`java....

    JAVA面试笔试题大汇总\125条常见的java面试笔试题大汇总

    Java面试和笔试题是检验开发者基础技能和深入理解的关键途径。以下是一些常见的Java面试问题及其解析: 26、什么时候用 `assert`? `assert` 用于在代码中插入断言,以确保某些条件在执行时始终为真。在开发和测试...

    350道Java面试题手册(整理100家企业).pdf

    tomcat性能优化整理 jvm性能优化整理 mysql性能优化 springcloud面试整理 springboot面试整理

    java程序员面试题经典集锦

    以上内容只是Java面试题经典集锦的冰山一角,实际涵盖的知识点远不止这些。面试者还需要对Java的IO流、网络编程、反射、注解、垃圾收集机制等有深入理解,才能在面试中表现出色。同时,熟悉Java 8及更高版本的新特性...

    【BAT必备】2020年多家公司整理的350道Java面试题手册

    2020年最新Java面试题整理,全网最全一份,包含各个技术栈,Java基础,Java集合,多线程,Java异常,spring,spring MVC,spring boot,spring cloud,netty,dubbo,activemq,Java web,jvm,kafka,MongoDB,...

    java面试题及答案,包含各种中间件,设计模式等。

    Java面试题及答案,涉及了广泛的中间件技术、设计模式等多个方面,对于准备Java相关面试的求职者来说,是一份非常宝贵的资源。这份压缩包包含了多个PDF文档,涵盖了不同的技术领域,包括网络编程、消息队列、持久化...

    Java面试题项目汇总.doc

    【Java面试题项目汇总】 Java面试中,针对项目经验的提问常常关注以下几个核心知识点: 1. **需求分析与数据库设计**: 在“果酷水果商城”项目中,你参与了需求分析和数据库表的设计。这涉及到理解业务逻辑,...

Global site tag (gtag.js) - Google Analytics