服務(wù)器 JDK + Tomcat + Nginx 部署環(huán)境整體搭建及自動(dòng)化部署的具體實(shí)現(xiàn)

** 首發(fā)于www.dongxiaoxia.xyz **

本篇文章主要圍繞一個(gè)問題:本地開發(fā)完項(xiàng)目后如何簡單部署到服務(wù)器?
這個(gè)問題太寬泛了鞋囊,因此埋心,提出了以下幾個(gè)要點(diǎn):

  1. 第一次怎么部署
  2. 增量開發(fā)后怎么簡單部署?
  3. 服務(wù)器環(huán)境整體如何規(guī)劃胎许?各個(gè)項(xiàng)目怎么存放丈屹,日志是否集中存放 ?項(xiàng)目各個(gè)項(xiàng)目運(yùn)行環(huán)境與部署怎么分開判族?躺盛。。形帮。
  4. 如何用腳本自動(dòng)化部署槽惫?
  5. 如何用幾句話歸納部署?

經(jīng)過整篇文章辩撑,我想會(huì)有一定的答案界斜。

文章的各個(gè)章節(jié)并不是按照解決問題的順序?qū)懙模前凑窄h(huán)境部署合冀、項(xiàng)目配置各薇、自動(dòng)化部署一步步遞進(jìn)的,完成服務(wù)器 JDK + Tomcat + Nginx 部署環(huán)境整體搭建及自動(dòng)化部署的具體實(shí)現(xiàn)君躺。

1.服務(wù)器環(huán)境整體規(guī)劃

在本篇文章的部署方式中峭判,會(huì)涉及以下4個(gè)總目錄

1. 項(xiàng)目目錄 /opt/web
2. 日志目錄 /opt/log
3. JDK/Tomcat/Nginx等安裝環(huán)境的父目錄  /opt/soft
4. 項(xiàng)目應(yīng)用war包上傳到服務(wù)器的目錄 /root/deploy

2.運(yùn)行環(huán)境安裝

2.1 JDK

  1. 官網(wǎng)下載 JDK8,解壓到/opt/soft 棕叫,解壓文件夾為jdk1.8.0_11
  2. 配置 JDK 環(huán)境變量
    /etc/profile文件末尾添加以下配置 :
#jdk enviroment
JAVA_HOME=/opt/soft/jdk1.8.0_11/
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH 

保存退出林螃。終端執(zhí)行命令source /etc/profile 使配置生效

  1. 驗(yàn)證 JDK 配置
    終端執(zhí)行命令:java -version
ubuntu# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

JDK 配置成功!0称疗认!

2.2 Tomcat

  1. 官網(wǎng)下載tomcat,我這里下載的是apache-tomcat-7.0.73伏钠,解壓到/opt/soft 侮邀,解壓文件夾為apache-tomcat-7.0.73
  2. 進(jìn)入tomcat目錄下的bin目錄下,執(zhí)行tomcat啟動(dòng)腳本(tomcat依賴jdk贝润,應(yīng)先確定jdk已經(jīng)安裝)
ubuntu# sh startup.sh 
Using CATALINA_BASE:   /opt/soft/apache-tomcat-7.0.73
Using CATALINA_HOME:   /opt/soft/apache-tomcat-7.0.73
Using CATALINA_TMPDIR: /opt/soft/apache-tomcat-7.0.73/temp
Using JRE_HOME:        /opt/soft/jdk1.8.0_11/
Using CLASSPATH:       /opt/soft/apache-tomcat-7.0.73/bin/bootstrap.jar:/opt/soft/apache-tomcat-7.0.73/bin/tomcat-juli.jar
Tomcat started.
ubuntu# 

出現(xiàn)以上信息證明tomcat已經(jīng)成功啟動(dòng)绊茧,打開 http://ip:8080http:/localhost:8080,如果能看到tomcat系統(tǒng)界面,說明已經(jīng)安裝成功打掘,可以進(jìn)行下一步了华畏。

常見命令

啟動(dòng)tomcat :sh startup.sh
關(guān)閉tomcat :sh shutdown.sh
查看tomcat運(yùn)行進(jìn)程 : ps aux | grep tomcat 或 ps aux | grep java 或ps -ef | grep java 或 ps -ef | grep tomcat
查看端口使用情況 netstat –apn 或 netstat -tunlp ,可以結(jié)合 grep 尊蚁,如 netstat -apn | grep (端口號(hào)) 或 netstat -apn | grep java
其中最后一下為pid/program name 亡笑,如果端口被占用, 可以進(jìn)一步使用命令:ps -ef | grep (pid) 查看横朋,可以查出是哪個(gè)進(jìn)程占用了端口號(hào)仑乌,可以kill portId 殺死進(jìn)程。

2.3 Nginx

這里演示的系統(tǒng)為Ubuntu

Ubuntu平臺(tái)編譯環(huán)境安裝

apt-get install build-essentail
apt-get install libtool

安裝Nginx依賴包 OpenSSL、zlib晰甚、 pcre
這三個(gè)包可以直接在終端下載衙传,如果網(wǎng)速慢,建議在本地下載再上傳到服務(wù)器厕九。
安裝Nginx依賴包

apt-get install libpcre3 libpcre3-dev zlib1g-dev libssl-dev build-essential

選擇下載保存目錄 cd /opt/soft
下載OpenSSL

wget ftp://ftp.openssl.org/source/openssl-1.1.0c.tar.gz

下載zlib

wget http://zlib.net/zlib128.zip

下載pcre

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz

安裝OpenSSL

tar zxvf openssl-1.0.0c.tar.gz
cd openssl-1.0.0c/
./config --prefix=/opt/soft --openssldir=/opt/soft/ssl
make && make install

./config shared --prefix=/opt/soft --openssldir=/opt/soft/ssl
make clean
make && make install

安裝zlib庫

unzip zlib128.zip
cd zlib128/
./configure --prefix=/opt/soft
make && make install

安裝pcre庫

 tar zxvf pcre-8.39.tar.gz
cd pcre-8.39/
./configure --prefix=/opt/soft
make && make install

查看pcre版本

pcre-config --version

安裝Nginx
1下載 Nginx蓖捶,下載地址:http://nginx.org/download/nginx-1.6.2.tar.gz

wget http://nginx.org/download/nginx-1.6.2.tar.gz

2解壓安裝包

tar zxvf nginx-1.6.2.tar.gz

3進(jìn)入安裝包目錄

cd nginx-1.6.2

4編譯安裝

[root@bogon nginx-1.6.2]# ./configure --prefix=/opt/soft/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/opt/soft/src/pcre-8.39
[root@bogon nginx-1.6.2]# make
[root@bogon nginx-1.6.2]# make install

5查看Nginx版本

/opt/soft/nginx/sbin/nginx -v
nginx version: nginx/1.6.2

6啟動(dòng)nginx

/opt/soft/nginx/sbin/nginx

到此,nginx安裝成功

Nginx常用命令

/opt/soft/nginx/sbin/nginx -v #查看 Nginx版本
/opt/soft/nginx/sbin/nginx #啟動(dòng) Nginx
/opt/soft/nginx/sbin/nginx -t # 檢查配置文件ngnix.conf的正確性
/opt/soft/nginx/sbin/nginx -s reload #重新載入配置文件
/opt/soft/nginx/sbin/nginx -s reopen #重啟 Nginx
/opt/soft/nginx/sbin/nginx -s stop #停止 Nginx

jdk\tomcat\nginx 安裝完畢扁远,查看服務(wù)器目錄

/opt/soft 目錄下文件結(jié)構(gòu)

 ?  apache-tomcat-7.0.73 ll /opt/soft       
總用量 8.4M
drwxr-xr-x  9 root root 4.0K 12月 27 09:25 apache-tomcat-7.0.73
drwxr-xr-x  2 root root 4.0K 12月 28 15:44 bin
drwxr-xr-x  3 root root 4.0K 12月 28 15:38 include
drwxr-xr-x  8 uucp  143 4.0K 6月  17  2014 jdk1.8.0_11
drwxr-xr-x  4 root root 4.0K 12月 28 15:44 lib
drwxr-xr-x 11 root root 4.0K 12月 28 16:22 nginx
drwxr-xr-x  9 1001 1001 4.0K 12月 28 16:14 nginx-1.6.2
-rwxr-xr-x  1 root root 786K 12月 28 16:13 nginx-1.6.2.tar.gz
drwxr-xr-x 19 root root 4.0K 12月 28 16:05 openssl-1.1.0c
-rwxr-xr-x  1 root root 5.0M 12月 28 15:34 openssl-1.1.0c.tar.gz
drwxr-xr-x  9 1169 1169  12K 12月 28 16:15 pcre-8.39
-rwxr-xr-x  1 root root 2.0M 12月 28 15:23 pcre-8.39.tar.gz
drwxr-xr-x  4 root root 4.0K 12月 28 15:32 share
drwxr-xr-x  5 root root 4.0K 12月 28 15:44 ssl
drwxr-xr-x 14 root root 4.0K 12月 28 15:30 zlib-1.2.8
-rwxr-xr-x  1 root root 679K 12月 28 15:28 zlib128.zip

3. Tomcat多實(shí)例多應(yīng)用部署

3.1. 部署應(yīng)用分類

單實(shí)例單應(yīng)用:一個(gè)tomcat目錄俊鱼,webapps目錄下只跑一個(gè)war包,最基本的部署方式畅买。
單實(shí)例多應(yīng)用:一個(gè)tomcat目錄并闲,webapps目錄下跑多個(gè)war包。 啟動(dòng)谷羞、關(guān)閉 tomcat對(duì)所有war包起作用焙蚓。
多實(shí)例單應(yīng)用:多個(gè)tomcat目錄,每個(gè)tomcat只跑一個(gè)應(yīng)用洒宝,并且是同一個(gè)應(yīng)用。通過修改tomcat端口配合nginx進(jìn)行負(fù)載均衡萌京。
多實(shí)例多應(yīng)用:把一個(gè)tomcat分為2部分雁歌,一部分為公用的bin目錄與lib目錄,其余文件夾作為第二部分知残,可以復(fù)制多次靠瞎,因此tomcat只有一個(gè),但是實(shí)例可以有多個(gè)求妹,每個(gè)實(shí)例在單獨(dú)部署乏盐,與單實(shí)例多應(yīng)用相似。

  1. 一個(gè)tomcat制恍,充分利用資源父能,對(duì)tomcat的更新維護(hù)也很方便
  2. 多個(gè)實(shí)例,各個(gè)實(shí)例互不影響
  3. 各個(gè)項(xiàng)目相互獨(dú)立净神,啟動(dòng)關(guān)閉不影響
  4. 部署容易何吝,啟動(dòng)快速

3.2 目錄結(jié)構(gòu)認(rèn)識(shí)

一個(gè)剛解壓出來的tomcat打包文件應(yīng)該有以下幾個(gè)目錄
bin:主要存放腳本文件,例如比較常用的windows和linux系統(tǒng)中啟動(dòng)和關(guān)閉腳本
conf:主要存放配置文件鹃唯,其中最重要的兩個(gè)配置文件是server.xml和web.xml
lib:主要存放tomcat運(yùn)行所依賴的包
logs:主要存放運(yùn)行時(shí)產(chǎn)生的日志文件爱榕,例如catalina.{date}.log等
temp:存放tomcat運(yùn)行時(shí)產(chǎn)生的臨時(shí)文件,例如開啟了hibernate緩存的應(yīng)用程序坡慌,會(huì)在該目錄下生成一些文件
webapps:部署web應(yīng)用程序的默認(rèn)目錄
work:主要存放由JSP文件生成的servlet(java文件以及最終編譯生成的class文件)

3.3 多實(shí)例原理

tomcat中兩個(gè)比較重要的概念(通常也是兩個(gè)系統(tǒng)變量)——CATALINA_HOME和CATALINA_BASE:

  • CATALINA_HOME:即指向Tomcat安裝路徑的系統(tǒng)變量
  • CATALINA_BASE:即指向活躍配置路徑的系統(tǒng)變量

通過設(shè)置這兩個(gè)變量黔酥,就可以將tomcat的安裝目錄和工作目錄分離,從而實(shí)現(xiàn)tomcat多實(shí)例的部署。

Tomcat官方文檔指出跪者,CATALINA_HOME路徑的路徑下只需要包含bin和lib目錄棵帽,這也就是支持tomcat軟件運(yùn)行的目錄,而CATALINA_BASE設(shè)置的路徑可以包括上述所有目錄坑夯,不過其中bin和lib目錄并不是必需的岖寞,缺省時(shí)會(huì)使用CATALINA_HOME中的bin和conf。如此柜蜈,我們就可以使用一個(gè)tomcat安裝目錄部署多個(gè)tomcat實(shí)例仗谆,這樣的好處在于方便升級(jí),就可以在不影響tomcat實(shí)例的前提下淑履,替換掉CATALINA_HOME指定的tomcat安裝目錄隶垮。

簡而言之:

  • CATALINA_HOME:bin lib
  • CATALINA_BASE:conf webapps temp logs work

server.xml

這里部署多實(shí)例要修改的兩個(gè)端口:

  • Server Port:該端口用于監(jiān)聽關(guān)閉tomcat的shutdown命令,默認(rèn)為8005
  • Connector Port:該端口用于監(jiān)聽HTTP的請(qǐng)求秘噪,默認(rèn)為8080

簡單的多實(shí)例只需要保證多實(shí)例中的Server Port和Connect Port不同即可狸吞。

另外要修改的是Host配置,Host就是所謂的虛擬主機(jī)指煎,對(duì)應(yīng)包含了一個(gè)或者多個(gè)web應(yīng)用程序蹋偏。其中:

  • name: 虛擬主機(jī)的名稱,一臺(tái)主機(jī)表示了完全限定的域名或IP地址至壤,默認(rèn)為localhost威始,同時(shí)也是唯一的host,進(jìn)入tomcat的所有http請(qǐng)求都會(huì)映射到該主機(jī)上
  • appBase:web應(yīng)用程序目錄的路徑像街,可以是CATALINA_HOME的相對(duì)路徑黎棠,也可以寫成絕對(duì)路徑,默認(rèn)情況下為$CATALINA_HOME/webapps
  • unpackWARs: 表示是否自動(dòng)解壓war包
  • autoDeploy:所謂的熱部署镰绎,即在tomcat正在運(yùn)行的情況下脓斩,如果有新的war加入,則會(huì)立即執(zhí)行部署操作
  • 另外再介紹一個(gè)Host中的屬性—deployOnStartup:表示tomcat啟動(dòng)時(shí)是否自動(dòng)部署appBase目錄下所有的Web應(yīng)用程序畴栖,默認(rèn)為true随静。這個(gè)屬性和autoDeploy會(huì)產(chǎn)生兩次部署的“副作用”:一次是tomcat啟動(dòng)時(shí)就開始部署,第二次就是autoDeploy引起的熱部署吗讶。因此最好將autoDeploy置為false

最后再說明一下Context的配置挪挤,它出現(xiàn)在Host配置內(nèi),一個(gè)Context的配置就代表了一個(gè)web應(yīng)用程序关翎,如果配置多應(yīng)用程序扛门,就需要在Host下配置多個(gè)Context。其中:

  • path:表示訪問入口纵寝,例如论寨,path=”/abc”星立,則訪問localhost:8080/abc時(shí),就可以訪問該Context對(duì)應(yīng)的應(yīng)用程序葬凳。如果path=””绰垂,則直接用localhost:8080就可以訪問。
  • docBase:表示應(yīng)用程序的解包目錄或者war文件路徑火焰,是Host的appBase配置目錄的相對(duì)路徑劲装,也可以是直接寫成絕對(duì)路徑,但是不要將appBase的值昌简,作為docBase配置路徑的前綴占业,例如appBase=”somedir”,docBase=”somedir-someapp.war”纯赎,這樣的配置會(huì)導(dǎo)致部署錯(cuò)誤谦疾。

3.4 多實(shí)例多應(yīng)用部署

假設(shè)一個(gè)完好的可以運(yùn)行的web應(yīng)用程序已經(jīng)打包成test.war,放在/root/deploy/test目錄下犬金,其中包含一個(gè)簡單的index.jsp

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

創(chuàng)建tomcat實(shí)例

之前我們已經(jīng)在/opt/soft/下成功安裝了tomcat

ubuntu# ls /opt/soft/apache-tomcat-7.0.73
bin  conf  lib    LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work

我們的實(shí)例目錄放在/opt/web/test 下
復(fù)制相關(guān)實(shí)例文件夾到該目錄下

ubuntu# ls /opt/web/test
conf  debug.sh  logs  restart.sh  run.sh  stop.sh  webapps  work

其中run.sh 念恍、stop.sh、debug.sh晚顷、restart.sh 腳本文件本不屬于tomcat實(shí)例的峰伙,是為了方便啟動(dòng)、停止tomcat實(shí)例而創(chuàng)建的腳本

創(chuàng)建啟停腳本

run.sh 腳本文件內(nèi)容:

#!/bin/sh
TOMCAT_HOME=/opt/soft/apache-tomcat-7.0.73
CATALINA_BASE=$(cd "$(dirname $0)"; pwd)
CATALINA_PID=$CATALINA_BASE/tomcat.pid
JAVA_HOME=/opt/soft/jdk1.8.0_11/
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
PATH=$PATH:$JAVA_HOME/bin

#路徑為【/opt/web/xxx】時(shí)该默,項(xiàng)目名則為【xxx】
PROJECT_NAME=`echo $CATALINA_BASE | awk -F "/" '{print $NF}'`

#檢測(cè)temp目錄是否存在瞳氓,不存在則創(chuàng)建
if [ ! -d "$CATALINA_BASE/temp" ]; then
    mkdir "$CATALINA_BASE/temp"
fi

#日志目錄名
PROJECT_LOG=/opt/log/$PROJECT_NAME/catalina.out

JAVA_OPTS="-server -Xms32m -Xmx512m -Xmn32m -Xss1024K -XX:PermSize=32m -XX:MaxPermSize=64m -XX:ParallelGCThreads=32 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80"

export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG LD_LIBRARY_PATH

proj_dir=$CATALINA_BASE
if [ -n "$proj_dir" ]
then
        ps aux | grep "$proj_dir" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" > /dev/null
        status=$?

        if  [ $status -eq 0 ] && [ -s $CATALINA_PID  ]
        then
                echo "The $proj_dir tomcat is running and the pid_file is exist !"
                exit 1
        elif [ $status -eq 0 ] || [ -s $CATALINA_PID  ]
        then
                echo "kill one"
                ps aux | grep "$proj_dir" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" | awk '{print $2}' | xargs -i kill -9 {}
                > $CATALINA_PID
                $TOMCAT_HOME/bin/catalina.sh start
        else
                $TOMCAT_HOME/bin/catalina.sh start
        fi

else
        echo "start failt!!!"
        exit 1
fi

stop.sh腳本內(nèi)容

#!/bin/sh
TOMCAT_HOME=/opt/soft/apache-tomcat-7.0.73
#CATALINA_BASE=/opt/web/test
CATALINA_BASE=$(cd "$(dirname $0)"; pwd)
CATALINA_PID=$CATALINA_BASE/tomcat.pid
JAVA_HOME=/opt/soft/jdk1.8.0_11/
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$PATH:$JAVA_HOME/bin

#路徑為【/opt/web/xxx】時(shí),項(xiàng)目名則為【xxx】
PROJECT_NAME=`echo $CATALINA_BASE | awk -F "/" '{print $NF}'`
echo $PROJECT_NAME

#日志目錄名
PROJECT_LOG=/opt/log/$PROJECT_NAME/

export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG

proj_dir=$CATALINA_BASE
$TOMCAT_HOME/bin/catalina.sh stop
sleep 5
if [ -n "$proj_dir" ]
then
        ps aux | grep "$proj_dir" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" > /dev/null
        status=$?
        if [ $status -eq 0 ] || [ -s $CATALINA_PID  ]
        then
                echo "kill it"
                ps aux | grep "$proj_dir" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" |  awk '{print $2}' | xargs -i kill -9 {}
                > $CATALINA_PID
        fi
else
        echo "stop failt!!!"
        exit 1
fi

debug.sh 腳本內(nèi)容

#!/bin/sh
TOMCAT_HOME=/opt/soft/apache-tomcat-7.0.73
CATALINA_BASE=$(cd "$(dirname $0)"; pwd)
CATALINA_PID=$CATALINA_BASE/tomcat.pid
JAVA_HOME=/opt/soft/jdk1.8.0_11/
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
PATH=$PATH:$JAVA_HOME/bin

#路徑為【/opt/web/xxx】時(shí)权均,項(xiàng)目名則為【xxx】
PROJECT_NAME=`echo $CATALINA_BASE | awk -F "/" '{print $NF}'`

#日志目錄名
PROJECT_LOG=/opt/log/$PROJECT_NAME/catalina.out

JAVA_OPTS="-server -Xms32m -Xmx512m -Xmn32m -Xss1024K -XX:PermSize=32m -XX:MaxPermSize=64m -XX:ParallelGCThreads=32 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80"

export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG LD_LIBRARY_PATH

proj_dir=$CATALINA_BASE
if [[ -n "$proj_dir" ]]
then
        ps aux | grep "$proj_dir" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" > /dev/null
        status=$?

        if  [[ $status -eq 0 ]] && [[ -s $CATALINA_PID  ]]
        then
                echo "The $proj_dir tomcat is running and the pid_file is exist !"
                exit 1
        elif [[ $status -eq 0 ]] || [[ -s $CATALINA_PID  ]]
        then
                echo "kill one"
                ps aux | grep "$proj_dir" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" | awk '{print $2}' | xargs -i kill -9 {}
                > $CATALINA_PID
                $TOMCAT_HOME/bin/catalina.sh jpda start
        else
                $TOMCAT_HOME/bin/catalina.sh jpda start
        fi
else
        echo "start failt!!!"
        exit 1
fi

restart.sh 腳本內(nèi)容

#!/bin/sh
TOMCAT_HOME=/opt/soft/apache-tomcat-7.0.73
CATALINA_BASE=$(cd "$(dirname $0)"; pwd)
CATALINA_PID=$CATALINA_BASE/tomcat.pid
JAVA_HOME=/opt/soft/jdk/1.8.11/jdk1.8.0_11
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$PATH:$JAVA_HOME/bin
JAVA_OPTS="-server -Xms1g -Xmx1g -Xmn512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80"

#路徑為【/opt/web/xxx】時(shí),項(xiàng)目名則為【xxx】
PROJECT_NAME=`echo $CATALINA_BASE | awk -F "/" '{print $NF}'`

#日志目錄名
PROJECT_LOG=/opt/log/$PROJECT_NAME/catalina.out

export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG

sh $CATALINA_BASE/stop.sh
sh $CATALINA_BASE/start.sh

修改conf文件夾下的server.xml

把對(duì)應(yīng)的Host節(jié)點(diǎn)修改為下面的內(nèi)容锅锨,并修改相關(guān)的路徑

<Host name="localhost"  appBase="/opt/web/test/webapps" autoDeploy="false" deployOnStartup="false">
     <Context path="" docBase="/opt/web/test/webapps" crossContext="true" allowLinking="true"reloadable="false">
         <JarScanner scanAllDirectories="true" />
         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/opt/web/test/logs/" prefix="gh_access_log." suffix=".log" pattern="%a %A %t %S %b %r %s %{Referer}i %{User-Agent}i %D" resolveHosts="false" />
     </Context>
</Host>

除此之外叽赊,可選的修改Server的端口號(hào)以及Connector的端口號(hào)。
一個(gè)實(shí)例就這樣完成必搞,以后每次想要部署一個(gè)項(xiàng)目必指,就可以簡單的復(fù)制這個(gè)實(shí)例文件夾,修改一下配置恕洲,就行了塔橡。

注意:復(fù)制tomcat實(shí)例的時(shí)候webapps下面可能已經(jīng)存在其他項(xiàng)目的文件,我們要清空webapps霜第,然后把test.war解壓到webapps下面葛家,而不是直接放war包。

我們?cè)賱?chuàng)建一個(gè)項(xiàng)目為test1

現(xiàn)在我們的目錄結(jié)構(gòu)如下:

ubuntu# ls test test1
test:
conf  debug.sh  logs  restart.sh  run.sh  stop.sh  webapps  work

test1:
conf  debug.sh  logs  restart.sh  run.sh  stop.sh  webapps  work

啟動(dòng)tomcat多實(shí)例

ubuntu# test/run.sh
Using CATALINA_BASE:   /opt/web/test
Using CATALINA_HOME:   /opt/soft/apache-tomcat-7.0.73
Using CATALINA_TMPDIR: /opt/web/test/temp
Using JRE_HOME:        /opt/soft/jdk1.8.0_11/
Using CLASSPATH:       /opt/soft/apache-tomcat-7.0.73/bin/bootstrap.jar:/opt/soft/apache-tomcat-7.0.73/bin/tomcat-juli.jar
Using CATALINA_PID:    /opt/web/test/tomcat.pid
Tomcat started.
ubuntu# test1/run.sh
Using CATALINA_BASE:   /opt/web/test1
Using CATALINA_HOME:   /opt/soft/apache-tomcat-7.0.73
Using CATALINA_TMPDIR: /opt/web/test1/temp
Using JRE_HOME:        /opt/soft/jdk1.8.0_11/
Using CLASSPATH:       /opt/soft/apache-tomcat-7.0.73/bin/bootstrap.jar:/opt/soft/apache-tomcat-7.0.73/bin/tomcat-juli.jar
Using CATALINA_PID:    /opt/web/test1/tomcat.pid
Tomcat started.
ubuntu# netstat -tunlp
激活I(lǐng)nternet連接 (僅服務(wù)器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      7237/dnsmasq   
tcp6       0      0 :::8080                 :::*                    LISTEN      10182/java     
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      10258/java     
tcp6       0      0 :::8070                 :::*                    LISTEN      10258/java     
tcp6       0      0 127.0.0.1:8006          :::*                    LISTEN      10182/java     
tcp6       0      0 :::8009                 :::*                    LISTEN      10182/java     
udp        0      0 0.0.0.0:57782           0.0.0.0:*                           7062/avahi-daemon:
udp        0      0 0.0.0.0:49141           0.0.0.0:*                           7237/dnsmasq   
udp        0      0 0.0.0.0:41976           0.0.0.0:*                           7237/dnsmasq   
udp        0      0 127.0.1.1:53            0.0.0.0:*                           7237/dnsmasq   
udp        0      0 0.0.0.0:68              0.0.0.0:*                           9541/dhclient   
udp        0      0 0.0.0.0:48730           0.0.0.0:*                           7237/dnsmasq   
udp        0      0 0.0.0.0:631             0.0.0.0:*                           7120/cups-browsed
udp        0      0 0.0.0.0:47809           0.0.0.0:*                           7237/dnsmasq   
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           7062/avahi-daemon:
udp        0      0 0.0.0.0:36600           0.0.0.0:*                           7237/dnsmasq   
udp6       0      0 :::46484                :::*                                7062/avahi-daemon:
udp6       0      0 :::5353                 :::*                                7062/avahi-daemon:
ubuntu#

可以看到8081泌类,8082癞谒,8083等其他端口都已經(jīng)啟動(dòng),現(xiàn)在可以使用curl命令進(jìn)行訪問

ubuntu# curl localhost:8080

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<h2>Hello World!</h2>
<h2>Test 項(xiàng)目!</h2>
</body>
</html>
ubuntu# curl localhost:8070

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<h2>Hello World!</h2>
<h2>Test 項(xiàng)目!</h2>
</body>
</html>
ubuntu#

多實(shí)例部署成功,以后可以簡單的復(fù)制其中一個(gè)實(shí)例弹砚,修改相關(guān)配置即可双仍。

4. Nginx配置

本篇文章重點(diǎn)不在Nginx,簡單帶過。

在配置文件nginx.conf下的http節(jié)點(diǎn)中桌吃,引入了兩行代碼

http
        {
                include       mime.types;
                default_type  application/octet-stream;

                ......
                ......
                ......

                #在以下兩個(gè)文件具體配置
                include /usr/local/nginx/conf/conf.d/upstream.conf;
                include /usr/local/nginx/conf/conf.d/ld.conf;
}

因此每個(gè)項(xiàng)目站點(diǎn)的具體配置是在upstream.confld.conf中配置的朱沃。

其中ld.conf下配置的是具體站點(diǎn)的server 站點(diǎn)映射關(guān)系


......
other server
......

server  {
    listen  80;
    server_name  www.dongxiaoxia.xyz;
    server_name_in_redirect off;
    client_header_timeout  30;
    client_body_timeout  30;
    charset  UTF-8;
    client_max_body_size  10000k;
    allow  all;

  location / {
        index   index.html index.php index.jsp index.htm;
        proxy_pass      http://test_pool;
        proxy_redirect  off;
        proxy_set_header Host $host;
        proxy_set_header CURRENT_URL http://$Host$request_uri;
        proxy_set_header X-USER_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  access_log  /opt/web/test/logs/test.log  main;
}

......
......

其中upstream.conf下配置的是具體站點(diǎn)的 pool 映射關(guān)系


......
other pool
......

upstream test_pool {
        server 127.0.0.1:8303 weight=15 max_fails=2 fail_timeout=30s;
}

......
......

需要注意的是,在修改了Nginx配置文件后茅诱,一定要執(zhí)行/opt/soft/nginx/sbin/nginx -s reload重新加載配置

5. 自動(dòng)化部署腳本

服務(wù)器每次部署都要拷貝war包到服務(wù)器逗物,停止服務(wù)器,再開啟服務(wù)器让簿,不太方便敬察;而且服務(wù)器的配置文件應(yīng)該相對(duì)于開發(fā)環(huán)境不太容易變動(dòng),或者開發(fā)人員根本無法得知服務(wù)器配置信息尔当,因此帶來另兩個(gè)不好的原因莲祸,war包整體覆蓋會(huì)有問題,war包體積太大椭迎。因此本地打包war包時(shí)要去掉相應(yīng)文件锐帜, 服務(wù)器也要相應(yīng)處理。

假設(shè)場(chǎng)景:本地編譯打包項(xiàng)目war包畜号。假如項(xiàng)目名為test缴阎,war包為test.war,部署時(shí)要求去除日志文件简软、項(xiàng)目配置文件蛮拔、以及依賴的外部jar包。

因此在項(xiàng)目根目錄下創(chuàng)建deploy.bat 腳本痹升,內(nèi)容為:

@echo off

echo ...............................................................................................................................................................
echo This shell script does not put lib directory into package. If you want to, please just upload 'test.war' in target directory.
echo ...............................................................................................................................................................

set SVN_ROOT=D:\svn\test
set TARGET_PATH=%SVN_ROOT%\target\test
set DEPLOY=%SVN_ROOT%\deploy

rd /s /q %DEPLOY%
md %DEPLOY%
echo %TARGET_PATH%
xcopy %TARGET_PATH%\* %DEPLOY%\ /s /e
rd /s /q %DEPLOY%\WEB-INF\lib
del /f /s /q %DEPLOY%\WEB-INF\classes\test.properties
del /f /s /q %DEPLOY%\WEB-INF\classes\log4j.properties

cd /d %DEPLOY%

jar -cvf test.war *

rd /s /q %DEPLOY%\META-INF
rd /s /q %DEPLOY%\WEB-INF
rd /s /q %DEPLOY%\static
del /s /q %DEPLOY%\index.jsp

pause

這個(gè)腳本用來去掉lib下依賴的jar包建炫,test.proterties,log4j.properties,再重新壓縮為war包疼蛾,去掉lib下的jar包肛跌,是因?yàn)轫?xiàng)目的依賴包太大了,傳輸時(shí)很費(fèi)時(shí)間察郁,而jar包在部署過后很可能不會(huì)變動(dòng)衍慎。
test.properties與log4j.properties 為項(xiàng)目的配置文件,開發(fā)環(huán)境與服務(wù)器的配置肯定是不一樣的皮钠,因此不能直接覆蓋掉稳捆,而是全量部署時(shí)放在項(xiàng)目上,以后增量部署的時(shí)候不覆蓋即可麦轰。

1.本地install為test.war眷柔,如果為增量部署還要執(zhí)行一下deploy腳本期虾。
2.把deploy過的war包通過Filezilla等傳輸?shù)椒?wù)器指定的部署目錄,我們這里服務(wù)器的下項(xiàng)目部署文件夾為/root/deploy驯嘱,根據(jù)項(xiàng)目名創(chuàng)建一個(gè)文件夾test镶苞,因此我們的test項(xiàng)目的部署路徑為/root/deploy/test,文件夾下有我們的test.war文件鞠评。
3.在/root/deploy/test文件夾下茂蚓,會(huì)創(chuàng)建一個(gè)deploy.sh 腳本文件,與客戶端的deploy.bat 相呼應(yīng)剃幌。

#!/bin/sh
deploy_file_dir=/root/deploy/test
deploy_dir=/opt/web/test
cd ${deploy_dir}/deploy
rm -rf ./*
jar xvf ${deploy_file_dir}/test.war
cp -rf ./* ${deploy_dir}/webapps/
cd ../
sh stop.sh
sh run.sh

查看腳本內(nèi)容聋涨,我們可以得知deploy.sh 腳本的功能
1.由于客戶端傳送過來的可能不會(huì)是全量test.war包,因此不能簡單的把test.war包直接放到负乡、opt/web/test/webapps目錄下牍白,這樣會(huì)覆蓋掉服務(wù)器的項(xiàng)目配置,也會(huì)導(dǎo)致部分文件丟失抖棘。只能解壓test.war包 把全部內(nèi)容復(fù)制到webapps下茂腥,存在就覆蓋,而不存在的也不會(huì)刪掉webapps下存在的切省。
2.執(zhí)行stop.sh 停止test項(xiàng)目最岗,因?yàn)閠est項(xiàng)目之前可能已經(jīng)啟動(dòng)了。
3.執(zhí)行run.sh 啟動(dòng)項(xiàng)目朝捆。

到此為止般渡,我們已經(jīng)用了腳本代替一部分手動(dòng)操作,但還是不夠完善芙盘,比如項(xiàng)目實(shí)例還是要自己手動(dòng)搭建驯用,啟動(dòng)腳本也要手動(dòng)編寫,下面提供了一鍵部署tomcat實(shí)例項(xiàng)目環(huán)境的腳本build.sh儒老,最大化利用腳本蝴乔,減少手動(dòng)操作。(這里沒有添加Nginx配置贷盲,所以有關(guān)Nginx的配置還要手動(dòng)添加淘这,并且重新加載剥扣!)

#!/bin/sh
#一鍵部署Tomcat實(shí)例項(xiàng)目環(huán)境

#項(xiàng)目名稱
PROJECT_NAME=www.dongxiaoxia.xyz
#tomcat關(guān)閉端口
SERVER_PORT=8006
#Http監(jiān)聽端口
HTTP_PORT=8080
##################以上三個(gè)參數(shù)需要修改############################
#項(xiàng)目基礎(chǔ)路徑
PROJECT_BASE_PATH=/opt/web/
#日志基礎(chǔ)路徑
LOG_BASE_PATH=/opt/log/
#部署基礎(chǔ)路徑
DEPLOY_BASE_PATH=/root/deploy/
#Java安裝路徑
JAVA_HOME=/opt/soft/jdk1.8.0_11/
#Tomcat安裝路徑
CATALINA_HOME=/opt/soft/apache-tomcat-7.0.73
#Tomcat活躍配置路徑,也就是項(xiàng)目部署路徑
CATALINA_BASE=$PROJECT_BASE_PATH$PROJECT_NAME
#tomcat server.xml配置文件路徑
SERVER_XML=$CATALINA_BASE/conf/server.xml
#########################################################################################
echo 'Java安裝路徑:'$JAVA_HOME
echo 'Tomcat安裝路徑:'$CATALINA_HOME
echo 'Tomcat項(xiàng)目實(shí)例路徑:'$CATALINA_BASE
echo '項(xiàng)目war包部署上傳路徑:'$DEPLOY_BASE_PATH$PROJECT_NAME
echo 'tomcat server.xml配置文件路徑:'$SERVER_XML
echo '項(xiàng)目日志路徑:'$LOG_BASE_PATH$PROJECT_NAME
echo 'tomcat關(guān)閉端口:'$SERVER_PORT
echo 'Http監(jiān)聽端口:'$HTTP_PORT

#################創(chuàng)建tomcat實(shí)例 修改server.xml配置##########################

#復(fù)制tomcat實(shí)例所需文件夾
echo '復(fù)制tomcat實(shí)例所需文件夾'

if [ ! -d "$CATALINA_BASE" ]; then
mkdir -p "$CATALINA_BASE"
fi

cd $CATALINA_HOME
cp -r conf $CATALINA_BASE
mkdir $CATALINA_BASE/webapps
mkdir $CATALINA_BASE/work
mkdir $CATALINA_BASE/logs

echo '修改server.xml配置'
# 修改tomcat關(guān)閉端口
sed -i 22s@8005@${SERVER_PORT}@ $SERVER_XML
# 修改Http監(jiān)聽端口
sed -i 71s@8080@${HTTP_PORT}@ $SERVER_XML
# 統(tǒng)一web應(yīng)用程序的路徑
sed -i '125s@appBase="webapps"@appBase="'$CATALINA_BASE'/webapps"@' $SERVER_XML
# 關(guān)閉自動(dòng)部署
#sed -i '126s@autoDeploy="true"@autoDeploy="false"@' $SERVER_XML
sed -i '141a<Host name="localhost"  appBase="'$CATALINA_BASE'/webapps" autoDeploy="false" deployOnStartup="false">\n     <Context path="" docBase="'$CATALINA_BASE'/webapps" crossContext="true" allowLinking="true" reloadable="false">\n         <JarScanner scanAllDirectories="true" />\n         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="'$CATALINA_BASE'/logs/" prefix="gh_access_log." suffix=".log" pattern="%a %A %t %S %b %r %s %{Referer}i %{User-Agent}i %D" resolveHosts="false" />\n     </Context>\n</Host>
' $SERVER_XML

sed -i '125,141d' $SERVER_XML

#######################創(chuàng)建run.sh腳本文件###################################
echo '創(chuàng)建run.sh腳本文件'
cd $CATALINA_BASE
touch run.sh
echo '#!/bin/sh' >> run.sh
echo 'TOMCAT_HOME='$CATALINA_HOME >> run.sh
#echo 'CATALINA_BASE='$CATALINA_BASE >> run.sh
echo 'CATALINA_BASE=$(cd "$(dirname $0)"; pwd)' >> run.sh
echo 'CATALINA_PID=$CATALINA_BASE/tomcat.pid' >> run.sh
echo 'JAVA_HOME='$JAVA_HOME >> run.sh
echo 'CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib' >> run.sh
echo 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib' >> run.sh
echo 'PATH=$PATH:$JAVA_HOME/bin' >> run.sh
echo '' >> run.sh
echo '#路徑為【/opt/web/xxx】時(shí)巩剖,項(xiàng)目名則為【xxx】' >> run.sh
echo "PROJECT_NAME=\`echo \$CATALINA_BASE | awk -F \"/\" '{print \$NF}'\`" >> run.sh
echo '' >> run.sh
echo '#檢測(cè)temp目錄是否存在,不存在則創(chuàng)建' >> run.sh
echo 'if [ ! -d "$CATALINA_BASE/temp" ]; then' >> run.sh
echo '    mkdir "$CATALINA_BASE/temp"' >> run.sh
echo 'fi' >> run.sh
echo '' >> run.sh
echo '#日志目錄名' >> run.sh
echo 'PROJECT_LOG='$LOG_BASE_PATH'$PROJECT_NAME/catalina.out' >> run.sh
echo '' >> run.sh
echo 'JAVA_OPTS="-server -Xms32m -Xmx512m -Xmn32m -Xss1024K -XX:PermSize=32m -XX:MaxPermSize=64m -XX:ParallelGCThreads=32 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80"' >> run.sh
echo '' >> run.sh
echo 'export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG LD_LIBRARY_PATH' >> run.sh
echo '' >> run.sh
echo 'proj_dir=$CATALINA_BASE' >> run.sh
echo 'if [ -n "$proj_dir" ]' >> run.sh
echo 'then' >> run.sh
echo "        ps aux | grep \"\$proj_dir\" | grep -v \"grep\" | grep -v \"\$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)\" > /dev/null" >> run.sh
echo '        status=$?' >> run.sh
echo '' >> run.sh
echo '        if  [ $status -eq 0 ] && [ -s $CATALINA_PID  ]' >> run.sh
echo '        then' >> run.sh
echo '                echo "The $proj_dir tomcat is running and the pid_file is exist !"' >> run.sh
echo '                exit 1' >> run.sh
echo '        elif [ $status -eq 0 ] || [ -s $CATALINA_PID  ]' >> run.sh
echo '        then' >> run.sh
echo '                echo "kill one"' >> run.sh
echo "                ps aux | grep \"\$proj_dir\" | grep -v \"grep\" | grep -v \"\$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)\" | awk '{print \$2}' | xargs -i kill -9 {}" >> run.sh
echo '                > $CATALINA_PID' >> run.sh
echo '                $TOMCAT_HOME/bin/catalina.sh start' >> run.sh
echo '        else' >> run.sh
echo '                $TOMCAT_HOME/bin/catalina.sh start' >> run.sh
echo '        fi' >> run.sh
echo '' >> run.sh
echo 'else' >> run.sh
echo '        echo "start failt!!!"' >> run.sh
echo '        exit 1' >> run.sh
echo 'fi' >> run.sh

#######################創(chuàng)建stop.sh腳本文件###################################
echo '創(chuàng)建stop.sh腳本文件'
cd $CATALINA_BASE
touch stop.sh

echo '#!/bin/sh' >> stop.sh
echo 'TOMCAT_HOME='$CATALINA_HOME >> stop.sh
echo '#CATALINA_BASE='$CATALINA_BASE >> stop.sh
echo 'CATALINA_BASE=$(cd "$(dirname $0)"; pwd)' >> stop.sh
echo 'CATALINA_PID=$CATALINA_BASE/tomcat.pid' >> stop.sh
echo 'JAVA_HOME='$JAVA_HOME >> stop.sh
echo 'CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib' >> stop.sh
echo 'PATH=$PATH:$JAVA_HOME/bin' >> stop.sh
echo '' >> stop.sh
echo '#路徑為【/opt/web/xxx】時(shí)钠怯,項(xiàng)目名則為【xxx】' >> stop.sh
echo "PROJECT_NAME=\`echo \$CATALINA_BASE | awk -F \"/\" '{print \$NF}'\`" >> stop.sh
echo 'echo $PROJECT_NAME' >> stop.sh
echo '' >> stop.sh
echo '#日志目錄名' >> stop.sh
echo 'PROJECT_LOG='$LOG_BASE_PATH'$PROJECT_NAME/' >> stop.sh
echo '' >> stop.sh
echo 'export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG' >> stop.sh
echo '' >> stop.sh
echo 'proj_dir=$CATALINA_BASE' >> stop.sh
echo '$TOMCAT_HOME/bin/catalina.sh stop' >> stop.sh
echo 'sleep 5' >> stop.sh
echo 'if [ -n "$proj_dir" ]' >> stop.sh
echo 'then' >> stop.sh
echo "        ps aux | grep \"\$proj_dir\" | grep -v \"grep\" | grep -v \"\$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)\" > /dev/null" >> stop.sh
echo '        status=$?' >> stop.sh
echo '        if [ $status -eq 0 ] || [ -s $CATALINA_PID  ]' >> stop.sh
echo '        then' >> stop.sh
echo '                echo "kill it"' >> stop.sh
echo "                ps aux | grep \"\$proj_dir\" | grep -v \"grep\" | grep -v \"\$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)\" |  awk '{print \$2}' | xargs -i kill -9 {}" >> stop.sh
echo '                > $CATALINA_PID' >> stop.sh
echo '        fi' >> stop.sh
echo 'else' >> stop.sh
echo '        echo "stop failt!!!"' >> stop.sh
echo '        exit 1' >> stop.sh
echo 'fi' >> stop.sh

#######################創(chuàng)建debug.sh腳本文件###################################
echo '創(chuàng)建debug.sh腳本文件'
cd $CATALINA_BASE
touch debug.sh

echo '#!/bin/sh' >> debug.sh
echo 'TOMCAT_HOME='$CATALINA_HOME >> debug.sh
echo 'CATALINA_BASE=$(cd "$(dirname $0)"; pwd)' >> debug.sh
echo 'CATALINA_PID=$CATALINA_BASE/tomcat.pid' >> debug.sh
echo 'JAVA_HOME='$JAVA_HOME >> debug.sh
echo 'CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib' >> debug.sh
echo 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib' >> debug.sh
echo 'PATH=$PATH:$JAVA_HOME/bin' >> debug.sh
echo '' >> debug.sh
echo '#路徑為【/opt/web/xxx】時(shí)佳魔,項(xiàng)目名則為【xxx】' >> debug.sh
echo "PROJECT_NAME=\`echo \$CATALINA_BASE | awk -F \"/\" '{print \$NF}'\`" >> debug.sh
echo '' >> debug.sh
echo '#日志目錄名' >> debug.sh
echo 'PROJECT_LOG='$LOG_BASE_PATH'$PROJECT_NAME/catalina.out' >> debug.sh
echo '' >> debug.sh
echo 'JAVA_OPTS="-server -Xms32m -Xmx512m -Xmn32m -Xss1024K -XX:PermSize=32m -XX:MaxPermSize=64m -XX:ParallelGCThreads=32 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80"' >> debug.sh
echo '' >> debug.sh
echo 'export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG LD_LIBRARY_PATH' >> debug.sh
echo '' >> debug.sh
echo 'proj_dir=$CATALINA_BASE' >> debug.sh
echo 'if [[ -n "$proj_dir" ]]' >> debug.sh
echo 'then' >> debug.sh
echo '        ps aux | grep "$proj_dir" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" > /dev/null' >> debug.sh
echo '        status=$?' >> debug.sh
echo '' >> debug.sh
echo '        if  [[ $status -eq 0 ]] && [[ -s $CATALINA_PID  ]]' >> debug.sh
echo '        then' >> debug.sh
echo '                echo "The $proj_dir tomcat is running and the pid_file is exist !"' >> debug.sh
echo '                exit 1' >> debug.sh
echo '        elif [[ $status -eq 0 ]] || [[ -s $CATALINA_PID  ]]' >> debug.sh
echo '        then' >> debug.sh
echo '                echo "kill one"' >> debug.sh
echo "                ps aux | grep \"\$proj_dir\" | grep -v \"grep\" | grep -v \"\$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)\" | awk '{print \$2}' | xargs -i kill -9 {}" >> debug.sh
echo '                > $CATALINA_PID' >> debug.sh
echo '                $TOMCAT_HOME/bin/catalina.sh jpda start' >> debug.sh
echo '        else' >> debug.sh
echo '                $TOMCAT_HOME/bin/catalina.sh jpda start' >> debug.sh
echo '        fi' >> debug.sh
echo 'else' >> debug.sh
echo '        echo "start failt!!!"' >> debug.sh
echo '        exit 1' >> debug.sh
echo 'fi' >> debug.sh

#######################創(chuàng)建restart.sh腳本文件###################################
echo '創(chuàng)建restart.sh腳本文件'
cd $CATALINA_BASE
touch restart.sh

echo '#!/bin/sh' >> restart.sh
echo 'TOMCAT_HOME='$CATALINA_HOME >> restart.sh
echo 'CATALINA_BASE=$(cd "$(dirname $0)"; pwd)' >> restart.sh
echo 'CATALINA_PID=$CATALINA_BASE/tomcat.pid' >> restart.sh
echo 'JAVA_HOME=/opt/soft/jdk/1.8.11/jdk1.8.0_11' >> restart.sh
echo 'CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib' >> restart.sh
echo 'PATH=$PATH:$JAVA_HOME/bin' >> restart.sh
echo 'JAVA_OPTS="-server -Xms1g -Xmx1g -Xmn512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80"' >> restart.sh
echo '' >> restart.sh
echo '#路徑為【/opt/web/xxx】時(shí),項(xiàng)目名則為【xxx】' >> restart.sh
echo "PROJECT_NAME=\`echo \$CATALINA_BASE | awk -F \"/\" '{print \$NF}'\`" >> restart.sh
echo '' >> restart.sh
echo '#日志目錄名' >> restart.sh
echo 'PROJECT_LOG='$LOG_BASE_PATH'$PROJECT_NAME/catalina.out' >> restart.sh
echo '' >> restart.sh
echo 'export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS PROJECT_NAME PROJECT_LOG' >> restart.sh
echo '' >> restart.sh
echo 'sh $CATALINA_BASE/stop.sh' >> restart.sh
echo 'sh $CATALINA_BASE/start.sh' >> restart.sh
#######################創(chuàng)建deploy.sh腳本文件###################################
echo '創(chuàng)建deploy.sh腳本文件'

if [ ! -d "$DEPLOY_BASE_PATH$PROJECT_NAME" ]; then
  mkdir -p "$DEPLOY_BASE_PATH$PROJECT_NAME"
fi

cd $DEPLOY_BASE_PATH$PROJECT_NAME
touch deploy.sh

echo '#!/bin/sh' >> deploy.sh
echo "deploy_file_dir=$DEPLOY_BASE_PATH$PROJECT_NAME" >> deploy.sh
echo "deploy_dir=$CATALINA_BASE" >> deploy.sh
echo "if [ ! -d "\${deploy_dir}/deploy" ]; then" >> deploy.sh
echo "  mkdir -p "\${deploy_dir}/deploy"" >> deploy.sh
echo "fi" >> deploy.sh
echo 'cd ${deploy_dir}/deploy' >> deploy.sh
echo 'rm -rf ./*' >> deploy.sh
echo 'jar xvf ${deploy_file_dir}/'$PROJECT_NAME'.war' >> deploy.sh
echo 'cp -rf ./* ${deploy_dir}/webapps/' >> deploy.sh
echo 'cd ../' >> deploy.sh
echo 'sh stop.sh' >> deploy.sh
echo 'sh run.sh' >> deploy.sh
#########################################################################################
echo 'tomcat項(xiàng)目實(shí)例創(chuàng)建成功!'
echo "請(qǐng)把war包放置到$DEPLOY_BASE_PATH$PROJECT_NAME目錄下晦炊,執(zhí)行$DEPLOY_BASE_PATH$PROJECT_NAME/deploy腳本啟動(dòng)項(xiàng)目."
echo "或者直接解壓war包到$CATALINA_BASE/webapps下鞠鲜。執(zhí)行$CATALINA_BASE/run腳本啟動(dòng)項(xiàng)目."

6. 部署總結(jié)

為什么

本篇文章都是為了解決文章開頭的問題及后續(xù)問題:本地開發(fā)完項(xiàng)目后如何簡單部署到服務(wù)器宁脊?

怎么做

  1. 服務(wù)器項(xiàng)目部署規(guī)范化,相關(guān)軟件規(guī)范化贤姆,統(tǒng)一部署榆苞,集中管理巢块。
  2. 用腳本替代手動(dòng)操作股缸。
  3. 部署文檔清晰易懂。

怎么樣

優(yōu)點(diǎn)

  1. tomcat多實(shí)例部署职员,啟動(dòng)碧信、關(guān)閉一個(gè)項(xiàng)目站點(diǎn)不影響其他站點(diǎn)赊琳,沒有耦合。
  2. 對(duì)添加開放砰碴,對(duì)刪除關(guān)閉躏筏。
    要添加一個(gè)新的項(xiàng)目站點(diǎn),只需簡單的執(zhí)行一下腳本就能夠?qū)崿F(xiàn)呈枉,不會(huì)影響其他站點(diǎn)配置趁尼。
  3. 第一次部署及后續(xù)增量部署都極其簡單、容易操作碴卧、全程腳本化弱卡。
  4. 整個(gè)服務(wù)器規(guī)范化,各個(gè)項(xiàng)目部署路徑住册、相關(guān)軟件路徑婶博、日志路徑清晰明了。
  5. 項(xiàng)目日志集中管理荧飞,方便后續(xù)統(tǒng)計(jì)分析凡人。

劣勢(shì)

  1. 要求部署人員具備一定的腳本語法基礎(chǔ),能夠理解相關(guān)的腳本原理叹阔。
  2. 腳本的創(chuàng)建是直接添加內(nèi)容挠轴,如果之前已經(jīng)存在相關(guān)的文件,沒有采取替換而是追加耳幢,因此要確定相關(guān)路徑上的文件是否正確岸晦。

幾句話說明白部署

部署環(huán)境整體規(guī)劃

  1. 項(xiàng)目目錄 /opt/web
  2. 日志目錄 /opt/log
  3. jdk/tomcat/nginx等目錄 安裝環(huán)境 /opt/soft
  4. 項(xiàng)目應(yīng)用war包上傳到服務(wù)器的目錄 /root/deploy

假設(shè)現(xiàn)在有3個(gè)項(xiàng)目 test test1 test2

ubuntu# ls /opt/web /root/deploy/ /opt/soft /opt/log
/opt/log:
test  test1  test2

/opt/soft:
apache-tomcat-7.0.73  include      lib    nginx-1.6.2         openssl-1.1.0c         pcre-8.39         share  zlib-1.2.8
bin           jdk1.8.0_11  nginx  nginx-1.6.2.tar.gz  openssl-1.1.0c.tar.gz  pcre-8.39.tar.gz  ssl    zlib128.zip

/opt/web:
build.sh  test  test1  test2

/root/deploy/:
test  test1  test2
ubuntu# 

全量部署(第一次部署)

  1. 執(zhí)行build.sh腳本一鍵部署項(xiàng)目
  2. 配置并重新加載Nginx代理配置
  3. 開發(fā)環(huán)境install打包war包傳輸?shù)椒?wù)器deploy目錄
  4. 執(zhí)行deploy.sh腳本,打開項(xiàng)目日志查看啟動(dòng)情況

增量部署

  1. 開發(fā)環(huán)境install打包war包,執(zhí)行開發(fā)環(huán)境deploy.sh(mac)/deploy.bat(windows)腳本睛藻,傳輸?shù)椒?wù)器deploy目錄
  2. 執(zhí)行deploy.sh腳本启上,打開項(xiàng)目日志查看啟動(dòng)情況
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市店印,隨后出現(xiàn)的幾起案子冈在,更是在濱河造成了極大的恐慌,老刑警劉巖按摘,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件包券,死亡現(xiàn)場(chǎng)離奇詭異纫谅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)溅固,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門付秕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侍郭,你說我怎么就攤上這事盹牧。” “怎么了励幼?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵汰寓,是天一觀的道長。 經(jīng)常有香客問我苹粟,道長有滑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任嵌削,我火速辦了婚禮毛好,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苛秕。我一直安慰自己肌访,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布艇劫。 她就那樣靜靜地躺著吼驶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪店煞。 梳的紋絲不亂的頭發(fā)上蟹演,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音顷蟀,去河邊找鬼酒请。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸣个,可吹牛的內(nèi)容都是我干的羞反。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼囤萤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昼窗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阁将,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤膏秫,失蹤者是張志新(化名)和其女友劉穎右遭,沒想到半個(gè)月后做盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缤削,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年吹榴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亭敢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡图筹,死狀恐怖帅刀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情远剩,我是刑警寧澤扣溺,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瓜晤,受9級(jí)特大地震影響锥余,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痢掠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一驱犹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧足画,春花似錦雄驹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至象缀,卻和暖如春彬向,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背攻冷。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工娃胆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人等曼。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓里烦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親禁谦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胁黑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 轉(zhuǎn)自陳明乾的博客,可能有一定更新州泊。 轉(zhuǎn)原文聲明:原創(chuàng)作品丧蘸,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 遥皂、...
    C86guli閱讀 2,695評(píng)論 1 37
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理力喷,服務(wù)發(fā)現(xiàn)刽漂,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • @本文根據(jù)centos6.5總結(jié)來的操作常識(shí) centos安裝教程: http://www.2cto.com/os...
    古佛青燈度流年閱讀 552評(píng)論 0 1
  • 七年后弟孟? 先想想七年前的自己 2017年6月6日贝咙,我的一天 7.25發(fā)號(hào),起床拂募,聽新聞庭猩,聽得到,洗漱 8:00早餐...
    一日兩人三餐四季閱讀 315評(píng)論 1 1