zoukankan      html  css  js  c++  java
  • 【tomcat】不同域名解析到同一tomcat不同项目上

    问题:

      1. 有多个域名,想输入的每个域名只能访问其中的一个项目

         2. 这些项目都部署在同一个tomcat上的

      

       解决步骤:

            1.首先把所有域名都解析到这台服务器上,解析时只能填写ip地址,不能指定端口的,默认访问解析IP的80端口

        2.把web项目部署在tomcat安装目录下,需要和默认的webapps目录平级,并且直接将web项目打包为ROOT.war 启动时会解压到ROOT文件夹

         目录结构如下:

                         

         3. 修改tomcat conf目录下 server.xml 文件如下(或者直接用下面的代码替换,端口已经改为80了) 

          

    <?xml version='1.0' encoding='utf-8'?>
    <Server port="8005" shutdown="SHUTDOWN">
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
      <Listener className="org.apache.catalina.core.JasperListener" />
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    
      <GlobalNamingResources>
    
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
      </GlobalNamingResources>
    
      <Service name="Catalina">
    
        <Connector port="80" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
        <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
          </Realm>
    
          <Host name="localhost"  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" />
    
          </Host>
                
          <!--
            如果是本地测试请修改
            C:WindowsSystem32driversetchosts 文件
            # For example:
            127.0.0.1 localhost
            127.0.0.1       localhost
            127.0.0.1       www.site1.com
            127.0.0.1       www.site2.com
            127.0.0.1       site1.com
            127.0.0.1       site2.com
            
            如果是已注册好的域名请解析www,@到tomcat所在服务器ip
            
            端口8080 请修改为80,否则需要在域名后面加端口
            
            下面每个项目都解析了两次,是为了用户在输入网址时,不管有没有www.都能正常访问
          -->
          <Host name="site1.com" appBase="site1"
               unpackWARs="true" autoDeploy="true"
               xmlValidation="false" xmlNamespaceAware="false">
         </Host>
         <Host name="www.site1.com" appBase="site1"
               unpackWARs="true" autoDeploy="true"
               xmlValidation="false" xmlNamespaceAware="false">
         </Host>
            
         <Host name="site2.com" appBase="site2"
               unpackWARs="true" autoDeploy="true"
               xmlValidation="false" xmlNamespaceAware="false">
         </Host>
         <Host name="www.site2.com" appBase="site2"
               unpackWARs="true" autoDeploy="true"
               xmlValidation="false" xmlNamespaceAware="false">
         </Host>
        </Engine>
      </Service>
    </Server>

    注意: 本地测试请修改host文件,请看上面注释

    启动tomcat后 不管是输入 www.site1.com 或者 site1.com都能正常访问了!

    搭建简单项目可以按照上面方式进行,但是如果项目比较庞大或者访问较多, 请不要使用此方式, 应该采ngix前端分发到不同端口上

    配置请参看 我的另一篇文章 

    windows 环境下nginx + tomcat群 + redis 实现session共享

    2016年1月29日22:02更新

    为了测试两个标准的spingmvc+hibernate+shiro web项目到底启动需要消耗多少内存,又发现了些问题

    因为要部署两个项目,按照上面的方法, 我很懒 直接拷贝一个打好的war包到site1目录和site2目录【注意  这两个war包是一模一样的】

    然后启动tomcat

    ..............................................

    第一个先解压的site1 正常

    第二个启动site2   提示初始化完成,紧接着又提示closing。 错误提示只有一个   start error!!!!!!!!!!!!!!

    start error!!!!   到底啥错没有更详细的了,查了些资料为了要查看更详尽的信息需要进行这一步操作

    就是在WEB-INF/classes目录下方式一个logging.properties文件,内容如下:

    handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
    
    ############################################################
    # Handler specific properties.
    # Describes specific configuration info for Handlers.
    ############################################################
    
    org.apache.juli.FileHandler.level = FINE
    org.apache.juli.FileHandler.directory = ${catalina.base}/logsdebug
    org.apache.juli.FileHandler.prefix = error-debug.
    
    java.util.logging.ConsoleHandler.level = FINE
    java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

    再启动,  去tomcat 的 logsdebug目录下查看启动信息  或者 直接看控制台启动日志,现在就能看到相信信息了

    错误提示为:

    严重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
    java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [D:devapache-tomcat-7.0.11site1ROOT] instead of [D:devapache-tomcat-7.0.11webappsROOT] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
        at org.springframework.web.util.WebUtils.setWebAppRootSystemProperty(WebUtils.java:150)
        at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:117)
        at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:46)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4681)
        at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5184)
        at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5179)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

    看见了 webAppRootKey  这个就容易了,为啥呢, 因为我知道这个啥意思,不懂的百度下

    并且错误信息也说得很明确了  看几个关键字就好了     web.xml   unique value

    因为我们两个war包完全一致,相当于在同一个tomcat下启动了两个同名的项目,这个不允许

    需要进行如下配置,为每一个项目制定一个不同的 webAppRootKey值,因为项目都又log4j

    直接添加参数就好了

    <display-name>site1</display-name>
        <description>site1.com</description>
        
        <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>site1</param-value>
        </context-param>

    直接写在最前面就好了,   每个项目的 webAppRootKey 一定要不一样【同一个tomcat下】,否则为默认值 webapp.root, 然后我又没有设置环境变量  所以直接改

    发现了这个问题,其实可以以后再写xml时候,不论会不会在同一个tomcat下发布,我建议大家都指定一个值,比如当前时间戳精确到毫秒或者uuid.....

    每天进步一点点

  • 相关阅读:
    css中的元素旋转
    display:inlineblock的深入理解
    js时间获取。
    长英文自动换行的最终解决方法
    jqery图片展示效果
    链接A引发的思考
    电子邮件制作规范和建议
    overflow与textindent:9999px 字体隐藏及input value偏移
    jQuery load的详解
    转载:前端调试利器DebugBa
  • 原文地址:https://www.cnblogs.com/xiaochangwei/p/5160474.html
Copyright © 2011-2022 走看看