雲服務遠程代碼同步與nodejs+PM2部署

#部署生產環境的基本條件node

1.獨立域名+域名備案webpack

2.雲服務器或可鏈接網路的自備服務器+配置服務器應用環境nginx

3.安裝數據庫git

4.項目遠程發佈與更新github

什麼一級域名?web

一級域名又稱爲頂級域名,你們須要注意的是, www.iisp.com這種形式的域名並非一級域名,他只是一個二級域名,也就是說www只是一個主機名。 真正的一級域名是由一個合法字符串+域名後綴組成。因此,iisp.com這種形式的域名纔是一級域名。iisp是域名主體,.com是域名後綴。能夠是.net域名後綴,也能夠是.hu域名後綴等。mongodb

什麼是二級域名?數據庫

所謂的二級域名實際上就是一個一級域名下面的主機名。顧名思義,他是在一級域名前面加上了一個字符串,好比asdx.iisp.com.,他能夠擁有根頂級域名一樣的功能。而且經過設置,能夠擁有和根頂級域名徹底同樣的功能。但這裏並非說一級域名和二級域名徹底沒有差異!apache

二級域名和頂級域名的差別:npm

*二級域名和一級域名仍是有很大的差別的,最簡單的差異就在於多使用二級域名的子網站,它自身的PR值每每要比一級域名低一個檔次。

二級域名,是依附一級域名的存在而存在的,也就是說要是頂級域名消失了,二級域名也也會不復存在。*

關於ssl證書 能夠不購買,能夠再服務器上經過工具來生成免費證書

關於雲主機 要選擇大廠商,防止倒閉和被收購;

選擇國內主機廠商,國內備案、鏈接速度和穩定性都很快;

1核1G 大約能夠承受1萬的用戶量

阿里雲主機默認會掛載一個系統盤,最好本身再掛載一個數據盤,這樣即便清空數據盤也不會影響主機的系統運行,不然一旦重裝系統,本身的應用就都沒有了。

ssh遠程登陸服務器

1.不要用root用戶去部署服務,要配置一個帳戶用於部署,防止root操做形成誤刪; 2.部署經常使用命令

  • ssh  用戶名@遠程ip地址       // ssh鏈接遠程服務
  • logout     // 退出登陸
  • .ssh ls       // 查看ssh下文件有多少曾經鏈接過的信息
  • 若是同一個ip的主機重裝系統或者換了,ssh鏈接會出現「 ECDSA host key for icarusyu.me has changed and you have requested strict checking. Host key verification failed.」這樣的錯誤,而沒法鏈接; because 在主機子系統每次成功ssh鏈接遠程操做,都會把你每一個你訪問過計算機的公鑰(public key)都記錄在主機的目錄/Users/icarus/.ssh/known_hosts下,當下次訪問相同子機服務器時,會覈對公鑰。若是公鑰不一樣,會發出警告,避免你受到DNS Hijack之類的攻擊。

解決方法: cd ~/.ssh        // 進入ssh記錄文件; 而後ls,查看鏈接過的ssh記錄, rm known_hosts刪除鏈接記錄,而後再執行ssh遠程鏈接便可。

  • service ssh restart    // 重啓ssh鏈接

  • fdisk -l     // 查看當前系統的盤信息

  • df -h        // 查看硬盤使用狀況

  • cmd+r    或者  ctrl+r      // 清除當前命令行面板

  • rm -rf A.txt    // 刪除A.txt文件

  • mv   A.txt  B.txt    // 在當前路徑下修改A.txt 文件名爲B.txt

  • ls    // 顯示當前文件下的文件

  • ls -a    // 表示all,顯示包括隱藏文件的全部文件

  • 最好不要用root權限去操做,咱們來增長一個具備權限限制的帳戶zzf(這個名字可本身隨意取): adduser    XXX(此處舉例輸入adduser  zzf,後面會以zzf這個帳號來操做),而後輸入或者不輸入 Full Name []:、    Room Number []: 等信息即建立成功

  • 而後咱們須要給該用戶分配權限 gpasswd   -a  zzf  sudo      // 給zzf帳戶分配到sudo組中 sudo visudo      // 打開配置用戶權限的文件進行編輯,編輯以下,在User privilege specification配置zzf的權限

上圖中:%admin All=(All)  All   表示admin帳戶的權限也是最高的 ctrl+x    // 保存文件 shift+y    // 確認保存便可

經過配置密鑰實現ssh無密碼登陸

cd ~/.ssh        // 進入ssh記錄文件       而後ls,查看鏈接過的ssh記錄(若是沒有.ssh文件夾,就要mkdir .ssh新建該文件夾)
 * ssh-keygen -t rsa -b 4096 -C "2441150413@qq.com"        // 生成公鑰和私鑰(此處不用輸入密碼,直接屢次回車默認就好,而後就會在.ssh文件夾下生成➜id_rsa和  id_rsa.pub兩個文件) id_rsa    私鑰
 id_rsa.pub   公鑰

  • cat id-rsa    // 查看私鑰信息
  • cat id-rsa.pub    // 查看公鑰信息
  • eval "$(ssh-agent -s)"         // 開啓ssh代理 cd ./ssh
  • ssh-add ~/.ssh/id_rsa        // 將私鑰加入代理

而後再在服務器上一樣執行如下操做:
ssh-keygen -t rsa -b 4096 -C "2441150413@qq.com"   eval "$(ssh-agent -s)"

  • ssh-add ~/.ssh/id_rsa      
    cd ./ssh  查看如下是否生成公鑰和私鑰文件
  • ssh-add ~/.ssh/id_rsa     
    而後仍是在服務器執行如下:  
    vi  authorized_keys      // 新建受權文件
     shift+:   wq!   enter    // 退出編輯

下一步本地和服務器配對:
本地操做:
cat  id_rsa.pub       // 複製公鑰
而後複製其所有內容
服務器操做:
vi  authorized_keys
i     // 在vi編輯狀態下開始insert
粘貼剛纔複製的內容,而後esc
shift+:   wq!   enter

  • 而後如今就能夠在本地試一下ssh鏈接,就會發現不須要輸入密碼就能夠鏈接了!

修改遠程鏈接默認端口(默認爲22)

sudo vi /etc/ssh/sshd_config

  • vi編輯快捷鍵
    ctrl+A    移動到行首
    ctrl+E    移動到行尾

新開一個tab,鏈接ssh,防止修改配置文件以後沒法鏈接,因此保留當前窗口
下面開始修改文件內容配置:
Port  22    改成-》9999
USeDNS   no
末尾加一行  AllowUsers   zzf     
保存退出以後重啓ssh      sudo  service ssh  resatrt
阿里雲鬚要添加安全組配置,以下圖把9999端口配置進去

新開一個ssh窗口執行ssh鏈接便可
ssh -p 9999 zzf@47.102.204.126

###關閉服務器root密碼登陸,安全更高一步 sudo vi /etc/ssh/sshd_config
將該文件中PermitRootLogin  no
而後退出保存,重啓ssh
而後能夠試試用root來登陸,就會發現

防火牆iptables和Fail2Ban配置

Fail2Ban是根據系統日誌做出相應的動做的防護性工具

安全設置還能夠將內網服務器的ip和跳板機ip綁定,只容許跳板機鏈接; 經過本地機器鏈接跳板機,經過跳板機去鏈接真是服務器

#搭建nodejs的生產環境 1.安裝vim open ssl build-essential libssl-dev wget curl git這一堆工具
sudo apt-get upgrade    // 更新apt的包
sudo apt-get install  vim open ssl build-essential libssl-dev wget curl git 
回車安裝
2.安裝nvm 在github上找到nvm,而後找到相應的腳本執行安裝

To install or update nvm, you can use the install script using cURL:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
or Wget:

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh
| bash
複製代碼

而後從新打開一個ssh窗口
nvm   回車就能夠看到nvm的許多命令,表示安裝完成
nvm install node  或者直接輸入版本號   nvm  install   v6.9.5
可選:能夠將npm源改成taobao鏡像;也可安裝cnpm(可是通常建議使用npm優先)
npm get registry   // 查看當前npm源
pm --registry=https://registry.npm.taobao.org install -g npm    // 配置npm源爲淘寶鏡像
pm --registry=https://registry.npm.taobao.org install -g cnpm    // 安裝cnpm nvm use v6.9.5   // 指定當前使用node版本
nvm alias default v6.9.5    // 指定默認node版本
node -v    能夠查看node版本
// gulp的watch須要監聽不少文件的改動,可是fedora、ubuntu系統的文件句柄實際上是有限制的,所以可使用如下命令設置句柄數量
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

// 安裝相關工具 npm i pm2 webpack -g
測試是否可使用
sudo vi app.js   // 新建app.js文件
填入如下代碼:

const http = require('http')

http.createServer(function(req, res){
        res.writeHead(200, { 'Content-Type': 'text/plain'})
        res.end('zzf node test')
}).listen(8081)

console.log('server running on port 8081')
複製代碼

// 而後保存退出,執行app.js node app.js

// 端口開發根據本身項目須要,配置防火牆iptables

我目前使用的阿里雲只須要配置安全組便可,以下:

// 輸入雲服務  http://47.102.204.126:8081 能夠查看到輸出的內容以下:

這樣咱們就實現了終端開啓服務,終端退出就不可以使用了;
因此須要將服務註冊到後臺,並能夠支持自啓動

##PM2配置啓動服務
在app.js所在目錄,執行pm2 start app.js 便可啓動

pm2 list     // 列出當前全部node服務
pm2  show   0     // 查看id爲0的node服務詳情
pm2 logs     // 查看當前pm2的日誌

nginx 配置與使用,使外網可80端口訪問

nginx配置80端口代理到對應端口服務
檢測是否安裝了apache佔用80端口
sudo service apache2 stop
apache2: unrecognized service     // 說明未安裝apache
// 若是有,則執行如下倆行語句移除apache
update-rc.d -f apache2 remove    
sudo apt-get remove apache2    
// 而後刷新apt-get
sudo apt-get update    
1.安裝nginx
sudo apt-get install nginx    
nginx -v    // 查看nginx版本
和上面同樣配置阿里雲安全組80端口

配置nginx:
cd /etc/nginx/
 cd conf.d/
sudo vi  imooc-com-8081.conf     // 新建用於imooc.com站點的配置文件(要學習規範一點文件命名),以下:

upstream imooc {
        server 127.0.0.1:8081;
}

server {
        listen  80;
        server_name  localhost;

        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-nginx-Proxy true;

                proxy_pass http://imooc;
                proxy_redirect off;
        }
}
複製代碼

cd ..
檢查nginx.conf   文件的 include /etc/nginx/conf.d/*.conf;是否正確(這裏表示將全部etc/nginx/conf.d文件夾下的全部配置文件都include進nginx的配置文件中)

# Virtual Host Configs         ##

include /etc/nginx/conf.d/.conf;         include /etc/nginx/sites-enabled/;

sudo nginx -t     // 檢測nginx的配置是否正確,出現下面的success表示成功
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

sudo nginx -s reload   // 重啓nginx
瀏覽器輸入   http://47.102.204.126:80   便可訪問當以前咱們定義的那個服務了。 固然若是配置了域名解析的化也是能夠訪問的。

此時咱們查看控制檯的網絡能夠看到,Response Headers 中Server:nginx/1.4.6(Ubuntu);那麼這個nginx版本和系統信息怎麼隱藏呢?

使用vim  編輯nginx.conf   修改 server_tokens off;
重啓動nginx  便可

-----------------------------------------------------------

#域名解析DNSPod 一個域名只能有一個ip,可是一個ip地址能夠對應多個域名;

配置二級域名
登陸www.dnspod.cn網站,點擊域名解析,執行添加操做

配置結果爲:

此時咱們的二級域名就配置好了,訪問的時候就分別是
movie.iamfane.club
wechat.iamfane.club
www.iamfane.club
他們都指向47.102.204.126  這臺服務器,咱們會在服務器上根據請求的域名來解析到對應的服務。
此時能夠ping  上面的域名,會發現返回的是咱們配置的服務器ip

#服務器安裝mongodb
注意此處必定要注意安裝的mongodb對應服務器的操做系統類型和版本,咱們用的阿里雲服務器爲ubautu14.04的,下面的命令也要對應ubautu14.04

安裝公鑰
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
增長源
echo "deb repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
更新列表
sudo apt-get update
安裝
sudo apt-get install -y mongodb-org
這一步通常都會比較慢,是由於mongodb的源http://repo.mongodb.org比較慢,咱們能夠將安裝請求的安裝源更改成阿里雲鏡像地址(mirrors.aliyun.com/mongodb/);
cd /etc/apt/sources.list.d/
udo vi mongodb-org-3.2.list        // 編輯文件
將deb  repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse 改成deb  mirrors.aliyun.com/mongodb/apt… trusty/mongodb-org/3.2 multiverse

sudo apt-get update
sudo apt-get install -y mongodb-org
開啓mongodb
sudo service  mongod  start
查看momgo的日誌文件
cat /var/log/mongodb/mongod.log
直接執行mongo    回車
若是此處鏈接失敗,則有可能服務器的27017端口未開放,則須要在防火牆配置端口 在防火牆iptables文件中插入如下代碼:

並重載防火牆 sudo iptabls-restore < /etc/iptables.up.rules
再次執行mongo    回車,若此時結果報錯:Failed global initialization: BadValue: Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.
大概意思是:全局初始化失敗,無效或沒有用戶區域設置。請確保環境變量設置正確 解決辦法只須要一行命令:
export LC_ALL=C (去除全部本地化的設置,讓命令能正確執行)
而後執行mongo就行了。

修改mongodb的默認端口(本文將默認的27017改成19999)

默認端口每每不夠安全,因此咱們儘可能修改端口

編輯mongod.conf 文件 
sudo vi /etc/mongod.conf 找到下面代碼修改端口   port: 27017    --------->  此處改成19999
  bindIp: 127.0.0.1
重啓mongo:   sudo service mongod restart
執行   mongo --port 19999     便可鏈接成功。

mongodb 數據庫本地遷移到服務器

1.整個庫打包遷移
先導出備份好本地文件(indust-app爲mongodb數據庫的名稱,indust-app-backup爲導出後的文件名稱)
mongodump -h 127.0.0.1:27017   -d  indust-app  -o   indust-app-backup
導出後的mongodb數據庫信息以下:

本地將數據庫打包成tar包(indust-app.tar.gz ) 
tar  zcvf indust-app.tar.gz  indust-app-backup
使用scp命令去把本地的數據庫文件上傳到服務器要存儲數據庫的地址
scp  -P  9999 ./ indust-app.tar.gz  zzf@40.102.204.126:/home/zzf/dbbackup/ 
9999爲遠程ssh鏈接的端口號,
./ indust-app.tar.gz爲當前要上傳的文件,
zzf@40.102.204.126爲ssh鏈接的用戶名和ip地址,
/home/zzf/dbbackup/ 爲文件導入後存儲的位置(若是沒有就先建好該文件夾)
解壓上傳的tar文件,獲得 indust-app文件夾就是數據庫的信息
tar  vxf  indust-app.tar.gz
 將上傳的 indust-app數據庫restore到mongodb中
mongorestore  --host  127.0.0.1:9999  -d   indust-app   ./dbbackup/indust-app
檢查是否導入成功
mongo --port 9999
 use   indust-app
show tables
db.creations.find({})     
就能夠看到creations數據表裏面的數據是否正確了。

2.mongodb查詢結果保存爲json,並單表導入
查詢users表中name不爲null的用戶信息並保存到movie-users.json
mongoexport  -d  imooc-movie  -c  users  -q  '{"name": { $ne:null}}'  -o  ./movie-users.json
也能夠將導出的文件上傳到遠程服務器,操做方式和上面相似,而後將數據導入到服務器的users表中,相關方法能夠本身查詢

3.刪除數據庫imooc-moive
mongo  --host 127.0.0.1:9999  imooc-moive  -eval   "db.dropdatabase()"

4.數據庫配置管理員和數據權限
·mogodb是沒有默認的管理員帳號的,因此要先添加管理員帳號,而後再開啓權限認證
 ·只有切換到admin這個數據庫,添加的帳號纔是管理員帳號, 
· 用戶只能在用戶所在數據庫來登陸,admin也是如此;
·管理員能夠管理全部數據庫,可是不能直接管理數據庫,要到admin中認證才能夠

下面來操做一把:
mongo --port 9999
use admin
// imooc_cases_owner對全部數據庫有間接的操做權限
db.createUser({user: 'imooc_cases_owner', pwd: 'Safe124',roles: [{role: 'userAdminAnyDatabase', db:'admin'}]}) ​
執行以後獲得success相關信息即爲添加成功。
用戶受權
db.auth('imooc_cases_owner', 'Safe1
24$')
返回1 ,表示受權成功

單獨數據庫的用戶受權
use imooc-movie // 切換到imooc-movie數據庫下 // imooc_movie_runner用戶能夠對 imooc-movie數據庫有讀寫權限
db.createUser({user: 'imooc_movie_runner', pwd: 'F@3127&',roles: [{role: 'readWrite', db:'imooc-movie'}]})
// 對數據庫建立一個備份角色,只讀不可寫
db.createUser({user: 'imooc_movie_reader', pwd: 'Fa
(*27&$',roles: [{role: 'read', db:'imooc-movie'}]})
可是如今尚未放開認證模式,下面來開啓
sudo  vi  /etc/mongod.conf     // 修改配置文件
修改結果以下圖:

而後重啓mongo數據庫: sudo  service  mongod  restart
而後執行
use admin 
db.auth('imooc_cases_owner', 'Safe1*24$') 而後才能夠執行相關查詢和數據操做

也能夠直接進入某個數據庫
mongo  127.0.0.1:9999/imooc-movie  -u  imooc-movie-runner  -p  '這裏寫密碼' 成功便可執行相關操做,
例如:show  tables  
還有數據庫的遷移和單表遷移也是經常使用的指令,你們在使用到以後能夠自行查閱嘗試

數據庫的定時備份

咱們能夠經過腳本文件執行來達到定時屢次備份數據庫的任務,腳本內容以下:

腳本執行

  • sudo  sh  ./tasks/movie.backup.sh 若是能夠執行成功,咱們就把它添加到系統的定時任務中
  • cd  到根目錄
  • crontab  -e     // 會打開nano編輯器來編輯文件 按照某個時間規則執行某個腳本任務,配置代碼以下(天天凌晨13分執行一次)

有時咱們還須要將備份的數據庫文件定時上傳到備份服務器上(此處以上傳到七牛雲對象存儲爲例),這個服務咱們能夠用nodejs來實現  這部分代碼七牛雲提供了相關實現方式,

末尾添加如下代碼來傳輸

對上面的代碼進行參數解析:

也可將上面的任務配置成定時任務便可

Tips:若是有多個數據庫,最好每一個數據庫單獨配置一個備份腳本,而不是一次性寫在一個腳本中,這樣防止一個出問題都出問題。

向遠程服務器部署和發佈上線

  1. git倉庫新建私有項目;
  2. git代碼同步到遠程git倉庫;能夠配置全局git的用戶密碼
  3. 配置倉庫密鑰、本地密鑰和服務器密鑰配對
  • 在git工廠新建部署公鑰,而後把本地的.ssh/id_rsa.pub的內容所有複製粘貼到目錄中
  • 本地也一樣執行這個操做:

而後將本地代碼上傳到倉庫

  1. 遠程服務器也去git倉庫clone最新代碼; 服務器安裝git  :  sudo apt-get install git 服務器clone最新代碼下來:

  2. PM2 (pm2.io/doc/en/runt…) 配置自動更新代碼:本地項目配置部署的json配置文件;記得要將這個配置文件經過git上傳到遠程倉庫

module.exports = {
  apps: [{
    name: "app",
    script: "app.js"
  }],
  deploy: {
    // "production" is the environment name
    production: {
      // SSH key path, default to $HOME/.ssh
      key: "/path/to/some.pem",
      // SSH user
      user: "ubuntu",
      // SSH host and port
      host: ["192.168.0.13"],
      port: 9999,
      // SSH options with no command-line flag, see 'man ssh'
      // can be either a single string or an array of strings
      ssh_options: "StrictHostKeyChecking=no",
      // GIT remote/branch
      ref: "origin/master",
      // GIT remote(遠程git倉庫地址)
      repo: "git@github.com:Username/repository.git",
      // path in the server(部署到服務器的位置)
      path: "/var/www/my-repository",
      // Pre-setup command or path to a script on your local machine
      pre-setup: "apt-get install git ; ls -la",
      // Post-setup commands or path to a script on the host machine
      // eg: placing configurations in the shared dir etc
      post-setup: "ls -la",
      // pre-deploy action
      pre-deploy-local: "echo 'This is a local executed command'",
      // post-deploy action
      post-deploy: "npm install",
    },
  }
}
複製代碼

上面具體配置請參考PM2網站自行編輯。

5.本地使用 pm2  deploy xxx.json production setup , 觸發遠程更新代碼並按照上述配置文件建立相應的文件夾, 而後去服務器的/var/www/my-repository下查看文件是否下載成功。 啓動服務器上的項目:

  • pm2  deploy xxx.json production     // 這時通常會爆出錯誤,應爲pm2在服務器上不存在 在服務器根目錄執行如下操做:
  • vi   .bashrc     // 編輯這個文件 將下面幾行代碼註釋掉,防止他提早返回:

  • source  .bashrc
  • pm2  deploy xxx.json production    便可看到pm2的啓動結果。

若是上面本地的pm2配置文件寫錯,也會報錯,須要注意!!! 修改文件夾相對當前用戶的讀寫權限:sudo  chmod  777  xxx   (該用戶對xxx文件夾具備讀寫權限)

  • pm2 list  能夠查看當前跑的服務 ##nginx配置請求轉發

git簡易的命令行入門教程:

Git 全局設置:

  • git config --global user.name "臨山"
  • git config --global user.email "zhengfeizhang@sina.com"

建立 git 倉庫:

  • mkdir iot
  • cd iot
  • git init
  • touch README.md
  • git add README.md
  • git commit -m "first commit"
  • git remote add origin gitee.com/zhengfeizha…
  • git push -u origin master

已有倉庫?

  • cd existing_git_repo
  • git remote add origin gitee.com/zhengfeizha…
  • git push -u origin master
  • 代碼版本落後須要
  • git  fetch
  • git  merge  origin/master            // 合併代碼
相關文章
相關標籤/搜索