問題:html
1. 有多個域名,想輸入的每一個域名只能訪問其中的一個項目前端
2. 這些項目都部署在同一個tomcat上的java
解決步驟:nginx
1.首先把全部域名都解析到這臺服務器上,解析時只能填寫ip地址,不能指定端口的,默認訪問解析IP的80端口web
2.把web項目部署在tomcat安裝目錄下,須要和默認的webapps目錄平級,而且直接將web項目打包爲ROOT.war 啓動時會解壓到ROOT文件夾redis
目錄結構以下:spring
3. 修改tomcat conf目錄下 server.xml 文件以下(或者直接用下面的代碼替換,端口已經改成80了) apache
<?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文件,請看上面註釋windows
啓動tomcat後 無論是輸入 www.site1.com 或者 site1.com都能正常訪問了!tomcat
搭建簡單項目能夠按照上面方式進行,可是若是項目比較龐大或者訪問較多, 請不要使用此方式, 應該採ngix前端分發到不一樣端口上
配置請參看 個人另外一篇文章
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.....
天天進步一點點