Docker快速驗證tomcat單機多實例方案

至少10年了,沒在一線玩過 Tomcat 了累颂,這次客戶現(xiàn)場就來了一場遭遇戰(zhàn)滞详。雖然客戶說了他來搭建,但是項目進度不等人,還是自己動手吧料饥。當然了蒲犬,新服務(wù)器是要走流程申請的,只能在現(xiàn)有服務(wù)器想辦法稀火。猶記得當年解決 Tomcat 部署這些都是小菜暖哨,沒想到在苛刻的商業(yè)環(huán)境中赌朋,處處是坑凰狞,步步有雷。不過沛慢,咱干過開發(fā)也干過運維赡若,這點兒動手的事情,還不至于發(fā)郵件請救兵不是团甲。干逾冬!

服務(wù)器在內(nèi)網(wǎng),有瘦終端可以訪問躺苦。MacBook 只能訪問外網(wǎng)身腻,一邊查資料,一邊比對著在內(nèi)網(wǎng)做匹厘,效果不好嘀趟,老是擔心現(xiàn)有環(huán)境給整趴了:開發(fā)測試那邊就沒得玩了。干過開發(fā)的都知道愈诚,服務(wù)器從來都是直接上 root 賬號她按。干過運維的人都知道,永遠別碰 root炕柔。╮(╯▽╰)╭哎酌泰,職業(yè)病,還是小心謹慎地好匕累。

只能調(diào)整了方法:先在 MacBook 上搭建單機多實例陵刹,驗證通過之后,再去內(nèi)網(wǎng)服務(wù)器動手欢嘿。本來計劃20~30分鐘搞完的事衰琐,最終花了小半天時間驗證了方案,在內(nèi)網(wǎng)實施的時候际插,又遇到苛刻的環(huán)境限制碘耳,逐步排雷,最終搞定框弛⌒帘妫客戶滿意,項目進度開心。

根據(jù)實際環(huán)境斗搞,判斷問題解決方向:單機多實例指攒;放棄內(nèi)網(wǎng)危險的嘗試:不能快速有效解決,且賬號權(quán)限太大;選擇外網(wǎng)驗證方案后再進內(nèi)網(wǎng)實施僻焚。很多時候允悦,選擇大于努力。

我們先簡化問題

寫個驗證文件打包成 war 包虑啤。為啥不使用現(xiàn)有代碼隙弛。一是因為現(xiàn)有 war 包在內(nèi)網(wǎng),二是因為太復(fù)雜狞山,除了問題不能排除是代碼自身的問題還是我們的部署方式有問題全闷,或者是內(nèi)外網(wǎng)網(wǎng)絡(luò)環(huán)境的問題,亦或是 RPWT萍启。

對于驗證方案总珠,排查問題時,盡量簡化勘纯,拋卻一切外在的東西局服,只驗證核心。方案驗證通過驳遵,再引入實際 war 包驗證淫奔。這和面向?qū)ο缶幊痰闹笇?dǎo)思想是一致的:通過抽象來提煉最核心的東西,每次聚焦一個地方超埋,不要全面出擊搏讶。人,畢竟精力有限霍殴。

至于為什么用 tomcat7媒惕,沒什么,客戶這兒只允許這個版本来庭。

先放出整理后方案

2017.8.8 Update:

已 commit 到 docker hub妒蔚,心急的童鞋自行

docker pull aninputforce/tomcat7-ins

最終方案

這個不是診斷問題的思路,是最終解決完問題后的月弛,對整體方案的梳理肴盏,這樣的順序才整潔,有基礎(chǔ)時間緊的童鞋直接看這個就足夠了帽衙。有時間的童鞋可以看看正文菜皂,貫穿了分析問題解決問題的思路。

# 簡化問題:建模先--宿主機編輯 -> jdk7 打 war 包 -> tomcat 默認配置 -> 單機單實例 -> 單機雙實例
├── # docker 搭建 jdk7 初始環(huán)境:用來打包驗證用的 war 包
│     ├── docker search jdk7
│     ├── docker pull codenvy/jdk7
│     ├── docker run --name jjj codenvy/jdk7 /bin/bash
│     ├── java -version && mkdir ~/web && ls ~/ && exit  # 鏡像容器環(huán)境工作正常厉萝,創(chuàng)建工作目錄恍飘,退出
│     ├── mkdir ~/prms001 ~/prms002 # 宿主機 
│     ├── # 編輯 prms001/index.htm,編輯 prms002/index.htm
│     ├── docker cp prms001 jjj:/home/user/web && docker cp prms002 jjj:/home/user/web
│     ├── docker exec -it jjj /bin/bash # 進入容器
│     ├── sudo chown -R user:user prms001 prms002 改變屬組
│     ├── cd ~/web/prms001 && jar -cvf prms001.war ./* && ls -la
│     ├── cd ~/web/prms002 && jar -cvf prms002.war ./* && ls -la && exit
│     ├── docker cp jjj:/home/user/web/prms001/prms001.war ~/.
│     ├── docker cp jjj:/home/user/web/prms002/prms002.war ~/.
│     └── docker rm jjj # 退出容器榨崩,jdk7 容器使命結(jié)束
├── # docker 搭建 tomcat7 初始環(huán)境:用來推演單機多實例
│     ├── # docker 拉取 tomcat7 鏡像
│     ├── # 啟動名為 www 的 tomcat 容器
│     │     ├── ./startup.sh # 啟動 web 服務(wù)
│     │     ├── curl localhost:8080 # 訪問正常
│     │     ├── ./shutdown.sh # 停止 web 服務(wù)
│     │     └── # 搭建第一個實例
│     │          ├── mkdir tom-ins001
│     │          ├── mv work tom-ins001/ && mv conf/ tom-ins001/ mv logs/ tom-ins001/ 
│     │          ├── mv temp/ tom-ins001/ && mv webapps/ tom-ins001/
│     │          ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins001/
│     │          ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
│     │          ├── curl localhost:8080 # 訪問正常
│     │          └── exit && docker commit www mytomcat:latest && docker rm www # 容器 www 使命結(jié)束
│     └── docker run --name web -it -p 8080:8080 -p 80:80 mytomcat /bin/bash # 啟動新容器 
│          ├── # 啟動第一個實例
│          │     ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins001/
│          │     ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
│          │     └── curl localhost:8080 # 訪問正常
│          └── # 搭建并啟動第二個實例
│               ├── cp -r tom-ins001/ tom-ins002
│               ├── # 編輯 tom-ins002/conf/server.xml 的3個端口,規(guī)避和實例1沖突章母,
│               │   ├── Server port="8001"母蛛、 Connector port="80" protocol="HTTP/1.1"
│               │   ├── Connector port="8002" protocol="AJP/1.3"
│               │   ├── docker cp www:/usr/local/tomcat/conf/server.xml .
│               │   ├── vi server.xml
│               │   └── docker cp ./server.xml www:/usr/local/tomcat/conf/
│               └── # 啟動新容器 啟動實例2
│                   ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins002/
│                   ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
│                   ├── curl localhost:80 # 訪問正常
│                   ├── exit && docker commit web mytomcat:latest 
│                   └── docker rm web # 容器 web 使命結(jié)束
└── # 展示單機雙實例:
     ├── # 配置實例2根目錄運行
     │     ├── docker run --name web -d -it -p 8080:8080 -p 80:80 mytomcat /bin/bash # 啟動新容器 
     │     ├── docker exec -it web /bin/bash 
     │     ├── cd /usr/local/tomcat/tom-ins002/webapps && tar cvf rootbak.tar ./ROOT/*
     │     ├── cd ROOT && rm -rf * # 清空 ROOT 目錄
     │     ├── mkdir /usr/local/tomcat/myapps && exit # 創(chuàng)建實例2war包存放目錄,退出容器
     ├── # 部署實例1乳怎、實例2的 war 包彩郊,啟動驗證
     │     ├── # 編輯 ROOT.xml,配置實例2的war包解到 /usr/local/tomcat/tom-ins002/ROOT 目錄
     │     ├── docker cp ~/ROOT.xml web:/usr/local/tomcat/tom-ins002/conf/Catalina/localhost
     │     ├── docker cp ~/prms002.war web:/usr/local/tomcat/myapps
     │     └── docker cp ~/prms001.war web:/usr/local/tomcat/tom-ins001/webapps
     ├── docker exec -it web /bin/bash
     │     ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins001/
     │     ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
     │     ├── curl localhost:8080 # 訪問正常:Hello from Tomcat instance 001
     │     ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins002/
     │     ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
     │     └── curl localhost # 訪問正常:Hello from Tomcat instance 002
     └── # 宿主機驗證
          ├── curl localhost:8080 # 訪問正常:Hello from Tomcat instance 001
          ├── curl localhost # 訪問正常:Hello from Tomcat instance 002
          └── exit && docker commit web mytomcat:latest # 退出蚪缀,提交容器變動到鏡像秫逝,驗證通過;

以下開始講故事:

外網(wǎng)驗證方案

換做十年前椿胯,要學(xué)習(xí) Java筷登,光搭建個環(huán)境剃根,就能耗盡新人90%的熱情哩盲。放棄內(nèi)網(wǎng)嘗試,轉(zhuǎn)由外網(wǎng)先驗證方案狈醉,我也是經(jīng)過略微的思想斗爭的廉油,不過轉(zhuǎn)念一想,有 Docker 神器苗傅,也就淡定了抒线。

開始之前,先列一下客戶的要求

  • 部署新實例作為 UAT 測試環(huán)境渣慕,但是新服務(wù)器還沒有
  • 根目錄啊嘶炭,別帶上 Project 路徑了
  • 端口用 80 吧,你們開發(fā)測試還用8080
  • 需求分析

在內(nèi)網(wǎng)的一番碰墻逊桦,也不是沒有一點兒成果眨猎,至少理順了方向:

  • 方案的方向是單機多實例
  • Server 部署在根目錄
  • 別讓用戶敲端口訪問了
  • 開始,進行 tomcat 單機多實例方案的推演强经。

上 Docker 搭建第一個實例

準備拉取鏡像

docker pull tomcat:7.0

啟動并運行 tomcat

容器名 www睡陪,端口 8080:
ChinaDreams:work-diary kangcunhua$ docker run --name www -it -p 8080:8080 tomcat:7.0 /bin/bash
root@4b8f58d2cd64:/usr/local/tomcat# cd bin
root@4b8f58d2cd64:/usr/local/tomcat/bin# java -versionjava version "1.7.0_131"
OpenJDK Runtime Environment (IcedTea 2.6.9) (7u131-2.6.9-2~deb8u1)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)
root@4b8f58d2cd64:/usr/local/tomcat/bin# ./startup.sh 
root@4b8f58d2cd64:/usr/local/tomcat/bin# ps -ef | grep java
root@4b8f58d2cd64:/usr/local/tomcat/logs# tail -f catalina.out 
root@4b8f58d2cd64:/usr/local/tomcat/logs# curl localhost:8080

查看 java 進程有,查看日志正常匿情,訪問 http://localhost:8080 正常兰迫,證明鏡像和容器是可以正常工作的

搭建第一個實例

root@4b8f58d2cd64:/usr/local/tomcat# mkdir tom-ins001
root@4b8f58d2cd64:/usr/local/tomcat# ls
LICENSE  RELEASE-NOTES  bin   include  logs    native-jni-lib  tom-ins001  work
NOTICE   RUNNING.txt  conf  lib      myapps  temp        webapps
root@4b8f58d2cd64:/usr/local/tomcat# mv work tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv conf/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv logs/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv temp/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv webapps/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# ls
LICENSE  NOTICE  RELEASE-NOTES  RUNNING.txt  bin  include  lib  myapps  native-jni-lib  tom-ins001
root@4b8f58d2cd64:/usr/local/tomcat# cd tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# lsconf  logs  temp  webapps  work
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# echo $CATALINA_HOME/usr/local/tomcat
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# export CATALINA_BASE=$CATALINA_HOME/tom-ins001
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# ps -ef | grep java
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# tail -f catalina.out 
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# curl localhost:8080

啟動成功,宿主機訪問 http://localhost:8080 正常

提交變動到鏡像備份
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# exit
ChinaDreams:~ kangcunhua$ docker commit www mytomcat:latest

上 Docker 搭建第二個實例

啟動新容器,并啟動第一個實例

基于剛提交生成的鏡像炬称,新啟一個容器汁果。啟動實例1,驗證正常

ChinaDreams:~ kangcunhua$ docker run --name web -it -p 8080:8080 -p 80:80 mytomcat /bin/bash
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# export CATALINA_BASE=$CATALINA_HOME/tom-ins001
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# ps -ef | grep java
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# tail -f catalina.out 
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# curl localhost:8080

生成第二個實例目錄

root@c8cc5f309d18:/usr/local/tomcat# cp -r tom-ins001/ tom-ins002root@c8cc5f309d18:/usr/local/tomcat# ls
LICENSE  NOTICE  RELEASE-NOTES  RUNNING.txt  bin  include  lib  myapps  native-jni-lib  tom-ins001  tom-ins002
root@c8cc5f309d18:/usr/local/tomcat# cd tom-ins002
root@c8cc5f309d18:/usr/local/tomcat/tom-ins002# lsconf  logs  temp  webapps  work
root@c8cc5f309d18:/usr/local/tomcat/tom-ins002# cd ..
root@c8cc5f309d18:/usr/local/tomcat# cd tom-ins001/
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# lsconf  logs  temp  webapps  work

編輯server.xml

主要是修改三處端口,避免和實例1端口沖突玲躯。

  • Server port="8001"
  • Connector port="80" protocol="HTTP/1.1"
  • Connector port="8002" protocol="AJP/1.3"
<?xml version='1.0' encoding='utf-8'?>
<Server port="8001" shutdown="SHUTDOWN"><!-- 此處省略了無修改的內(nèi)容 -->
  <Service name="Catalina">
    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8002" protocol="AJP/1.3" redirectPort="8443" />
 <!-- 此處省略了無修改的內(nèi)容 -->
 </Service>
</Server>

編輯 ROOT.xml

作用是指定一個不在 webapps 目錄的war包据德,部署時自動解壓到 webapps\ROOT 目錄鲸伴。

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/prms" docBase="/usr/local/tomcat/myapps/prms002.war"></Context>

cp 到 tomcat 容器 web 中查看

ChinaDreams:~ kangcunhua$ docker cp ~/ROOT.xml www:/usr/local/tomcat/tom-ins002/conf/Catalina/localhost
ChinaDreams:~ kangcunhua$ docker exec -it www /bin/bash
root@4b8f58d2cd64:/usr/local/tomcat# cd conf/Catalina/localhost/
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# lsROOT.xml
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# more ROOT.xml <?xml version="1.0" encoding="UTF-8"?>
<Context path="/prms" docBase="/usr/local/tomcat/myapps/prms002.war"></Context>
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# pwd/usr/local/tomcat/conf/Catalina/localhost
文件屬主不對,改
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# ls -altotal 12
drwxr-xr-x 2 root root    4096 Jul 31 05:58 .
drwxr-xr-x 3 root root    4096 Jul 31 04:23 ..
-rw-r--r-- 1  502 dialout  111 Jul 31 05:56 ROOT.xml
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# chown root:root ROOT.xml root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# ls -latotal 12
drwxr-xr-x 2 root root 4096 Jul 31 05:58 .
drwxr-xr-x 3 root root 4096 Jul 31 04:23 ..
-rw-r--r-- 1 root root  111 Jul 31 05:56 ROOT.xml
打個 war 部署包

打war包報錯
在 tomcat 容器中晋控,發(fā)現(xiàn) jar 命令找不到汞窗。

root@4b8f58d2cd64:/usr/local/tomcat/webapps/examples# jar -cvf prms.war ./*
bash: jar: command not found

構(gòu)建 jdk7 環(huán)境

本地沒有 java 環(huán)境。果斷上 docker 構(gòu)建一個

ChinaDreams:~ kangcunhua$ docker search jdk7
ChinaDreams:~ kangcunhua$ docker pull codenvy/jdk7
ChinaDreams:~ kangcunhua$ docker run --name jjj -it codenvy/jdk7 /bin/bash
user@b040d98042c0:/$ java -version
user@b040d98042c0:/$ jar
user@b040d98042c0:/$ mkdir ~/web && ls ~/ && exit 創(chuàng)建工作目錄赡译,退出

宿主機編輯代碼 cp 到容器中打 jar 包

ChinaDreams:~ kangcunhua$ mkdir ~/prms001 ~/prms002
ChinaDreams:~ kangcunhua$ vi ~/prms001/index.html
ChinaDreams:~ kangcunhua$ vi ~/prms002/index.html
ChinaDreams:~ kangcunhua$ docker cp prms001 jjj:/home/user/web && docker cp prms002 jjj:/home/user/web
ChinaDreams:~ kangcunhua$ docker exec -it jjj /bin/bash 進入容器
user@b040d98042c0:~/web$ sudo chown -R user:user prms001 prms002 改變屬組
user@b040d98042c0:~/web$ cd ~/web/prms001 && jar -cvf prms001.war ./* && ls -la
user@b040d98042c0:~/web$ cd ~/web/prms002 && jar -cvf prms002.war ./* && ls -la && exit
ChinaDreams:~ kangcunhua$ docker cp jjj:/home/user/web/prms001/prms001.war ~/.
ChinaDreams:~ kangcunhua$ docker cp jjj:/home/user/web/prms001/prms002.war ~/.
ChinaDreams:~ kangcunhua$ docker rm jjj 退出容器仲吏,jdk7 容器使命結(jié)束

vi ~/prms001/index.html

<html>
    <head>
        <meta charset="UTF-8" >
        <title> Tomcat instance 2</title>
    </head>

    <body>
        <h1> Hello from Tomcat instance 2</h1>
    </body>
</html>

啟動實例1、實例2

回到 tomcat 容器

root@c8cc5f309d18:/usr/local/tomcat# export CATALINA_BASE=$CATALINA_HOME/tom-ins001
root@c8cc5f309d18:/usr/local/tomcat# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@c8cc5f309d18:/usr/local/tomcat# curl localhost:8080 訪問正常root@c8cc5f309d18:/usr/local/tomcat# export CATALINA_BASE=$CATALINA_HOME/tom-ins002/
root@c8cc5f309d18:/usr/local/tomcat# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@c8cc5f309d18:/usr/local/tomcat# curl localhost:80 訪問正常

激動人心的時刻

提交鏡像和刪除舊容器 web

docker commit web mytomcat:latest && docker rm web

基于最新鏡像蝌焚,啟動新容器命名為 web

docker run --name web -it -p 8080:8080 -p 80:80 mytomcat /bin/bash

宿主機訪問

http://localhost/prms001/訪問正常:Hello from Tomcat instance 001.

http://localhost 訪問正常:Hello from Tomcat instance 002.

單機多實例方案本地通過

方案補充

啟動命令

export CATALINA_BASE=$CATALINA_HOME/tom-ins001 && sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
export CATALINA_BASE=$CATALINA_HOME/tom-ins002 && sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base

停止命令

export CATALINA_BASE=$CATALINA_HOME/tom-ins001 && sh $CATALINA_HOME/bin/shutdown.sh -Dcatalina.base
export CATALINA_BASE=$CATALINA_HOME/tom-ins002 && sh $CATALINA_HOME/bin/shutdown.sh -Dcatalina.base

排錯命令

ps -ef | grep java
kill -9 xxx tomcat 實例進程號
tail -f $CATALINA_HOME/tom-ins001/logs/catalina.out
tail -f $CATALINA_HOME/tom-ins002/logs/catalina.out
curl localhost:8080/prms001/
curl localhost

目錄結(jié)構(gòu)參考

保留了最關(guān)鍵的要素:

├── bin
├── lib
├── myapps
│   └── prms002.war
├── tom-ins001
│   ├── conf
│   │   └── server.xml
│   ├── logs
│   │   └── catalina.out
│   ├── webapps
│   │   ├── prms001
│   │   └── prms001.war
│   └── work
└── tom-ins002
    ├── conf
    │   ├── Catalina
    │   │   └── localhost
    │   │       └── ROOT.xml
    │   └── server.xml
    ├── logs
    ├── temp
    ├── webapps
    │   └── ROOT
    │       ├── META-INF
    │       │   └── MANIFEST.MF
    │       └── index.htm
    └── work

提交到 docker hub

update:2017.8.8

ChinaDreams:work-diary kangcunhua$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
mytomcat                   latest              3f6c6cce5355        7 days ago          370MB
ChinaDreams:work-diary kangcunhua$ docker tag 3f6c6cce5355 aninputforce/tomcat7-ins:latest
ChinaDreams:work-diary kangcunhua$ docker push aninputforce/tomcat7-ins
ChinaDreams:work-diary kangcunhua$ docker push aninputforce/tomcat7-ins:1.0ChinaDreams:work-diary kangcunhua$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
mytomcat                   latest              3f6c6cce5355        7 days ago          370MB
aninputforce/tomcat7-ins   1.0                 3f6c6cce5355        7 days ago          370MB
aninputforce/tomcat7-ins   latest              3f6c6cce5355        7 days ago      
進內(nèi)網(wǎng)玩:殘酷的商業(yè)環(huán)境

一切都很順利裹唆,直到碰上訪問80端口。只洒。许帐。。

順利

搭建實例1

備份后毕谴,搭建實例1成畦,確保原始應(yīng)用能正常;

搭建實例2

停止實例1涝开,保證實例2默認也能運行循帐;

根目錄部署實例2

編輯 server.xml,ROOT.xml舀武,清空 ROOT 目錄拄养,新建 myapps 目錄,拷貝 war 包進去银舱;

curl http://localhost

web server 上訪問正常瘪匿。

局域網(wǎng)訪問 ,

http://10.29.11.23 不寻馏!能棋弥!訪腮考!問A撼省!志鞍!

上坑:Suse 訪問 80 端口

實例2需要使用80端口聂薪。受阻家乘。

坑+:沒有任何限制。我們需要客戶的信息藏澳,但是不能全信仁锯。就像這次請教客戶說的“我們對端口沒有任何限制”。不要盲目相信客戶說的翔悠,要相信科學(xué)排查业崖。

依稀記得架構(gòu)師課程PC大神講過野芒,Linux 默認只有 root 用戶才能訪問80端口。當時我一直有個疑問双炕,那我們 web server 需要用到80端口是怎么解決的狞悲?我記得請教過 PC 老師,可惜當時課程緊妇斤,雖然聽的云里霧里的摇锋,也沒好意思多追問,更沒線下自己實踐站超。直到這次在客戶現(xiàn)場栽了跟頭荸恕。

開發(fā)測試環(huán)境,我們倒是有 root 賬號死相,但是我們 web server 總不能用root部署吧融求,太不專業(yè)了。在Reboot 校友群中厚著臉皮請教了各位童鞋算撮,很快 get 了解決方案:將所有80端口的訪問生宛,轉(zhuǎn)發(fā)到8081 即可;8081 就是我們可以配置的 tomcat 實例2的訪問端口钮惠,這個是普通用戶有權(quán)限的茅糜。

修訂 IPtables 策略,轉(zhuǎn)發(fā)80端口請求

剛檢查防火墻時素挽,看到80端口是放開的。部署機上可以訪問狸驳,局域網(wǎng)打不開:將所有針對80端口的訪問预明,轉(zhuǎn)發(fā)到8081。

[root@tomcat7conf]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081

使用8081端口

修改了 tomins-002 的 server.xml,仍是部署機上可以訪問耙箍,局域網(wǎng)打不開撰糠;

檢查防火墻

配置上8081端口,重啟防火墻生效辩昆,部署機訪問正常阅酪,局域網(wǎng)打開正常

找到 FW_SERVICES_EXT_TCP,加上8081端口

[root@tomcat7conf]# vi /etc/sysconfig/SuSEfirewall2
[root@tomcat7conf]# rcSuEfirewall2 restart

切換到 tomcat 用戶汁针,重啟 tomcat术辐,局域網(wǎng)訪問正常。

坑:成熟平臺也有硬編碼

發(fā)現(xiàn)系統(tǒng)首頁這個鏈接施无,雖然配置的是"#",但是一點擊就回到 project 的路徑辉词。經(jīng)查找文件,發(fā)現(xiàn)是在開發(fā)平臺的兩個 js 文件中猾骡,寫了硬編碼瑞躺。應(yīng)該是平臺自動生成代碼時用了硬編碼敷搪,改之。

坑:成熟產(chǎn)品也不是沒有 Bug

發(fā)現(xiàn)只要是配置了根目錄訪問幢哨,統(tǒng)一認證就報錯赡勘。去掉統(tǒng)一認證接入就能正常訪問。反饋給客戶捞镰,協(xié)調(diào)解決狮含;

懸了兩天,未能有任何反饋曼振,追著逼急了几迄,唯一答案就是:成熟產(chǎn)品,我們不要先去懷疑統(tǒng)一認證平臺冰评。

我這個暴脾氣映胁,馬上和工程師排查。單步跟一下甲雅,發(fā)現(xiàn)是提交到統(tǒng)一認證時解孙,我們要傳過去一個參數(shù)ssotarget,這個 ssotarget 是通過認證后抛人,瀏覽器要打開的首頁弛姜,context-path 不為空時,url 正常妖枚,context-path 為 null廷臼,即我們部署到根目錄時,ssotarget 只能得到個"/"绝页。檢查統(tǒng)一認證接入邏輯荠商,發(fā)現(xiàn)是使用了平臺提供的 filter,反編譯续誉,單步跟蹤莱没,發(fā)現(xiàn) ssotarget 來自 homepage 的賦值。捏著鼻子看源碼酷鸦,果然代碼邏輯有問題饰躲,偽算法如下:

String ccontext_path=request.getContextPath(); // 得到 web 服務(wù)上下文
String urlt = requerst.getRequestURL(); // 得到請求的完整網(wǎng)址
String cwebhost = urlt.substring(0, urlt.IndexOf (context-path)); // 得到 http://hostname:端口
homepage = webhost + context_path + "/"; // 拼出 web server 的應(yīng)用首頁地址

改之

String context_path = request.getContextPath();  
String homepage = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

嘗試,自己改了源碼之后重新打jar包臼隔,commit svn嘹裂,jenkins 編譯部署后發(fā)現(xiàn)沒起作用。想起來使用的是 maven躬翁,所有jar包都來自平臺的私有倉庫焦蘑,這。盒发。例嘱。

換種思路狡逢,寫個 java 類繼承一下,結(jié)果一看對應(yīng)邏輯所在 function拼卵,private 的奢浑,往上再看 class,finall 的腋腮,一萬只神獸叭副恕!<垂选徊哑!

要啥面向?qū)ο螅唵未直┐细唬创a照抄莺丑,修訂了后命名為 MySsoFilter.java,在工程配置文件替換上我們寫的 filter墩蔓,svn commit梢莽,jenkins 立即構(gòu)建部署,世間從此安靜奸披。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昏名,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阵面,更是在濱河造成了極大的恐慌轻局,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膜钓,死亡現(xiàn)場離奇詭異嗽交,居然都是意外死亡,警方通過查閱死者的電腦和手機颂斜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拾枣,“玉大人沃疮,你說我怎么就攤上這事∶贩簦” “怎么了司蔬?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姨蝴。 經(jīng)常有香客問我俊啼,道長,這世上最難降的妖魔是什么左医? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任授帕,我火速辦了婚禮同木,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跛十。我一直安慰自己彤路,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布芥映。 她就那樣靜靜地躺著洲尊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奈偏。 梳的紋絲不亂的頭發(fā)上坞嘀,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音惊来,去河邊找鬼丽涩。 笑死,一個胖子當著我的面吹牛唁盏,可吹牛的內(nèi)容都是我干的内狸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼厘擂,長吁一口氣:“原來是場噩夢啊……” “哼昆淡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刽严,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤昂灵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舞萄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眨补,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年倒脓,在試婚紗的時候發(fā)現(xiàn)自己被綠了撑螺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡崎弃,死狀恐怖甘晤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饲做,我是刑警寧澤线婚,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站盆均,受9級特大地震影響塞弊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一游沿、第九天 我趴在偏房一處隱蔽的房頂上張望饰抒。 院中可真熱鬧,春花似錦奏候、人聲如沸循集。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咒彤。三九已至,卻和暖如春咒精,著一層夾襖步出監(jiān)牢的瞬間镶柱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工模叙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歇拆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓范咨,卻偏偏與公主長得像故觅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渠啊,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容