NodeJS+Express+MySQL開發小記(2):服務器部署
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):服務器部署