Tomcat的使用总结(七)

Tomcat的使用总结(七)

在Eclipse中将Web项目部署到Tomcat中

1、在 eclipse 中,选择 Window--->Preferences--->Server--->Runtime Environments,选择 Add 按钮

2、在弹出的对话框中,选择 Tomcat 服务器的版本,然后点击 Next

3、在弹出来的对话框中,选择 tomcat 的本地路径,JRE的版本等,点击 Finish,最后点击OK

4、创建 Servers,如果找不到 Servers,则选择 Window--->Show View--->Others,然后在弹出来的对话框中输入 Servers,点击OK就可以了看到了

5、在弹出来的对话框中,不用改变啥,直接,Next,然后  Finish 即可

6、双击建好的服务,打开如下界面:

  注意:如果你服务器里面有项目了,那必须清楚项目,才能打开进行修改

7、在打开的界面进行如下的修改操作,然后保存

  

8、服务器已经部署完成,那么接下来就是将项目部署到服务器上,启动服务器即可

  右键项目名,选择 Run AS--->Run on Server,然后点击 Finish 即可运行项目了

注意:第 7 步一定要操作,然后服务器能正常启动,但是访问项目却会报 404 错误。这是因为eclipse将tomcat的项目发布目录(tomcat 目录中的webapp)重定向了,所以你会发现在tomcat安装目录下的webapp目录里面找不到你的项目文件

Tomcat部署项目的三种方式

下载 Tomcat 服务器

  ①、官网下载地址:http://tomcat.apache.org/

启动并部署 Tomcat 服务器

  ①、解压 tomcat 安装包到一个非中文目录下

  ②、配置环境变量。JAVA_HOME(指向 JDK 安装的根目录) 

  ③、双击 apache-tomcat-6.0.16\bin 目录下的 startup.bat,启动服务器(如果一闪而过,那就是没有配置 JAVA_HOME 的环境变量)

  ④、在浏览器中输入 http://localhost:8080

注意:Tomcat 启动不了的时候注意配置 JAVA_HOME:C:\Program Files\Java\jdk1.6.0_43这是安装 JDK的根目录

Tomcat 的目录结构

部署项目的第一种方法(项目直接放入 webapps 目录中)

 1、将编写并编译好的web项目(注意要是编译好的,如果是 eclipse,可以将项目打成 war 包放入),放入到 webapps 中

 

  2、启动tomcat服务器(双击 apache-tomcat-6.0.16\bin 目录下的 startup.bat,启动服务器)

      3、在浏览器输入:http://localhost:8080/项目名/访问的文件名

   

部署项目的第二种方法(修改 conf/server.xml 文件 )

 ①、打开tomcat下conf/server.xml,在<Host> </Host>标签之间输入项目配置信息

1

<Context path="/WebProject" docBase="D:/WebProject" reloadable="true" />

  path:浏览器访问时的路径名

  docBase:web项目的WebRoot所在的路径,注意是WebRoot的路径,不是项目的路径。其实也就是编译后的项目

  reloadble:设定项目有改动时,tomcat是否重新加载该项目

 ②、双击 startup.bat,启动 tomcat 服务器,然后在浏览器输入访问的项目名称路径

 

注意:如果你配置的 path="/xx",那么访问的时候就是这样:

有的时候我们希望访问项目的时候直接输入地址以及端口号就可以访问,这个时候就需要配置一下tomcat的配置文件了

<Context docBase="项目名称" path="" debug="0" reloadable="false">

修改配置文件之后就可以直接通过地址、端口号来直接访问项目了,如下图:

部署项目的第三种方法(apache-tomcat-7.0.52\conf\Catalina\localhost )

      ①、进入到 apache-tomcat-7.0.52\conf\Catalina\localhost 目录,新建一个 项目名.xml 文件

  ②、在 那个新建的 xml 文件中,增加下面配置语句(和上面的是一样的,但是不需要 path 配置,加上也没什么用)

<Context  docBase="D:/WebProject" reloadable="true" />

  ③、在浏览器输入路径:localhost:8080/xml文件名/访问的文件名

   

总结:

①、第一种方法比较普通,但是我们需要将编译好的项目重新 copy 到 webapps 目录下,多出了两步操作

②、第二种方法直接在 server.xml 文件中配置,但是从 tomcat5.0版本开始后,server.xml 文件作为 tomcat 启动的主要配置文件,一旦 tomcat 启动后,便不会再读取这个文件,因此无法再 tomcat 服务启动后发布 web 项目

③、第三种方法是最好的,每个项目分开配置,tomcat 将以\conf\Catalina\localhost 目录下的 xml 文件的文件名作为 web 应用的上下文路径,而不再理会 <Context>中配置的 path 路径,因此在配置的时候,可以不写 path。

通常我们使用第三种方法

tomcat常用架构:
1)nginx+tomcat;即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录
2)tomcat直接部署站点,不通过nginx反向代理。

Tomcat多版本war应用部署

tomcat7开始,tomcat支持应用的多版本部署,这个特性很不错,尤其是生产环境中,升级应用,无需重启tomcat,升级过程不影响业务。热升级的特性,也只有少数顶级商业中间件能做到。

tomcat的并行部署

tomcat7开始,可以同时部署相同context path的多个不同版本的web应用,现在只能通过tomcat manager使用WAR file to deploy,才能做到多版本同时部署。war包的命名只能是context.warcontext##2.war,context##3.war之类。

当用户使用http://localhost:8080/context访问时,规则如下:

如果当前请求没有session信息,则使用最新的war应用版本

如果当前请求有session,使用session对应的war应用版本

如果当前请求有session信息,却找不到相应的war应用版本,则使用最新的war应用版本

使用实例

作为开发人员,我开发了一个web应用,web应用是一个war包,里面有一个index.jsp,简单执行了out.print("jsp hello 1")。项目开发完毕后,web应用打包为myapp##1.war。

访问http://localhost:8080/manager/ ->Deploy ->WAR file to deploy->Select WAR file to upload->选择myapp##1.war->点击Deploy

上传成功后,可以看到Applications新增一个path为myapp,Version为1的应用。

使用google浏览器访问http://localhost:8080/myapp/index.jsp,可以看到页面显示jsp hello 1

由于需求变更,需要把页面显示修改为jsp hello 2,修改代码后,打包web应用为myapp##2.war。

重新上传,可以看到Applications新增一个path为myapp,Version为2的应用。

使用google浏览器访问http://localhost:8080/myapp/index.jsp,可以看到页面显示jsp hello 1(因为session信息对应版本1的应用,所以还是访问版本1的应用)

然后再新开火狐浏览器,访问http://localhost:8080/myapp/index.jsp可以看到页面显示jsp hello 2(因为没有session信息,所以是访问最新版本的应用)

Tomcat如何部署同一应用的不同版本

你是否听说过在一个Tomcat中部署两个应用,使用相同的请求路径?
你是否了解,对于Tomcat中的应用,可以部署同时部署多个版本?
其实,在Tomcat的Context组件中,包含一项名叫Parallel Deployment的功能,就支持我们上面提到的这几点。
也许,你会问,我为什么要部署两个同名的应用呢?

试想下面一种场景:

你的应用已经部署到线上,正在源源不断的接收到用户的请求,你忽然发现有一个功能需要马上修改一下、升级一下,甚至说你的产品发了新版本。此时为了上线新功能、新版本,你采用什么方式实现,又不影响用户使用呢?
不少同学会想到集群部署的应用,可以先把一部分的实例停止,部署后再启动起来再部署另外一部分。

那对于单实例的应用,该怎么办呢?

憋着急,我们有Tomcat的Parallel Deployment特性,可以同时部署应用的多个版本,而且请求的path保持一致。这真是个好消息。对于部署新版本之后到达的请求,默认会使用新版本来处理,对于旧的请求,由于session中已经包含请求数据,所以会继续处理,直到完成。
下图是manager应用是显示的当前虚拟主机中部署的多个版本的应用。

那对于要以多版本部署的应用,应该如何配置呢?
对于应用的版本部署那是相~当~简单,只需要新版本应用的应用名称后加两个#,再加上版本号即可。例如

foo##1.0.war

在部署时,1.0被做为应用的版本号使用。

或者应用以目录形式部署时也以这种格式命名即可。然后采用熟悉的形式,无论 是直接在webapps目录中部署还是通过manager应用远程部署,都可以。

总结下:

1. webapps/myapp##1.0.war

2. webapps/myapp##1.1/..

3. <Context path="/myapp" docBase="E:\\myapp##1.2"/>

默认站点根目录  

tomcat的默认站点根目录是webapps/ROOT,配置文件是server.xml,
配置文件server.xml 里的主要内容是:

[root@huanqiu-test ~]# vim /Data/app/tomcat-7/conf/server.xml       //如若修改tomcat的访问端口,替换下面的8080即可
.....
    <Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"        //URIEncoding="UTF-8"这个配置在这里默认是没有的,这里是我手动添加的,保证tomcat的编码是UTF-8
               connectionTimeout="20000"
               redirectPort="8443" />
.....
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
.....

上面配置说明tomcat的访问地址是http://localhost:8080
站点目录是/Data/app/tomcat-7/webapps/ROOT
记住提前将webapps目录清空,然后注意:
如果代码的war包名称是ROOT.war,那么tomcat重启后,访问站点的根目录就是webapps/ROOT,访问url是http://localhost:8080 (ROOT目录,在访问时的url中可以省略)
如果代码的war包名次不是ROOT.war,比如是jenkins.war,那么tomcat重启后,访问站点的根目录就是webapps/jenkins,访问url就是http://localhost:8080/jenkins (非ROOT目录,在访问时的url中必须要带上)

[root@huanqiu-test ~]# ll /usr/local/tomcat7/webapps/
total 62180
drwxr-xr-x. 16 root root 4096 Dec 15 12:33 jenkins
-rw-r--r--. 1 root root 63664946 Oct 30 20:38 jenkins.war

因此这个tomcat站点访问地址是:http://localhost:8080/jenkins

修改默认域名                                                                                                                                       
如下,只修改"Host name"处,将默认的localhost修改为www.wangjenkins.com
那么此tomcat站点访问地址是:http://www.wangjenkins.com:8080/jenkins/

[root@huanqiu-test ~]# vim /Data/app/tomcat-7/conf/server.xml      
.....
    <Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"       
               connectionTimeout="20000"
               redirectPort="8443" />
.....
      <Host name="www.wangjenkins.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
.....

tomcat的临时域名 

由于Tomcat服务器是在本机上的,因此可以使用localhost来访问。localhost表示本机。 
访问Tomcat服务器的方式有:

①. 使用域名localhost访问。仅限于本机上,例如http://localhost:8080 
②. 使用IP地址127.0.0.1 访问。仅限于本机,例如http://127.0.0.1:8080。本IP是保留IP ,代表本机。 

③. 使用机器域名访问。仅限于本机上或者局域网内。例如我的机器名为tomgs,则http://tomgs:8080。 
④. 使用本机IP地址访问。172.168.56.112:8080 
⑤. 如果有域名指向该服务器,可以使用域名访问,例如www.tomgs.com 
除了上面几种以外,windows还提供一种机制,为机器设置临时域名。打开C:\Windows\System32\drivers\etc文件夹,先把hosts文件剪切到桌面(不然编辑之后不能保存)。并在文件的最后添加一个IP地址与对应的主机名称。 
本机DNS

然后启动tomcat之后就可以用自己定义的域名访问tomcat了。 
不建议修改host文件,仅用于某域名来测试本机上的web程序。

  1. 设置虚拟主机 
    Tomcat中可以设置虚拟主机,即多个不同域名的网站共存于一个tomcat中,方法是修改其server.xml。一个<host>代表一个虚拟机主机、一个域名,
<Engine defaultHost="blog" name="Catalina">
        <Host appBase="webapps/blog" autoDeploy="true" name="www.tomgs.com" unpackWARs="true">
        <Host appBase="webapps/bookstore" autoDeploy="true" name="www.tincopper.com" unpackWARs="true">
 </Engine>

Tomcat会根据访问的域名不同,自动映射到不同的网站目录中。

修改tomcat访问的默认站点目录

如下配置,重启tomcat后,它就会把起先默认站点目录/Data/app/tomcat-7/webapps/ROOT修改成/home/tomcat/www这个目录。

[root@huanqiu-test ~]# vim /Data/app/tomcat-7/conf/server.xml      
.....
    <Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"       
               connectionTimeout="20000"
               redirectPort="8443" />
.....
      <Host name="www.wangjenkins.com"  appBase="/home/tomcat/www"  //这里的appBase后填写的是新的站点根目录,也可以还设置成webapps(若是webapps,则下面的Context一行必须设置)
            unpackWARs="true" autoDeploy="true">
      <Context path="" docBase="/home/tomcat/www" debug="0" reloadable="true" />  //这一行最好添加上,path后面的""里配置的是tomcat的子项目,""为空,表示是父项目
.....

[root@huanqiu-test ~] # ll /home/tomcat/www/
total 62180
drwxr-xr-x. 9 root root 4096 Dec 15 13:42 jenkins
-rw-r--r--. 1 root root 63664946 Dec 15 13:42 jenkins.war

[root@huanqiu-test ~] # ll /usr/local/tomcat7/webapps/
total 62184
drwxr-xr-x. 7 root root 4096 Dec 15 14:34 jenkins

这个tomcat站点访问地址是:http://www.wangjenkins.com:8080/jenkins

注意:
1)上面的appBase可以配置成新的站点目录,这时下面的Context这一行配置可以不加。默认站点目录webapps下还是会产生代码目录,只是tomcat访问的时候不会去调用它。
2)上面的appBase可以配置成默认的webapps站点目录,这种情况下,就必须添加Contest这一行,并在Context行内配置新的站点目录。tomcat启动后,解压代码的war包会往webapps这个默认站点目录里也产生一份(即新站点目录和默认的webapps站点目录都会有一份代码),只是tomcat访问时不会去调用webapps目录下的代码;
3)Context这一行是tomcat的项目配置,path后的""内填写的是项目名称,如果""为空,则表示是父项目。Context这一行的配置:
     在appBase配置成新的站点目录的情况下可有可无(不过建议最好还是配置上)
     在appBase配置成默认的webapps目录的情况下就必须要有!

所以配置也可以是:
       <Host name="www.wangjenkins.com" appBase="/home/tomcat/www"
                 unpackWARs="true" autoDeploy="true">
也可以是:
      <Host name="www.wangjenkins.com" appBase="webapps"
                unpackWARs="true" autoDeploy="true">
      <Context path="" docBase="/home/tomcat/www" debug="0" reloadable="true" />

部署多个项目       

1.在同一个tomcat下(即同一个端口)有两种方式:
   1)共用同一个域名(同一Host name)下的多个子项目
   2)不同域名(多个Host name)下的项目

tomcat多项目部署,需要用到下面一行:

<Context path="" docBase="/home/tomcat/www" debug="0" reloadable="true" />

其中,path后的""内填写的是项目名称,如果""为空,则表示是父项目(父项目情况下,这个Context行可以省略)

同一个域名下的多项目部署,配置如下:

[root@huanqiu-test ~]# vim /usr/local/tomcat7/conf/server.xml //Context行的位置放在"className"区域的下面
.......
      <Host name="www.wangjenkins.com" appBase="webapps"
          unpackWARs="true" autoDeploy="true">
......
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                prefix="localhost_access_log." suffix=".txt"
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
     <Context path="/huanqiu1" reloadable="true" docBase="/usr/local/tomcat7/huanqiu1"/> 
     <Context path="/huanqiu2" reloadable="true" docBase="/usr/local/tomcat7/huanqiu2"/> 
</Host> 
......

上面的配置可知:
父项目是http://www.wangjenkins.com/8080/jenkins,站点目录是/usr/local/tomcat7/webapps,由于webapps下不是默认的ROOT,而是jenkins。所以访问的url里要带jenkins
两个子项目分别是:
http://www.wangjenkins.com/8080/huanqiu1,对应的站点目录是/usr/local/tomcat7/huanqiu1
http://www.wangjenkins.com/8080/huanqiu2,对于的站点目录是/usr/local/tomcat7/huanqiu2

不同域名下的多项目部署,配置如下:

[root@huanqiu-test ~]# vim /usr/local/tomcat7/conf/server.xml
......
     <Host name="localhost" appBase="webapps"                        //这个是默认的配置区域
                unpackWARs="true" autoDeploy="true">

      <!-- SingleSignOn valve, share authentication between web applications
          Documentation at: /docs/config/valve.html -->
     <!--
     <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
     -->

     <!-- Access log processes all example.
           Documentation at: /docs/config/valve.html
           Note: The pattern used is equivalent to using pattern="common" -->
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                prefix="localhost_access_log." suffix=".txt"
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      <Host name="www.beijing.com" appBase="apps"
                unpackWARs="true" autoDeploy="true">

       <!-- SingleSignOn valve, share authentication between web applications
               Documentation at: /docs/config/valve.html -->
       <!--
       <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
       -->

       <!-- Access log processes all example.
              Documentation at: /docs/config/valve.html
              Note: The pattern used is equivalent to using pattern="common" -->
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                  prefix="localhost_access_log." suffix=".txt"
                  pattern="%h %l %u %t &quot;%r&quot; %s %b" />

       <Host name="www.wangshibo.com" appBase="wang"
                 unpackWARs="true" autoDeploy="true">

       <!-- SingleSignOn valve, share authentication between web applications
               Documentation at: /docs/config/valve.html -->
       <!--
       <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
       -->

       <!-- Access log processes all example.
              Documentation at: /docs/config/valve.html
              Note: The pattern used is equivalent to using pattern="common" -->
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
             prefix="localhost_access_log." suffix=".txt"
             pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       <Context path="/ops1" reloadable="true" docBase="/data/web/ops1"/> 
       <Context path="/ops2" reloadable="true" docBase="/data/web/ops2"/>

根据上面的配置可知:
http://localhost:8080 对应的站点目录是/usr/local/tomcat7/webapps(假设对应站点目录下的名称都是ROOT)
http://www.beijing.com:8080 对应的站点目录是/usr/local/tomcat7/apps
http://www.wangshibo.com:8080 对应的站点目录是/usr/local/tomcat7/wang,并且这个项目下有两个子项目分别是http://www.wangshibo.com:8080/ops1、http://www.wangshibo.com:8080/ops2

2.在不同的tomcat下(不同的端口)
将tomcat复制成多个副本,然后根据业务更改复制后的tomcat名,修改server.conf中的三个关键端口(下面会提到).注意站点目录对应关系。
[不过,为了避免不必要的麻烦,最好还是别复制已经在使用中的tomcat,可以重新解压tomcat安装包进行使用(将其备份,以待后续再使用)].当然也可以在不同端口的tomcat下设置各自的子项目。

需要注意的问题
在一个服务器上启用了多个tomcat实例,那么需要特别注意的就是各个实例的端口问题,很容易因为端口冲突造成tomcat实例启动失败!

各个tomcat实例需要修改的端口,其实就是server.xml文件里的三个端口需要修改,如下:

[root@huanqiu-test conf]# pwd
/Data/app/tomcat-7-wls/conf
[root@huanqiu-test conf]# vim server.xml 
.......
        <Connector port="8383" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443" />
......
        <Server port="8785" shutdown="SHUTDOWN">
......

        <Connector port="8789" protocol="AJP/1.3" redirectPort="8443" />

只要上面三个端口不冲突,基本就能成功启动实例了。


另外:最好做下java的环境变量设置,不然,tomcat启动容易失败~~

[root@huanqiu-test ~]# java -version
java version "1.7.0_45"
OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
[root@huanqiu-test ~]# which java
/usr/bin/java
[root@huanqiu-test ~]# ll /usr/bin/java
lrwxrwxrwx. 1 root root 22 7月 11 2015 /usr/bin/java -> /etc/alternatives/java
[root@huanqiu-test ~]# ll /etc/alternatives/java
lrwxrwxrwx. 1 root root 46 7月 11 2015 /etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

由此可知,java的home目录是/usr/lib/jvm/jre-1.7.0-openjdk.x86_64

[root@huanqiu-test jvm]# ll

总用量 8

drwxr-xr-x. 3 root root 4096 7月 11 2015 java-1.6.0-openjdk-1.6.0.0.x86_64
drwxr-xr-x. 3 root root 4096 7月 11 2015 java-1.7.0-openjdk-1.7.0.45.x86_64
lrwxrwxrwx. 1 root root 21 7月 11 2015 jre -> /etc/alternatives/jre
lrwxrwxrwx. 1 root root 27 7月 11 2015 jre-1.6.0 -> /etc/alternatives/jre_1.6.0
lrwxrwxrwx. 1 root root 37 7月 11 2015 jre-1.6.0-openjdk.x86_64 -> java-1.6.0-openjdk-1.6.0.0.x86_64/jre
lrwxrwxrwx. 1 root root 27 7月 11 2015 jre-1.7.0 -> /etc/alternatives/jre_1.7.0
lrwxrwxrwx. 1 root root 38 7月 11 2015 jre-1.7.0-openjdk.x86_64 -> java-1.7.0-openjdk-1.7.0.45.x86_64/jre
lrwxrwxrwx. 1 root root 29 7月 11 2015 jre-openjdk -> /etc/alternatives/jre_openjdk

设置java的环境变量

[root@huanqiu-test jvm]# vim /etc/profile
.......
export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

使之生效

[root@huanqiu-test ~]# source /etc/profile

[root@huanqiu-test ~]# echo $JAVA_HOME
/usr/lib/jvm/java-1.7.0-openjdk.x86_64
[root@huanqiu-test ~]# echo $CLASSPATH
.:/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/rt.jar:/usr/lib/jvm/java-1.7.0-openjdk.x86_64/lib/dt.jar:/usr/lib/jvm/java-1.7.0-openjdk.x86_64/lib/tools.jar

上面java的环境变量一定要设置!不然tomcat启动会失败,会有以下报错:

INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

[通常:在对tomcat服务进行迁移或切换的时候,需要将webapps下的ROOT和ROOT.war包都一起拷贝过去]

配置tomcat使用的JDK

在部署系统时,为了不想去配置JDK 的环境变量,可以直接再Tomcat中指定JDK 的位置:

修改文件位置:apache-tomcat-7.0.77\bin\setclasspath.bat;

需要设置JDK 的安装安装路径以及JRE 路径;

修改Tomcat命令窗口的名字

在运行多个tomcat窗口的时候,可以通过修改tomcat命令窗口的名字来区分不同的tomcat;

文件位置:apache-tomcat-7.0.77\bin\catalina.bat

修改Tomcat为你想要设置的名字:

Tomcat中实现IP访问限制      

Tomcat中的ip访问限制,即设置允许某个(或某些)客户端能够访问到tomcat服务器,或不能访问tomcat服务器。
限制tomcat的IP访问其实是一件非常容易的事情,只需要编辑tomcat的server.xml,增加适当代码即可。

修改如下:
例如有一个名为myapp的虚拟目录,打开tomcat的server.xml配置文件,找到其配置代码如下:
<Context path="/myapp" reloadable="true" docBase="/var/www/myapp" />
将其改成下面代码:
<Context path="/myapp" reloadable="true" docBase="/var/www/myapp">
    <valueclassName="org.apache.catalina.values.RemoteAddrValue"
        allow="127.0.0.1" deny="″ />
</Context>
 
经过这样设置后,将只允许本机访问Tomcat.
 
如要限制只能192.168.1.0-192.168.5.255和192.168.10.0-192.168.15.255这样的IP段,可以类似这样写:
<Context path="/myapp" reloadable="true" docBase="/var/www/myapp">
    <valueclassName="org.apache.catalina.values.RemoteAddrValue"
        allow="192.168.[1-5].*,192.168.[10-15].*" deny="″ />
</Context>
设置好后重新启动Tomcat就生效.
 
注意:
<Context 内容要放在<Host </Host>之间
 
---------------------另一种玩法---------------------
效果:只有指定的主机或IP地址才可以访问部署在Tomcat下的应用。
Tomcat供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve,前者用于限制主机名,后者用于限制IP地址。通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。
 
1)全局设置,对Tomcat下所有应用生效
server.xml中添加下面一行,重启服务器即可:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" deny=""/>
此行放在</Host>之前。
 
例子:
只允许192.168.1.10访问:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.10" deny=""/>
 
只允许192.168.1.*网段访问:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" deny=""/>
 
只允许192.168.1.10、192.168.1.30访问:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.10,192.168.1.30" deny=""/>
 
根据主机名进行限制:
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="abc.com" deny=""/>
 
2)局部设置,仅对具体的应用生效
根据项目配置情况进行设置:
直接在server.xml中进行设置${tomcat_root}/conf/server.xml
 
在上述文件对应项目的</Context>前增加下面一行:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" deny=""/>
 
特别需求:测试版本不想提供别人访问
打开tomcat6/conf/server.xml文件
如果是要限制整个站点别人不能访问,则要将
<Valve className="org.apache.catalina.valves.RemoteAddrValve"  allow="192.168.1.*,192.168.2.*,*.mysite.com" deny=""/>
加入到<HOST></HOST>标签中
 
如果是要限制某个站点不能被访问,则要加入到<Context>里面就可以。
<Context path="/myweb" reloadable="true" docBase="/data/tomcat6/webapps/myweb">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.13.110,192.168.1.*,220.250.13.21" deny=""/>
</Context>
  
RemoteHostValve表示根据主机名进行限制:
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="tmachine1" deny=""/>
修改文件:
tomcat/conf/server.xml
 
通过tomcat限制ip访问
<Engine name="Standalone" ...>
<Valve className="org.apache.catalina.valves.RemoteHostValve"
         allow="*.mycompany.com,*.a.com"/>                                 //域名限制
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         deny="192.168.1.*"/>                                             //IP限制
</Engine>
 
重启tomcat生效

Tomcat 大文件上传超时问题处理            

公司的OA系统在上传一个70多M的大文件过程中,出现了"上传超过有效期"超时现象。原因是tomcat持续上传附件时间超过了系统默认时间。

需要调整tomcat容器的JVM参数,修改方法如下:在tomcat的bin/catalina.sh文件里添加参数"-DLandray.sys.att.expire=600",此参数是修改附件上传有效期,这里上传有效期为600秒,既持续上传时间为10分钟,超过10分钟附件还未上传成功则会提示超时,可根据实际情况调整这个时常。

[root@oa-app02 bin]# vim /home/app/linux64/tomcat/bin/catalina.sh
.......
JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx3072m -XX:PermSize=256M -XX:MaxPermSize=512M -Xmn256M -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Djava.net.preferIPv4Stack=true -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -DLandray.kmss.cluster.serverName=ekp_server21 -Djava.net.preferIPv4Stack=true -DLandray.sys.att.expire=600"

接着重启tomcat即可

[root@oa-app02 bin]# ps -ef|grep tomcat|grep -v grep |xargs kill -9

[root@oa-app02 bin]#/home/app/linux64/tomcat/bin/startup.sh

================================================================
另外注意:tomcat配置文件中关于超时时间的配置如下:
在tomcat的server.xml中加入如下配置

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="300000" disableUploadTimeout="true"
            minProcessors="50" maxProcessors="375" acceptCount="500"
            redirectPort="5443" URIEncoding="UTF-8"/>

其中:
connectionTimeout:设置连接的超时值,以毫秒为单位。默认值为60000=60秒
disableUploadTimeout:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为true
maxProcessors:最大连接线程数
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接。 

发布了370 篇原创文章 · 获赞 88 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/100079696
今日推荐