1. 程式人生 > >NodeJS+Express+MySQL開發小記(2):服務器部署

NodeJS+Express+MySQL開發小記(2):服務器部署

win ner 關閉 私有倉庫 aux ges his 發現 all

http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/

NodeJS+Express+MySQL開發小記(1)裏講過在本地搭建 NodeJS 網站的若幹細節。本人最近在阿裏雲服務器上面按最低配租了4個月的雲服務器,所以想試著把這個項目部署到雲上。雲服務器操作系統是Ubuntu 14.04 LTS。之前一直在Windows下做開發,對於Linux下的環境搭建、配置還不是很熟悉,搭建的過程中學到很多東西。

本文簡單記錄對服務器進行部署的一些細節方面與解決方案。

安裝MySQL Server

直接通過apt-get就可以:

1 sudo apt-get install mysql-server

安裝過程會提示 After this operation, 96.4 MB of additional disk space will be used.。MySQL的版本為Server version: 5.5.43-0ubuntu0.14.04.1 (Ubuntu)

安裝完成後,運行

1 mysql -u root -p

輸入密碼,即可進入MySQL的終端了。

用Git進行版本控制

出於跟風,以及提高技術的目的,毫不猶豫地選擇了Git而不是SVN來進行代碼版本控制。最初是使用Github來作為遠程服務器,用了大概兩個月,感覺對於開發這種業務性太強的項目(尤其要在代碼裏使用數據庫的),使用開源的Github倉庫來托管並不讓人放心。

後來發現了國內的業界良心 [email protected] ,其宣布永久開放git公有庫和私有庫。相關新聞:

  • [email protected] 歡迎你!
  • OSC 全面永久開放 git 公有庫和私有庫

此貨的功能與Github並無太大區別,考慮到私有倉庫的免費,便果斷遷移了過來。

用Git部署代碼

最開始是從Github上獲取代碼的:

1 2 3 4 cd /var mkdir www cd www git clone https://github.com/zilong-thu/d.git debate

以後如果代碼發生變動,可以這樣更新代碼:

1 2 cd debate git pull origin master

後來遠程代碼倉庫遷移到[email protected],那麽可以添加這個新的remote,命名為osc,然後以後就只從osc進行代碼獲取了。以後提交代碼,也就只往[email protected]提交,就一切OK了。

1 2 3 git remote add osc https://git.oschina.net/zilong-thu/d.git git pull osc master

如果要刪除Github那個remote,可以這樣:

1 git remote rm origin

使用SSH而非HTTPS

先生成一個SSH公鑰,方法:

  • Generating SSH keys | GithubHelp

註意,如果是 Windows &/8 + Git Bash 環境,那麽在將你的key添加到 ssh-agent 中時應該使用這個命令(參考 Stack Overflow : Could not open a connection to your authentication agent):

1 eval $(ssh-agent -s)

在用於開發的電腦上,修改本地代碼庫的remote url

1 git remote set-url origin [email protected]:USERNAME/OTHERREPOSITORY.git

參考

  • Changing a remote’s URL | GithubHelp

以及一個中文的 Pro Git:

  • 4.3 服務器上的 Git - 生成 SSH 公鑰

運行服務

安裝依賴

debate目錄下,安裝node模塊,執行

1 npm install

安裝好所有依賴後,如下啟動服務器:

1 npm start

使用阿裏雲給的IP加上端口號,即可訪問到開啟了的網站。

使NodeJS服務在後臺運行

目前是使用putty使用ssh遠程登錄來操作服務器的,如果關閉這個putty,即會話終止,則服務也隨即停止。解決思路自然是讓程序在後臺不間斷地運行。解決方案可以參考:

  • Linux 技巧:讓進程在後臺可靠運行的幾種方法 | IBM Developerworks

因此,在/var/www/debate目錄下新建一個shell腳本start.sh,內容為:

1 2 # Debate server start shell script nohup npm start &

&是為了讓程序能夠在後臺運行。這時候ctrl+c,或者關閉putty會話,就都不會殺死這個服務進程了。

用supervisor自動重啟服務

NodeJS代碼發生變化時,一般是必須重啟Node程序才可以生效的。每次手動重啟的話太麻煩,可以使用專為NodeJS打造的node-supervisor模塊來實現代碼變動時自動重啟,以及服務崩潰時自動重啟的功能。

其官網的描述是這樣的:

Node Supervisor is used to restart programs when they crash.
It can also be used to restart programs when a *.js file changes.

務必要全局安裝:

1 npm install -g supervisor

對於express 4.*版本,啟動服務時是這樣的:

1 npm start

它其實上會到package.json裏面尋找這個:

1 2 3 "scripts": { "start": "node ./bin/www" }

因此執行的實際上是node ./bin/www。那麽使用supervisor來代替npm start的話就應該是supervisor ./bin/www。因此,在shell腳本裏可以這樣寫:

1 nohup supervisor ./bin/www &

如此一來,當更新代碼時,就不必手動去重啟NodeJS服務了。

停止服務

使用kill

先列出所有進程,找到Node服務的進程ID,將其殺死,即可停止服務了。

1 2 3 4 5 6 ps aux root 11200 1.1 4.0 898452 20436 ? Sl Jun19 75:13 node /usr/local root 11387 0.0 15.4 923264 77080 ? Sl Jun19 0:03 node ./bin/www kill 11200

只要殺死node /usr/local開啟的進程,node ./bin/www進程也隨之死掉了。

###使用進程名+腳本來停止服務

端口

如果運行在未被占用的非80端口上,服務器一聲不吭就給開了。但是如果用80端口,可能要註意一下權限的問題。最近都是使用root用戶來開啟Node服務並運行於80端口上,沒有碰到什麽問題。

使用80端口後,訪問服務就不必加端口號了。

用shell實現自動化管理

NodeJS+Express+MySQL開發小記(2):服務器部署