問題:
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 "%r" %s %b" /> </Host> <!-- 如果是本地測試請修改 C:\Windows\System32\drivers\etc\hosts 文件 # 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:\dev\apache-tomcat-7.0.11\site1\ROOT\] instead of [D:\dev\apache-tomcat-7.0.11\webapps\ROOT\] - 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.....
每天進步一點點