前一段時間,是經過百度雲的BAE部署本身的Node應用的,不過隨着應用的不斷開發,BAE的限制不斷制約了應用的使用。因而着手將應用遷移到阿里雲的ECS上去。本文便是介紹瞭如何在ECS上搭建Node環境,並將本地製做好的應用進行發佈。node
本地: Mac OSX 10.11.4,應用採用的技術:Node.js + Express.jsgit
遠端服務器:阿里雲ECS(1核CPU、1GB內存),IP:123.57.205.23,系統爲CentOS7.0github
Github:帳戶名:e10101web
服務器部署Node的應用,並在3000端口進行監聽。本地代碼開發測試後,更新到Github私人倉庫。而後經過pm2部署遠程服務器。npm
擬安裝以下應用:Node、npm、pm2。
經過預留的帳號密碼登陸系統,終端中輸入:json
ssh root@123.57.205.23
更新軟件:ubuntu
yum update -y
更新完畢後,安裝Node.js:centos
yum install nodejs -y
安裝Npm:數組
yum install yum -y
安裝pm2:瀏覽器
npm install pm2 -g
爲服務器安全起見,建立用戶(用戶名:yishi):
useradd yishi
設置密碼:
passwd yishi
添加sudo權限:
usermod -aG wheel yishi
爲服務器安全起見,關閉root帳戶的遠程訪問。
打開配置文件:
vi /etc/ssh/sshd_config
找到以下設置,並修改yes爲no:
PermitRootLogin no
保存文件後,重啓sshd服務:
service sshd restart
退出root帳戶,並使用新建立用戶訪問。
Macbook中,因爲已經具有了node以及npm,再次不介紹如何安裝上述兩個軟件了。與服務器端相似,經過以下命令安裝pm2:
npm install pm2 -g
若是可獲得版本號,則說明安裝成功:
pm2 -v
此處爲方便演示,咱們在Github上新建一個私人(private)倉庫,名爲pm2app。
倉庫建立後,還須要設置Deploy keys,依次點擊Settings > Deploy keys > Add deploy key。其中的Key部分,能夠在服務器端上經過ssh-keygen生成,並經過
cat ~/.ssh/id_rsa.pub
便可輸出。輸出後,複製到deploy key中點擊Add key,完成設置。
完成上述設置後,須要本地的應用代碼關聯此Github倉庫,按照Github官網的介紹,經過在本地應用下執行:
git remote add origin https://github.com/e10101/pm2app.git git push -u origin master
來完成設置。
在本地的目標應用下,輸入:
pm2 ecosystem
生成pm2的部署配置模板文件以下:
/** * Application configuration section * PM2 - Application Declaration */ apps : [ // First application { name : "API", script : "app.js", env: { COMMON_VARIABLE: "true" }, env_production : { NODE_ENV: "production" } }, // Second application { name : "WEB", script : "web.js" } ], /** * Deployment section * PM2 - Deployment */ deploy : { production : { user : "node", host : "212.83.163.1", ref : "origin/master", repo : "git@github.com:repo.git", path : "/var/www/production", "post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production" }, dev : { user : "node", host : "212.83.163.1", ref : "origin/master", repo : "git@github.com:repo.git", path : "/var/www/development", "post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env dev", env : { NODE_ENV: "dev" } } } }
應爲目前咱們僅部署一個應用,所以,先把沒必要要的信息刪除,即刪除apps部分的第二項。同時把咱們的目標文件改成你應用的入口文件,此處修改成Express.js的默認設置,即:
script : "./bin/www",
apps部分就設置完畢了,而後再設置deploy部分。其中production用於生產環境,dev用於開發環境,爲了演示,咱們只設置production部分。
下面依次介紹各個設置:
production : { user : "登陸遠程服務器的用戶名,此處填寫咱們建立的yishi", host : "遠程服務器的IP或hostname,此處能夠是數組同步部署多個服務器,不過鑑於咱們只有一個服務器,所以咱們填寫123.57.205.23", ref : "遠端名稱及分支名,此處填寫origin/master", repo : "git倉庫地址,此處填寫git@github.com:e10101/pm2app.git", path : "遠程服務器部署目錄,須要填寫user具有寫入權限的目錄,此處填寫/home/yishi/www/production", "post-deploy" : "部署後須要執行的命令,此處填寫npm install && pm2 startOrRestart ecosystem.json --env production" },
整理後,按照咱們的設置,應爲:
production: { user: "yishi", host: "123.57.205.23", ref: "origin/master", repo: "git@github.com:e10101/pm2app.git", path: "/home/yishi/www/production", "post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production" },
由於pm2的部署是經過ssh進行的,所以須要開通本地到遠程服務器的無密碼登陸,一樣,在Mac下,經過ssh-keygen生成RSA公鑰,並拷貝到遠程服務器:
scp ~/.ssh/id_rsa.pub yishi@123.57.205.23:/home/yishi/.ssh/authorized_keys
上述命令中的yishi爲用戶名,執行時須要替換爲你設置的用戶名。
設置ssh完畢後,再看看整理完畢的ecosystem配置文件,以下:
{ /** * Application configuration section * PM2 - Application Declaration */ apps : [ // First application { name : "pm2app", script : "./bin/www", env: { COMMON_VARIABLE: "true" }, env_production : { NODE_ENV: "production" } } ], /** * Deployment section * PM2 - Deployment */ deploy : { production : { user: "yishi", host: "123.57.205.23", ref: "origin/master", repo: "git@github.com:e10101/pm2app.git", path: "/home/yishi/www/production", "post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production" } } }
在本地應用目錄下,執行pm2 deploy命令:
pm2 deploy ecosystem.json production setup
提示錯誤:
Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. failed to clone Deploy failed
此時主要是在遠程服務器中,並未將http://github.com加入known_hosts,在服務器端經過以下命令設置:
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
在本地繼續執行部署命令:
pm2 deploy ecosystem.json production setup
此時,如無其餘問題,輸出應提示:
○ setup complete --> Success
至此,pm2的部署設置完畢。
pm2的部署設置完畢後,接下來就是實際部署了。
在部署前,現將本地代碼修改並進行git提交:
git add . git commit -m "update ecosystem" git push
提交後,在本地應用目錄,輸入以下命令進行生產環境的部署:
pm2 deploy ecosystem.json production
能夠看到以下輸出:
[PM2][WARN] Applications pm2app not running, starting... [PM2] App [pm2app] launched (1 instances) ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │ ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤ │ pm2app │ 0 │ fork │ 1028 │ online │ 0 │ 0s │ 11.246 MB │ disabled │ └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app ○ hook test ○ successfully deployed origin/master --> Success
部署成功,在遠程服務器查看端口狀況:
netstat -antp
能夠看到應用默認部署的3000端口已經開放了。經過瀏覽器打開:
http://123.57.205.23:3000/
能夠看到部署的Web應用能夠訪問了。(若是netstat -antp中可見3000端口可訪問,能夠檢查下ECS的防火牆設置,確保3000端口對外開放)
應用列表:
pm2 list
應用信息(查看應用編號爲0的信息):
pm2 show 0
開啓啓動設置,此處是CentOS系統,其餘系統替換最後一個選項(可選項:ubuntu, centos, redhat, gentoo, systemd, darwin, amazon):
pm2 startup centos
而後按照提示須要輸入的命令進行輸入:
sudo su -c "env PATH=$PATH:/usr/bin pm2 startup centos -u yishi --hp /home/yishi"
保存pm2設置
pm2 save
如今從新啓動系統,測試是否能夠開機啓動:
sudo reboot
等系統重啓後,經過瀏覽器檢查系統是否自動啓動:
http://123.57.205.23:3000/
若是啓動正常,說明設置成功!
以上就是如何經過pm2部署Node應用到服務器生成環境的總結。
參考部分包含了一些先關連接,詳見個人知乎專欄此:
做者:郭一實
連接:https://zhuanlan.zhihu.com/p/20940096來源:知乎