Linux下離線部署Node環境和前端服務

背景說明

前端項目開發完成,須要部署在第三方服務器。因爲第三方服務器是脫離公網的環境,全部的前端服務和全部的依賴都須要在離線環境中部署。記錄下解決方案,但願能夠幫助到有相似需求的旁友。會涉及到基礎的Linux知識,對Linux不熟悉的童鞋能夠先看看資料入門。javascript

基本解決思路

  1. 把Node環境下載下來做爲離線包備用。
  2. 本地構建前端代碼,將全部前端構建產出以及node_modules依賴,node離線包所有打包成一個output.tar.gz
  3. 上傳到服務器。
  4. 解壓,將node環境安裝到服務器,運行。
  5. 要是都是腳本控制就更完美了~

最終產出的output目錄內容

output
  bin      		// pm2 控制腳本
  config 		// 配置文件
  dist     		// webpack 產出
  node_modules  // 項目全部依賴,固然這裏面的內容能夠只保留服務器須要的依賴,根據需求定
  server  		// 代理服務器,我想你的項目應該會用到
  thirdparty  	// 運行環境目錄,這裏是node-v8.x
  install.sh   	// 自動安裝node環境腳本
複製代碼

離線包製做步驟

這裏關於前端的webpack構建就不贅述了,直接看關鍵點:html

  1. 準備node離線包。直接在Node官網下載圖示版本(這裏要根據須要下載Node的具體版本,個人項目用的是Node-LTS),這裏下載的是linux通用的可執行文件,直接解壓就可執行,方便後續腳本化操做。 前端

    image.png

    1. 有了離線包,在上傳到服務器以後確定還要手動安裝啊,這個過程很機械,機械的東西就交給機器幹吧。準備一個node環境安裝腳本output/install.sh,讓它來完成這些事情。因爲下載的是可執行文件,解壓後就至關於直接把node安裝到了 output/thirdparty目錄下,須要作的就是把node暴露給操做系統,讓它擁有node運行環境。經常使用的有兩種方法:
      • 添加全局環境變量
      • 添加軟連接
    • 腳本中有個問題,但願有大神能幫忙解答下,我把node環境變量添加到 /etc/profile後,使用 soure 調用了它,可是沒有生效,因此採用了軟連接的方法將node暴露在系統中。
    • 腳本是在 CentOS7 中運行測試,開發時須要安裝虛擬機模擬真實Linux環境,若是是mac,可能不能正常執行。具體安裝步驟,可自行百度。
    #!/bin/bash
    # install nodejs
    base_dir=$(dirname $(readlink -f $0))
    node_dir="node-v8.12.0-linux-x64"
     # 第一步:將node解壓到thirdparty,也就是當前文件夾
    
    if [ ! -d ${base_dir}/thirdparty/${node_dir} ]; then
      echo -e "\033[33m 正在解壓Node \033[0m"
      tar -xvf ${base_dir}/thirdparty/node-env.tar.xz -C ${base_dir}/thirdparty
      echo -e "\033[32m Node 解壓完成 \033[0m"
    else
      echo -e "\033[32m Node 已解壓完成 \033[0m"
    fi
     # 賦予執行權限
    chmod u+x ${base_dir}/thirdparty/${node_dir}/bin/*
     #######問題########
    # 添加環境變量
    # export PATH=$PATH:${base_dir}/thirdparty/${node_dir}/bin
    # if [[ ! $PATH =~ "${base_dir}/thirdparty/${node_dir}/bin" ]]
    # then
    # echo "export PATH=$PATH:${base_dir}/thirdparty/${node_dir}/bin" >> /etc/profile
    # echo "Node 環境變量已添加"
    # fi
     # echo $PATH
    # source /etc/profile
    # echo $PATH
    #######問題########
     # 軟連接
    ln -sf ${base_dir}/thirdparty/${node_dir}/bin/node /usr/bin/node
    
    if [ -f /usr/bin/node ]; then
      echo -e "\033[32m Node 軟連接已添加 \033[0m"
    else
      echo -e "\033[31m Error: Node 軟連接添加失敗,確認是否以ROOT身份運行 \033[0m"
      exit
    fi
     # 聯動pm2控制
    if [ -f ./bin/control ]; then
      echo -e "\033[33m 啓動Server... \033[0m"
      ./bin/control start
      echo -e "\033[32m Server啓動成功,可以使用./bin/control維護當前服務 \033[0m"
      ./bin/control help
    fi
    複製代碼
  2. 在前端構建完成後把node壓縮包拷貝至output中。貼上個人構建腳本build.sh(項目根目錄中),讓腳本去執行npm install balabala... 能夠參考下:java

    #!/bin/sh
    echo $(date +"%Y-%m-%d %H:%M:%S") 'build begin'
    rm -rf node_modules
    echo $(date +"%Y-%m-%d %H:%M:%S") 'rm -rf node_modules end'
    npm install
    echo $(date +"%Y-%m-%d %H:%M:%S") 'install end'
    mkdir output
    echo $(date +"%Y-%m-%d %H:%M:%S") 'mkdir output end'
    npm run build
    echo $(date +"%Y-%m-%d %H:%M:%S") 'npm build end'
    # 將全部須要的文件統統塞到output下
    cp -r build config node_modules server dist yunyi/bin thirdparty install output
    echo $(date +"%Y-%m-%d %H:%M:%S") 'move files end'
    # 給腳本添加運行權限
    chmod +x output/bin/control
    chmod +x output/install
    echo $(date +"%Y-%m-%d %H:%M:%S") 'build end'
    # GZ壓縮output
    tar -czvf output.tar.gz output
    複製代碼
  3. 若是順利的話,執行完以上腳本,你會在項目根目錄中發現一個output.tar.gz的文件。至此,前端的離線部署包就完成了。node

「真實」環境操做

  1. 這裏採用已經安裝好的虛擬環境CentOS7 , 有了虛擬環境,再把離線包複製到虛擬環境中,tar解壓之...
  2. 進入解壓出來的output中,你會看到 install
  3. 運行install腳本安裝node,這裏注意要以root權限運行,否則會報錯。若是終端中顯示 Node 軟連接已添加就說明node已經安裝完成了。
  4. 啓動你的server腳本,我把維護server的腳本(pm2操做)都放在了bin/controlinstall腳本執行完畢後會調用這個文件的start方法,這裏根據需求自行修改吧,運行如圖:
    image.png
  5. pm2控制腳本
 #!/bin/sh
   cd "$(dirname $0)"/.. || exit 1
   PROC_NAME='proxy-server'
   
   help(){
       echo "${0} <start|stop|restart|status|monit|list|delete>"
       exit 1
   }
   
   status(){
       status=$(node_modules/pm2/bin/pm2 show $PROC_NAME | grep status | awk '{print $4}')
       echo $status
       if [ X"$status" == X"online" ]; then
           return 0
       else
           return 1
       fi
   }
   
   start(){
       node_modules/pm2/bin/pm2 set pm2-logrotate:max_size 100M
       node_modules/pm2/bin/pm2 set pm2-logrotate:retain 15
       node_modules/pm2/bin/pm2 start ./server/app.js --name $PROC_NAME -l "../log/nf1-server"
   }
   
   list(){
       node_modules/pm2/bin/pm2 list $PROC_NAME
   }
   restart(){
       node_modules/pm2/bin/pm2 restart $PROC_NAME
   }
   monit(){
       node_modules/pm2/bin/pm2 monit $PROC_NAME
   }
   stop(){
       node_modules/pm2/bin/pm2 stop $PROC_NAME
   }
   delete(){
       node_modules/pm2/bin/pm2 delete $PROC_NAME
   }
   
   case "${1}" in
       monit)
           monit
           ;;
       list)
           list
           ;;
       start)
           start
           ;;
       stop)
           stop
           ;;
       delete)
           delete
           ;;
       status|health|checkhealth|st)
           status
           ;;
       restart)
           restart
           ;;
       *)
           help
           ;;
   esac
   
複製代碼

參考資料

Shell腳本入門linux

Linux環境變量webpack

Node服務一鍵離線部署web

相關文章
相關標籤/搜索