『網際網路架構』軟體架構-tomcat之環境部署(下)(22)
tomcat生產環境得應用配置,這次的對各位老鐵還是非常有用的。其實就是咱們生產環境實際要做的一些事情,有老鐵聯絡我說,從之前說的docker還有現在很多部署基本都是跟運維關係很大,跟開發關係很少啊?其實老鐵你誤解我了,我的思路就是不管是在應用的環境,最後的部署希望的是各位老鐵都能完全的熟悉。
原始碼:https://github.com/limingios/netFuture/tree/master/tomcat-pro
Tomcat啟動和部署方式(一)
以真實的專案為例,告訴大家如何去設定專案的部署。
#####現狀
目前慢慢的jeakins 和 devops的普及越多越多的公司開始自動的部署。但是還有很多公司停留在:增量升級和打個war包來進行升級。來一起回顧下他們的流程
- 增量升級
1.前提伺服器的jdk和tomcat,和開發的要保持一致。
2.建立一個資料夾目錄,放入檔案class和jsp等檔案。並且有個txt檔案負責記錄檔案的名稱和對應的要升級的目錄
3.停止服務,伺服器打包備份,然後一個一個進行替換。如果該上升級內容比較多,可能就哭了。
4.替換完畢,啟動服務。 -
整包升級
1.打好war包
2.停止Tomcat
3.上傳並替換 原程式Context目錄
4.刪除原來的WAR包
5.刪除原來的Context 目錄
6.進行 WEB-INF/classes/app.propertites config.propertites 目錄 找到應的配置檔案並修改
7.啟動Tomcat
-
這麼做的弊端是什麼?
1.本身比較繁瑣
2.釋出失敗回滾
3.tomcat需要升級,多個tomcat是不是需要一個一個來
4.jeankins也是這麼做的,最後也是落到tomcat裡面
5.tomcat做配置的時候也比較麻煩
6.tomcat重啟的時候還需要進入bin目錄下的catalina.shell
-
生產環境下,單機多應用的配置
tomcat 是公共的,jdk是公共的。也就是service裡面的APP1,APP2,APP3引用這個tomcat和jdk。
通過vagrant建立虛擬機器,設定虛擬機器的nds。192.168.67.103
vagrant up su - #密碼 vagrant vi /etc/resolv.conf #nameserver 8.8.8.8
-
安裝jdk
>其實我很討厭這種安裝方式,但是為了給老鐵們演示,因為這還是最主流的。我比較崇拜docker的容器映象,還是迴歸話題正常操作,安裝jdk。
yum install -y wget wget wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz" #上邊的下載比較慢,建議不通過wget的方式,本地下載後上傳上去,我下載了3個多小時,當時正好想看電視劇看了幾集 tar -zxvf jdk* cd jdk* #獲取jdk目錄填寫到下面JAVA_HOME中 pwd #追加環境變數 echo "export JAVA_HOME=/root/jdk1.8.0_141" >> /etc/profile echo "export PATH=$""JAVA_HOME/bin:$""PATH" >> /etc/profile #執行下面這個才能生效 source /etc/profile java -version javac -version
-
安裝tomcat7
>在這裡選擇你需要的tomcat https://mirrors.cnnic.cn/apache/tomcat/
下載安裝tomcat
cd ~ #wget tomcat下載的時候很快 wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.92/bin/apache-tomcat-7.0.92.tar.gz tar -zxvf apache-tomcat* #執行下tomcat看能否啟用 cd apache-tomcat* cd bin ./catalina.sh start
- 開始部署service專案目錄和shell指令碼
1.編寫原來的apche-tomcat製作軟連線
cd ~ ln -s ln -s jdk1.8.0_141/ jdk ln -s apache-tomcat-7.0.92/ tomcat #建立service群,裡面可以放很多個tomcat mkdir services cd services #講tomcat拷貝到service裡面一份更改名稱叫tomcat-1 cp -r ~/apache-tomcat-7.0.92 tomcat-1 cd tomcat-1 #刪除專案中無用的 rm -rf apache-tomcat-7.0.92/ bin BUILDING.txtCONTRIBUTING.mdLICENSENOTICEREADME.mdRELEASE-NOTES RUNNING.txt
-
啟動配置shell指令碼
>建立shll指令碼
cd ~ cd services/tomcat-1/ vi tomcat.sh chmod 777 tomcat.sh
指令碼內容
#!/bin/bash export JAVA_OPTS="-Xms100m -Xmx200m" export JAVA_HOME=/root/jdk/ export CATALINA_HOME=/root/tomcat export CATALINA_BASE="`pwd`" case $1 in start) $CATALINA_HOME/bin/catalina.sh start echo start success!! ;; stop) $CATALINA_HOME/bin/catalina.sh stop echo stop success!! ;; restart) $CATALINA_HOME/bin/catalina.sh stop echo stop success!! sleep 2 $CATALINA_HOME/bin/catalina.sh start echo start success!! ;; esac exit 0
檢視目錄結構發現tomcat的常用配置conf,lib,logs,temp,webapps都在,然後我們啟動下這個tomcat,看看日誌是否在logs目錄上列印
./tomcat start ./tomcat stop
- 上邊的方式就實現了,tomcat和jdk都是公共的,每個應用可以有自己的一套配置,只需要複製tomcat-1就可以了。完成裡面的配置、tomcat-1其實就是我們下載的tomcat只是刪除了一些公共的東西。
-
部署的流程
1.webapp目錄下不放入任何的war包
2.建立war目錄。上傳的war都放入這個目錄下,注意:上傳的war包必須要有版本號
3.war解壓後,是根據專案名稱-版本號-日期 合併產生的
4.appwar 軟連線連線到對應的war解壓的目錄
5.在conf/Catalina/ 下建立ROOT.xml。配置解壓war包產生的目錄
6.如果回滾appwar軟連線直接修改成war目錄下指定的專案解壓目錄
7.在開發的時候可能存在svn和git上提交的程式碼都是測試環境,需要替換app.properties,可以建立一個app-conf目錄。每次部署了自動替換專案中的配置檔案。連線正式的資料庫等等。
進入單個的tomcat-1中
cd services cd tomcat-1 ll
建立deploy.sh
vi deploy.sh cat delop.sh mkdir war mkdir app-conf
deploy.sh
#!/bin/bash -e pom_a=$1 pom_v=$2 export work_time=$(date +%Y-%m-%d_%H-%M-%S) #1. download war, ready env echo "deploy time: $work_time" mkdir -p war/ war=war/${pom_a}_${pom_v}.war deploy_war() { target_d=war/${pom_a}-${pom_v}-$work_time target_dir=`pwd`/$target_d if [ ! -f "$war" ]; then echo "war not exist: $war" exit 1 fi unzip -q $war -d $target_dir #cp -r `pwd`/app-conf/* $target_dir/WEB-INF/classes/ rm -f appwar ln -sf $target_d appwar if [ -f current_deploy.sh ] then ./tomcat.sh stop cat current_deploy_dir> last_deploy fi target_ln=`pwd`/appwar echo '<?xml version="1.0" encoding="UTF-8" ?> <Context docBase="'$target_ln'" allowLinking="true"> </Context>' > `pwd`/conf/Catalina/localhost/ROOT.xml echo -ne "#!/bin/bash -e\npom_a=${pom_a}\npom_v=${pom_v}" > current_deploy.sh echo -ne "${target_d}" > current_deploy_dir chmod +x current_deploy.sh ./tomcat.sh start } deploy_war
執行測試
yum install -y unzip zip yum install -y lrzsz cd ~/services/tomcat-1/ chmod 777 deploy.sh cd war #上傳檔案例如:com_V1.0.0 rz cd .. mkdir -p /root/services/tomcat-1/conf/Catalina/localhost/ # com 是專案名,V1.0.0上傳的版本號 ./deploy.sh com V1.0.0
最終tomcat-1目錄。
1.app-conf 是配置檔案
2.appwar 是專案連線的釋出目錄
3.current_deploy_dir 目前釋出的目錄
4.current_deploy.sh 指的是deploy.sh中 pom_a 釋出的專案名稱
5.war是上傳的專案路徑
6.webapps 裡面是空的
基於shell 編寫自定義啟動指令碼實現一鍵釋出。如要完成已下功能。
1. Tomcat 執行檔案與程式目錄分離。(便於後續升級Tomcat或統一配置Tomcat)
2. 一鍵部署釋出應用
3. 可快速回滾應用和配置
4. 自定義配置應用
Tomcat server.xml配置詳解(二)
實際上其實老鐵們配置最多的可能就是context.xml
server.xml
<Server> <Listener /><!-- 監聽器 --> <GlobaNamingResources> <!-- 全域性資源 --> </GlobaNamingResources <Service> <!-- 服務 用於 繫結 聯結器與 Engine --> <Connector 8080/> <!-- 聯結器--> <Connector 8010 /> <!-- 聯結器--> <Connector 8030/> <!-- 聯結器--> <Engine> <!-- 執行引擎--> <Logger /> <Realm /> <host "www.tl.com" appBase=""> <!-- 虛擬主機--> <Logger /> <!-- 日誌配置--> <Context "/luban" path=""/> <!-- 上下文配置--> </host> </Engine> </Service> </Server>
- server 體系結構圖
一個 server 可對應多個 service
Host
host 表示一個虛擬主機,預設使用localhost ,一個Engine 中可配置多個host
演示配置 建立多個虛擬站點 即Host (10分鐘)
Context
表示應用載入目錄 通過 path 屬性指定。其相對路徑為 catalina_base 目錄。可配置多個 Context。另外也可以在 $catalina_base/conf/$host_name/XXX.xml 中新增 Context 元素。
| 元素名 | 屬性 | 解釋 |
| :——: | :——–: | :——–: |
|server |port |指定一個埠,這個埠負責監聽關閉tomcat的請求|
|shutdown| 指定向埠傳送的命令字串 ||
|service |name| 指定service的名字
|Connector(表示客戶端和service之間的連線)| port| 指定伺服器端要建立的埠號,並在這個斷口監聽來自客戶端的請求|
|minThread |伺服器啟動時建立的處理請求的執行緒數 ||
|maxThread| 最大可以建立的處理請求的執行緒數 ||
|enableLookups| 如果為true,則可以通過呼叫request.getRemoteHost()進行DNS查詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址 ||
|redirectPort |指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號 ||
|acceptCount| 指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理 ||
|connectionTimeout |指定超時的時間數(以毫秒為單位) ||
|Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求) |defaultHost |指定預設的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的|
|Context(表示一個web應用程式,通常為WAR檔案,關於WAR的具體資訊見servlet規範) |docBase |應用程式的路徑或者是WAR檔案存放的路徑
path 表示此web應用程式的url的字首,這樣請求的url為http://localhost:8080/path/**** |
|reloadable |這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,我們可以在不重起tomcat的情況下改變應用程式||
|host(表示一個虛擬主機)| name |指定主機名|
|appBase| 應用程式基本目錄,即存放應用程式的目錄 ||
|unpackWARs |如果為true,則tomcat會自動將WAR檔案解壓,否則不解壓,直接從WAR檔案中執行應用程式 ||
|Logger(表示日誌,除錯和錯誤資訊)| className |指定logger使用的類名,此類必須實現org.apache.catalina.Logger 介面|
|prefix| 指定log檔案的字首 ||
|suffix| 指定log檔案的字尾 ||
|timestamp |如果為true,則log檔名中要加入時間,如下例:localhost_log.001-10-04.txt ||
|Realm(表示存放使用者名稱,密碼及role的資料庫 ) |className |指定Realm使用的類名,此類必須實現org.apache.catalina.Realm介面|
|Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣) |className |指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程式的訪問資訊|
|directory |指定log檔案存放的位置 ||
|pattern |有兩個值,common方式記錄遠端主機名或ip地址,使用者名稱,日期,第一行請求的字串,HTTP響應程式碼,傳送的位元組數。combined方式比common方式記錄的值更多 ||
Tomcat 叢集
Tomcat 會話管理器
* StandardManager
Tomcat6的預設會話管理器,用於非叢集環境中對單個處於執行狀態的Tomcat例項會話進行管理。當Tomcat關閉時,這些會話相關的資料會被寫入磁碟上的一個名叫SESSION.ser的檔案,並在Tomcat下次啟動時讀取此檔案。
* PersistentManager
當一個會話長時間處於空閒狀態時會被寫入到swap會話物件,這對於記憶體資源比較吃緊的應用環境來說比較有用。
* DeltaManager
用於Tomcat叢集的會話管理器,它通過將改變了會話資料同步給叢集中的其它節點實現會話複製。這種實現會將所有會話的改變同步給叢集中的每一個節點,也是在叢集環境中用得最多的一種實現方式。
* BackupManager
用於Tomcat叢集的會話管理器,與DeltaManager不同的是,某節點會話的改變只會同步給叢集中的另一個而非所有節點。
PS:看了本次是不是tomcat的配置這麼多門道,其實很多時候很多人都是安於目前的專案,意味的去抱怨,而不想通過技術的手段改變現有沉悶的技術。其實很尷尬啊。
>>原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
>>原文連結地址:上一篇:已是最新文章