Tomact升級步驟

本文以apache-tomcat-6.0.18升級爲apache-tomcat-7.0.85爲例。

目錄

一、準備Tomcat包

二、升級步驟

2.1、停服務

2.2、打包現有Tomcat目錄下logs和webapps目錄

2.3、備份現有Tomcat目錄

2.4、上傳Tomcat安裝包至 $HOME 下並解壓

2.5、修改環境變量及啓動腳本參數

2.6、Tomcat啓動驗證

2.7、遷移原項目及日誌

2.8、啓動驗證

三、有問題回退步驟

3.1、Tomcat包回退

3.2、環境變量回退

3.3啓動驗證

四、升級問題統計

4.1、url特殊字符問題

4.1.1日誌信息:

4.1.2問題分析

4.1.3解決方案


一、準備Tomcat包

可通過【uname -a】命令查看服務器系統信息。

下載的Tomcat包爲Linux下的,apache-tomcat-7.0.85.tar.gz,若需部署的環境可解壓“*.tar.gz”包,可直接看第二步。

筆者需要部署的環境沒法解壓“*.tar.gz”包,故先在可解壓的環境下將安裝包解壓,然後打成tar包,然後拿到要部署的環境。但在用sftp拿到Windows下後(兩個機器訪問不通需先拿到Windows下,然後上傳),發現拿到的tar包裏多了“PaxHeaders.*”文件,經查是sftp傳輸的問題,需在打成tar包時增加一個參數:【--format=gnu】,打完包再傳就可以了。

#1.解壓
tar xvf apache-tomcat-7.0.85.tar.gz

#2.重新打包
tar --format=gnu cvf apache-tomcat-7.0.85.tar apache-tomcat-7.0.85

二、升級步驟

【打包舊的包注意空間剩餘量!!!(df -k $HOME)】

2.1、停服務

cd

./apache-tomcat-6.0.18/bin/shutdown.sh

2.2、打包現有Tomcat目錄下logs和webapps目錄

cd
cd apache-tomcat-6.0.18
tar cvf logs.tar logs
tar cvf webapps.tar webapps

2.3、備份現有Tomcat目錄

cd
mv apache-tomcat-6.0.18 apache-tomcat-6.0.18_bak

2.4、上傳Tomcat安裝包至 $HOME 下並解壓

cd
tar xvf apache-tomcat-7.0.85.tar

2.5、修改環境變量及啓動腳本參數

#note:筆者環境下Tomcat的啓動腳本是在myshell.sh中添加的自定義命令
【start is aliased ~/apache-tomcat-6.0.18/bin/startup.sh,
down is aliased ~/apache-tomcat-6.0.18/bin/shutdown.sh】,
同時myshell.sh在.profile裏有引用,故需修改myshell.sh
cd
cd mysbin
cp myshell.sh myshell.sh.bak

vi myshell.sh
#全量替換【在該腳本中有Tomcat啓動腳本的自定義命令】
:%s/6.0.18/7.0.85/g
#保存退出
diff myshell.sh myshell.sh.bak

#使修改生效
cd
. .profile #unix
source .profile #Linux


#修改端口號,具體參數參考舊的Tomcat配置
cd ~/apache-tomcat-7.0.85/conf
cp server.xml server.xml.bak

vi server.xml
#第一處需要修改的
<Server port="8005" shutdown="SHUTDOWN">
#第二處需要修改的
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
#第三處需要修改的
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

#保存退出
diff server.xml server.xml.bak

#以下修改可參考舊的Tomcat的startup.sh,若有則配置,沒有則無需配置
cd ~/apache-tomcat-7.0.85/bin
cp startup.sh startup.sh.bak
vi startup.sh

#保存退出
diff startup.sh startup.sh.bak

2.6、Tomcat啓動驗證

cd
down
start

#瀏覽器訪問
http://[IP]:[port]/

2.7、遷移原項目及日誌

cd
down
cd apache-tomcat-7.0.85
mv webapps webapps_bak
cp ~/apache-tomcat-6.0.18_bak/webapps.tar ./
cp ~/apache-tomcat-6.0.18_bak/logs.tar ./
tar xvf webapps.tar
tar xvf logs.tar

2.8、啓動驗證

cd
start

#瀏覽器訪問驗證
http://[ip]:[port]/[項目名]/

三、有異常時回退的步驟

3.1、Tomcat包回退

cd
down
mv apache-tomcat-7.0.85 apache-tomcat-7.0.85_err
mv apache-tomcat-6.0.18_bak apache-tomcat-6.0.18

3.2、環境變量回退

cd
cp myshell.sh myshell.sh.err
cp myshell.sh.bak myshell.sh
. .profile #unix
source .profile #linux

3.3啓動驗證

cd
start

#瀏覽器訪問驗證
http://[ip]:[port]/[項目名]/

四、升級問題統計

4.1、url特殊字符問題

4.1.1日誌信息:

4.1.2問題分析

RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。RFC3986文檔對Url的編解碼問題做出了詳細的建議,指出了哪些字符需要被編碼纔不會引起Url語義的轉變,以及對爲什麼這些字符需要編碼做出了相應的解釋。

US-ASCII字符集中沒有對應的可打印字符:Url中只允許使用可打印字符。US-ASCII碼中的10-7F字節全都表示控制字符,這些字符都不能直接出現在Url中。同時,對於80-FF字節(ISO-8859-1),由於已經超出了US-ACII定義的字節範圍,因此也不可以放在Url中。

保留字符:Url可以劃分成若干個組件,協議、主機、路徑等。有一些字符(:/?#[]@)是用作分隔不同組件的。例如:冒號用於分隔協議和主機,/用於分隔主機和路徑,?用於分隔路徑和查詢參數,等等。還有一些字符(!$&’()*+,;=)用於在每個組件中起到分隔作用的,如=用於表示查詢參數中的鍵值對,&符號用於分隔查詢多個鍵值對。當組件中的普通數據包含這些特殊字符時,需要對其進行編碼。

RFC3986中指定了以下字符爲保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ] 
不安全字符:還有一些字符,當他們直接放在Url中的時候,可能會引起解析程序的歧義。這些字符被視爲不安全字符,原因有很多。 
空格:Url在傳輸的過程,或者用戶在排版的過程,或者文本處理程序在處理Url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉。 
引號以及<>:引號和尖括號通常用於在普通文本中起到分隔Url的作用 
井號(#) 通常用於表示書籤或者錨點 
%:百分號本身用作對不安全字符進行編碼時使用的特殊字符,因此本身需要編碼 
{}|\^[]`~:某一些網關或者傳輸代理會篡改這些字符

同時RFC 3986規範在tomcat7.0.73版本中就已經提出了,RFC 7230也是對前者的一些補充或者說是完善,所以在tomcat7.0.73及以上版本都會有這種問題。

從日誌信息可以看出Error parsing HTTP request header,負責解析http請求的org.apache.tomcat.util.http.parser.HttpParser,對請求URL中的字符做了限制,具體代碼如下:IS_NOT_REQUEST_TARGET[]中定義了一堆not request target

if(IS_CONTROL[i] || i > 127 || i == 32 || i == 34 || i == 35 || i == 60 || i == 62 || i == 92 || i == 94 || i == 96 || i == 123 || i == 124 || i == 125) {
   IS_NOT_REQUEST_TARGET[i] = true;
}

/*
轉換過來就是以下字符(對應10進制ASCII看):

鍵盤上那些控制鍵:(<32或者=127)

非英文字符(>127)

空格(32)

雙引號(34)

#(35)

<(60)

>(62)

反斜槓(92)

^(94)

TAB上面那個鍵,我也不曉得嫩個讀(96)

{(123)

}(124)

|(125)
*/

由於頁面中某個跳轉url中帶有特殊字符“||”,故報此錯

4.1.3解決方案

4.1.3.1在~/apache/tomcat-7.0.85/conf/catalina.properties中添加:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|

4.1.3.2換用低版本的tomcat,既然你是tomcat7.0.73版本,及以上版本有這種問題,我們可以暫時的逃避這個問題,選擇低版本的tomcat。
4.1.3.3用post代替get請求,上面也說過了是get請求才會有這種情況,如果方便的話,我們完全可以採用post請求來實現這個功能。在前端對前端URL進行編碼

前端對URL進行編碼的實現方法。 
javascript可以使用的內置函數有

encodeURI()
encodeURIComponent() 
他們都是用utf-8的編碼方式,對於get請求,他的編碼格式默認是按照瀏覽器的編碼格式進行編碼的,我們可以設置瀏覽器的編碼格式,但是每個用戶的瀏覽器的編碼格式不可能都是一致的,這樣我們的get請求的參數有時候就會出現亂碼問題,但是如果我們自己在前端對get請求利用encodeURI()或者encodeURIComponent ()來統一設置成utf-8編碼,這樣我們在後臺在用utf-8來解碼,就不會出現亂碼問題。 
這裏需要注意的一點,對於get請求的中文亂碼問題,如果你沒有在tomcat配置文件中設置編碼格式,天真的想用request.setCharacterEncoding(“UTF-8”)來在後端設置後端的解碼格式,這種方式對於get請求是無效的。同時有的小夥伴可能會想我們可以在項目的web.xml中設置編碼過濾器。抱歉這種方式對於get請求也是無效的。 
對於這種情況我們可以採用new String(request.getParameter(“name”).getBytes(“iso-8859-1”),”UTF-8”) 來進行二次編碼解碼過程,這種方式就能解決get請求中文亂碼問題,當然我們也可以在tomcat的配置文件中設置統一編碼格式。

encodeURI(),用來encode整個URL,不會對下列字符進行編碼:+ : / ; ?&。它只會對漢語等特殊字符進行編碼 
encodeURIComponent (),用來enode URL中想要傳輸的字符串,它會對所有url敏感字符進行encode 
在對url做encode操作時,要根據情況選擇不同的方法。 當參數中有漢字時可以用encodeURI(url) ,當你的參數中包含+ : / ; ?&請使用 encodeURIComponent 方法對這些參數單獨進行編碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章