linux之記服務器上線並維護更新一個node項目

前言

首先,本人只是一個開發安卓和前端辣雞,後臺服務器相關知識涉及比較少,也不太懂,以下純個人學習而來,僅供參考,肯定很多問題跟實際不一定一樣,輕噴,最好勿噴

涉及技術點:linux常用命令,shell腳本,git使用,firewall防火牆,nginx,infotify,pm2,node等相關知識

由於去年忙裏抽空用node寫了一套系統,作爲一個前端,對後臺服務器等知識不瞭解,所以就想走一遍整個流程:

開發->申請域名/部署服務器->上線項目

先說下,一個項目的簡單發佈有如下三個倉庫:

可以看到,本地的代碼倉庫和服務器代碼倉庫是一樣的,都可以相對裸倉庫進行push/pull,因爲兩者本來就一樣,本地代碼倉庫是爲了在本地跑,服務器代碼倉庫是爲了在服務器跑,之所以不用裸倉庫直接當項目跑,而是弄一個代碼倉庫,是因爲裸倉庫是經過加密處理的,我們根本看不懂,更何況當成正常項目來跑了,但是clone出來的就可以正常顯示了,至於爲啥問git去,看git源碼去。

1.服務器創建裸倉庫:git init --bare。

2.服務器創建代碼倉庫,從裸倉庫clone來

3.本地創建代碼倉庫

然後綁定到服務器裸倉庫:git remote add origin <用戶名>@<服務器公網IP>:/<服務器裸倉庫地址>。我用的用戶名是root,如果覺得不安全,也可以創建其他用戶,然後限制權限,因爲root屬於最高權限賬戶,所以很多操作爲了安全會創建其他賬號比如git賬戶,用以限制其權限只用來做代碼的控制。

4.使用forever/pm2在服務器將代碼倉庫跑起來

執行npm start,nodejs項目跑起來後,默認開啓3000端口,http://localhost:3030,我們知道,npm start之後我們無法進行其他操作了,除非control+c停止運行,因爲我們不是在後臺跑的,所以受限,爲了讓它可以在後臺跑,我們可以用相關工具,forever或者pm2,具體看相關資料,我在項目中用的是pm2,具體使用在下面會說明

5.使用nginx將域名綁定到這個項目,擴展firewall防火牆

比如通過shudongpo.com這個域名訪問到我們的項目,那麼就需要將域名和3030端口綁定起來,這樣纔可以在服務器外進行訪問項目,這纔算是成功發佈了,這個步驟我們需要藉助nginx來實現,使用nginx將域名轉發到3000端口,具體如下:

使用yum安裝nginx:yum install -y nginx。

安裝後:nginx -t查看配置文件位置。

使用vim編輯nginx配置文件增加一個server:

    server {
        listen       80;
        server_name  xxx.xxx.cn;
        location / {
            proxy_pass http://localhost:3000;
        }
    }

這樣當你訪問xxx.xxx.cn的時候就可以訪問到你跑起來的node項目了。

注意:80端口請在自己的服務器的安全組裏面開放出來,以免無法訪問;如果你的linux服務器安裝了firewall防火牆,很有可能你的firewall將80端口給關閉了,所以可以將其開啓:firewall-cmd --zone=public --add-port=80/tcp --permanent。

firewall知識擴展:

開放端口,firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含義:
--zone #作用域
--add-port=80/tcp  #添加端口,格式爲:端口/通訊協議
--permanent   #永久生效,沒有此參數重啓後失效
查看已開放端口,firewall-cmd --list-ports
重啓,firewall-cmd --reload
查看默認防火牆狀態,firewall-cmd --state

nginx配置完成後請重啓:systemctl start nginx,如果已經開啓過那就restart。

然後在電腦上輸入綁定的域名就可以訪問項目了。

6.使用inotify、shell腳本、pm2實現自動更新線上項目【重點】

現在項目已經跑起來了,那麼有什麼問題呢?電腦上修改代碼後push到服務器裸倉庫,但是服務器代碼倉庫我們沒有pull,所以代碼沒更新,即使更新了我們沒有重新跑項目,訪問的時候還是不會更新的,所以需要解決的問題:

電腦push代碼 -> 服務器裸倉庫收到更新後更新代碼倉庫 -> 代碼倉庫更新後重新跑起來

6.1.電腦push代碼

本地執行push即可

6.2.服務器裸倉庫收到更新後更新代碼倉庫

此步驟需要分兩步來走:1.服務器監聽到裸倉庫更新;2.裸倉庫更新後,自動更新代碼倉庫

先說監聽裸倉庫的更新,我們也可以用git的鉤子實現,具體請查看相關資料,我這裏介紹下inotify,我使用的inofity來監聽的

安裝inotify:

yum install inotify-tools -y

執行監聽,直接寫個shell腳本來跑,touch update.sh:


#!/bin/bash
#監聽裸倉庫xxx.git改變完成後,執行xxx代碼倉庫進行pull
inotifywait -m -e modify -r /local/git_project/xxx.git/ |
while read events            #讀取事件
do
cd /local/node_workspace/xxx #cd到代碼倉庫目錄
git pull                     #pull代碼
echo 'xxx.git裸倉庫有變動,已pull最新代碼到代碼倉庫'
echo $events                 #打印事件
done

inofity相關命令知識擴展:

inotifywait -m -e modify -r /local/git_project/xxx.git

-m表示保持監聽,否則只會執行一次,-e modify表示監聽的事件是modify(文件內容被修改),-r表示遞歸監聽,也要監聽子文件

腳本寫完了,但是它只是一個普通文件,我們需要賦予它執行權限: chomd +x update.sh

跑腳本:./xxx.sh,這樣會有問題,這不是後臺跑,我們一旦退出無法後臺執行,所以:./xxx.sh &後臺跑,還是有問題,shell腳本進程是shell終端進程的子進程,當shell終端關閉後,它的子進程就會關閉,所以腳本會停止,所以:nohup ./xxx.sh &,表示不中斷的跑在後臺,即是在後臺跑,也不會因爲關閉shell終端而中斷

那麼腳本跑起來了,當我們在本地電腦push代碼,服務器inotify會監聽到裸倉庫修改了,然後cd到代碼倉庫執行pull,代碼倉庫代碼就會更新了

6.3.代碼更新後自動reload,並且讓項目在後臺跑,而不是npm start一直跑在前臺

實現該步驟需要藉助pm2工具來實現,安裝:npm install pm2 -g

如果僅僅讓它跑在後臺,而不需要代碼更新後自動reload,可以:pm2 start bin/www

如果既要跑在後臺又要監聽代碼更新後自動reload,那麼我們需要配置文件,首先:pm2 ecosystem,生成配置文件config.js,然後修改:

module.exports = {
  apps : [{
    name: 'shopsystem-server-pms',
    script: './bin/www',    #主要是這裏,修改啓動項

    // Options reference: https://pm2.keymetrics.io/docs/usage/application-declaration/
    args: 'one two',
    instances: 1,
    autorestart: true,
    watch: false,
    watch_options: {
      "usePolling": true
    },
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }],

  deploy : {
    production : {
      user : 'node',
      host : '212.83.163.1',
      ref  : 'origin/master',
      repo : '[email protected]:repo.git',
      path : '/var/www/production',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
    }
  }
};

然後:pm2 start config.js

這樣便會自動監聽當前目錄下的所有文件夾和文件,一旦有更新會自動reload

需要了解pm2相關知識請至:https://pm2.keymetrics.io/docs/usage/application-declaration/

 

至此,項目的整個流程完成了

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