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倉庫來托管並不讓人放心。
后來發現了國內的業界良心 Git@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
|
后來遠程代碼倉庫遷移到git@osc,那么可以添加這個新的remote,命名為osc,然后以后就只從osc進行代碼獲取了。以后提交代碼,也就只往git@osc提交,就一切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公鑰,方法:
注意,如果是 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 git@github.com:USERNAME/OTHERREPOSITORY.git
|
參考
以及一個中文的 Pro Git:
運行服務
安裝依賴
在debate
目錄下,安裝node模塊,執行
1
|
npm install
|
安裝好所有依賴后,如下啟動服務器:
1
|
npm start
|
使用阿里雲給的IP加上端口號,即可訪問到開啟了的網站。
使NodeJS服務在后台運行
目前是使用putty使用ssh遠程登錄來操作服務器的,如果關閉這個putty,即會話終止,則服務也隨即停止。解決思路自然是讓程序在后台不間斷地運行。解決方案可以參考:
因此,在/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端口后,訪問服務就不必加端口號了。