分享一例測試環境下nginx+tomcat的視訊業務部署記錄

散盡浮華發表於2016-11-21

 

需求說明:
在測試環境下(192.168.1.28)部署一套公司某業務環境,其中:
該業務前臺訪問地址: http://testhehe.wangshibo.com
該業務後臺訪問地址: http://testhehe.wangshibo.com/admin/

涉及到視訊讀寫需求,要求視訊在測試機上寫入,然後在另一臺圖片伺服器(192.168.1.6)上讀,這就需要做nfs共享。需要給開發同事提供視訊寫入和讀取的url地址:
視訊寫地址:http://testhehe.wangshibo/static/video
視訊讀地址:http://static.wangshibo.com/video

部署記錄:
一、測試機上的操作

(1)nginx的配置
[root@dev-test ~]# cat testhehe.wangshibo.com.conf
server {
          listen 80;

         server_name testhehe.wangshibo.com;

         access_log /var/log/testhehe.log main;

         location / {
             proxy_pass http://127.0.0.1:8383;                            #前臺訪問
             proxy_connect_timeout 30;
             proxy_send_timeout 60;
             proxy_read_timeout 60;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header REMOTE-HOST $remote_addr;
             proxy_set_header Host $host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }

         location /admin {
             proxy_pass http://127.0.0.1:8484/;   #後臺訪問跳轉(注意這裡8484後面的斜槓/要加上,不然訪問跳轉會有問題,8484埠的tomcat目錄下不需要有admin實際目錄存在)
             proxy_connect_timeout 30;
             proxy_send_timeout 60;
             proxy_read_timeout 60;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header REMOTE-HOST $remote_addr;
             proxy_set_header Host $host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }

         location /static/video {                     #視訊寫地址,這裡不需要另啟tomcat程式進行nginx跳轉設定(沒有war包資料),直接nginx設定訪問地址即可
             root /Data/app/tomcat-7-hehe/static/video;
         }

         } ##end server

 

啟動nginx
[root@dev-test ~]# /Data/app/nginx/sbin/nginx -t
[root@dev-test ~]# /Data/app/nginx/sbin/nginx -s reload

以上nginx的配置說明:
1)該業務前臺http://testhehe.wangshibo.com訪問轉向8383埠的tomcat,程式碼放到/Data/app/tomcat-7-hehe/webapp目錄下
2) 該業務後臺http://testhehe.wangshibo.com/admin/訪問轉向8484埠的tomcat,程式碼放到/Data/app/tomcat-7-admin-hehe/webapp目錄下
3)視訊寫入的地址是:http://testhehe.wangshibo.com/static/video,根目錄為/Data/app/tomcat-7-hehe/static/video,由於tomcat和nginx程式許可權不一樣,最好將此目錄設定成777許可權。

[root@dev-test ~]# chmod -R 777 /Data/app/tomcat-7-hehe/static/video

(2)tomcat設定

1)前臺訪問跳轉的tomcat設定(8383埠)
[root@dev-test ~]# cd /Data/app/tomcat-7-hehe/conf/
[root@dev-test conf]# cat server.xml
.......
<Server port="8785" shutdown="SHUTDOWN">
......
<Connector port="8383" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
.....
<Connector port="8789" protocol="AJP/1.3" redirectPort="8443" />
.....
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
.....
</Server>

注意:tomcat預設的根目錄是webapps/ROOT,所以現將webapps目錄下預設的檔案都刪除
[root@dev-test webapps]# pwd
/Data/app/tomcat-7-hehe/webapps
[root@dev-test webapps]# rm -rf ./*

將前臺程式碼的war包拷貝到webapps下,war包名稱最好是ROOT.war,如果不是這個名稱,可以手動將war包改成這個ROOT.war名稱.這樣訪問的時候就直接使用tomcat的預設目錄了,比如 http://127.0.0.1:8383;(當然如果不改成ROOT.war也無妨,比如war包名叫hehe.war,需要提前將webapps目錄清空,那麼tomcat啟動後,訪問就是http://127.0.0.1:8383/hehe,這樣在nginx反向代理裡的proxy_pass配置也要改成proxy_pass http://127.0.0.1:8383/hehe; )
例如開發提供的業務程式碼war包名稱是hehe.war,將其上傳到webapp下,並更名為ROOT.war
[root@dev-test webapp]# ll hehe.war
-rw-r--r-- 1 root root 52673678 11月 21 17:40 hehe.war
[root@dev-test webapp]# mv hehe.war ROOT.war                                     
[root@dev-test webapp]# ll
-rw-r--r-- 1 root root 124491469 11月 22 17:59 ROOT.war      

-----------------------------------------------------------------------------------------------------------------------------------------------------------------
這裡注意一下:
tomcat預設的根目錄是webapp/ROOT,為了方便tomcat訪問時採用預設目錄(並且前端nginx反向代理裡直接是轉到tomcat預設的埠訪問上),所以需要將業務程式碼war包改成ROOT.war放到webapp下,如果war包名不是ROOT.war,那麼重啟tomcat後,訪問會失敗(404頁面)。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

接著啟動8383埠的tomcat程式,這個ROOT.war包就會自動解壓
[root@dev-test webapps]# ../bin/startup.sh
Using CATALINA_BASE: /Data/app/tomcat-7-hehe
Using CATALINA_HOME: /Data/app/tomcat-7-hehe
Using CATALINA_TMPDIR: /Data/app/tomcat-7-hehe
Using JRE_HOME: /usr/java/jdk1.7.0_79
Using CLASSPATH: /Data/app/tomcat-7-hehe/bin/bootstrap.jar:/Data/app/tomcat-7-hehe/bin/tomcat-juli.jar
Tomcat started.

[root@dev-test webapps]# ll
總用量 121580
drwxr-xr-x 10 root root 4096 11月 22 17:57 ROOT
-rw-r--r-- 1 root root 124491469 11月 22 17:59 ROOT.war

[root@dev-test webapps]# lsof -i:8383
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 26155 root 43u IPv6 214715915 0t0 TCP *:m2mservices (LISTEN)

由於業務程式碼每次發版都需要重啟tomcat,而tomcat沒有自帶的重啟指令碼,重啟需要先kill,然後start啟動,這樣很不方面。
這裡分享一個簡單的發版後的tomcat重啟指令碼:
[root@dev-test tomcat-7-hehe]# pwd
/Data/app/tomcat-7-hehe
[root@dev-test tomcat-7-hehe]# cat start.sh
#!/bin/bash

cd /Data/app/tomcat-7-hehe/
#pkill -9 java
kill -9 `ps -ef|grep java|grep -v grep|grep tomcat-7-hehe |awk -F" " '{print $2}'`
rm -rf temp/*
rm -rf work/*
rm -rf webapps/ROOT

sh bin/startup.sh

2)同理,設定後臺訪問跳轉的tomcat設定(8484埠)
[root@dev-test ~]# cd /Data/app/tomcat-7-admin-hehe/conf
[root@dev-test conf]# cat server.xml
.......
<Server port="8886" shutdown="SHUTDOWN">
......
<Connector port="8484" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
.....
<Connector port="8889" protocol="AJP/1.3" redirectPort="8443" />
.....
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
.....
</Server>

注意:tomcat預設的根目錄是webapps/ROOT,所以現將webapps目錄下預設的檔案都刪除
[root@dev-test webapps]# pwd
/Data/app/tomcat-7-admin-hehe/webapps
[root@dev-test webapps]# rm -rf ./*

然後將前臺程式碼的war包拷貝到webapps下,war包名稱最好是ROOT.war,如果不是這個名稱,就手動改成這個ROOT.war名稱.
[root@dev-test webapps]# ll
總用量 121580
-rw-r--r-- 1 root root 124491469 11月 22 17:59 ROOT.war

接著啟動8383埠的tomcat程式,這個ROOT.war包就會自動解壓
[root@dev-test webapps]# ../bin/startup.sh
Using CATALINA_BASE: /Data/app/tomcat-7-admin-hehe
Using CATALINA_HOME: /Data/app/tomcat-7-admin-hehe
Using CATALINA_TMPDIR: /Data/app/tomcat-7-admin-hehe
Using JRE_HOME: /usr/java/jdk1.7.0_79
Using CLASSPATH: /Data/app/tomcat-7-admin-hehe/bin/bootstrap.jar:/Data/app/tomcat-7-admin-hehe/bin/tomcat-juli.jar
Tomcat started.

[root@dev-test webapps]# ll
總用量 121580
drwxr-xr-x 10 root root 4096 11月 22 17:57 ROOT
-rw-r--r-- 1 root root 124491469 11月 22 17:59 ROOT.war

[root@dev-test webapps]# lsof -i:8383
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 26155 root 43u IPv6 214715915 0t0 TCP *:m2mservices (LISTEN)

由於業務程式碼每次發版都需要重啟tomcat,而tomcat沒有自帶的重啟指令碼,重啟需要先kill,然後start啟動,這樣很不方面。
這裡分享一個簡單的發版後的tomcat重啟指令碼:
[root@dev-test tomcat-7-admin-hehe]# pwd
/Data/app/tomcat-7-admin-hehe
[root@dev-test tomcat-7-admin-hehe]# cat start.sh
#!/bin/bash

cd /Data/app/tomcat-7-admin-hehe/
#pkill -9 java
kill -9 `ps -ef|grep java|grep -v grep|grep tomcat-7-admin-hehe |awk -F" " '{print $2}'`
rm -rf temp/*
rm -rf work/*
rm -rf webapps/ROOT

sh bin/startup.sh

接著說下掛載nfs共享:
即將視訊寫入到本機的/Data/app/tomcat-7-hehe/static/video目錄下(寫地址是http://testhehe.wangshibo/static/video),然後共享給圖片伺服器192.168.1.6的/usr/local/nginx/html/hehe/video
[root@dev-test webapp]# /bin/mount -t nfs 192.168.1.6:/usr/local/nginx/html/hehe/video /Data/app/tomcat-7-hehe/static/video
[root@dev-test webapp]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 50G 12G 36G 26% /
tmpfs 32G 72K 32G 1% /dev/shm
/dev/sda1 485M 39M 421M 9% /boot
/dev/mapper/VolGroup-lv_home 844G 69G 732G 9% /home
192.168.1.6:/usr/local/nginx/html/hehe/video 97G 64G 28G 70% /home/Data/app/tomcat-7-hehe/static/video

設定開機掛載
[root@dev-test webapp]# cat /etc/rc.local
......
/bin/mount -t nfs 192.168.1.6:/usr/local/nginx/html/hehe/video /Data/app/tomcat-7-hehe/static/video

nfs的部署參考:nfs服務部署記錄

二、圖片伺服器上的操作
(1)nginx的配置

[root@static ~]# cat /usr/loca/nginx/conf/vhost/static.conf
server {
      listen  80;
        server_name  static.wangshibo.com;
        root   /usr/local/nginx/html/hehe;

  error_page 403 /403.html;
        
  location = /403.html {
           root   html;
           allow all;
        }

        location ~ \.mp4(.*)$  {                   #針對mp4格式的視訊讀取限制
            mp4;
            mp4_buffer_size 4M;
            mp4_max_buffer_size 10M;
        }
}

[root@static ~]# /usr/loca/nginx/sbin/nginx -t 
[root@static ~]# /usr/loca/nginx/sbin/nginx 

[root@static ~]# mkdir /usr/local/nginx/html/hehe/video

-----------------------------------------------------------------------------------
下面隨便說下該業務前後臺程式碼發版指令碼:

指令碼在svn機器上:
[root@svn-server ~]# pwd
/Data/webroot_svncode/wangshibo

前臺程式碼發版指令碼
[root@svn-server ~]# cat up_pub_test_wangshibo.sh
#!/bin/bash
REMOTE_SERVER_IP="192.168.1.28"                           #測試伺服器,ssh埠是25791
DEST_DIR="/Data/app/tomcat-7-hehe/webapps"
cd /Data/webroot_svncode/wangshibo/test/front            #在svn本機下載前臺程式碼的存放路徑,第一次svn下載需要使用者名稱和密碼,後面就只需要update更新程式碼即可

/usr/bin/svn update

/usr/bin/ssh -p25791 ${REMOTE_SERVER_IP} "rm -rf /Data/app/tomcat-7-hehe/webapps/ROOT*";                       #svn裡面的war包名次是ROOT.war,具體理由上面已說明
/usr/bin/rsync -av -e "/usr/bin/ssh -p25791" --rsync-path="/usr/bin/rsync" --progress /Data/webroot_svncode/wangshibo/test/front/ROOT.war ${REMOTE_SERVER_IP}:${DEST_DIR};
sleep 10

/usr/bin/ssh -p25791 ${REMOTE_SERVER_IP} "/bin/sh /Data/app/tomcat-7-hehe/start.sh"; 

後臺程式碼發版指令碼
[root@svn-server ~]# cat up_pub_testadmin_wangshibo.sh
#!/bin/bash
REMOTE_SERVER_IP="192.168.1.28"
DEST_DIR="/Data/app/tomcat-7-admin-hehe/webapps"
cd /Data/webroot_svncode/wangshibo/test/bg

/usr/bin/svn update

/usr/bin/ssh -p25791 ${REMOTE_SERVER_IP} "rm -rf /Data/app/tomcat-7-admin-hehe/webapps/ROOT*";
/usr/bin/rsync -av -e "/usr/bin/ssh -p25791" --rsync-path="/usr/bin/rsync" --progress /Data/webroot_svncode/wangshibo/test/bg/ROOT.war ${REMOTE_SERVER_IP}:${DEST_DIR};
sleep 10

/usr/bin/ssh -p25791 ${REMOTE_SERVER_IP} "/bin/sh /Data/app/tomcat-7-admin-hehe/start.sh";

相關文章