搭建線上環(huán)境需要做什么芳悲?
1、購買域名边坤。
2名扛、購買服務(wù)器(就是一臺帶外網(wǎng)ip的虛擬電腦)。
3茧痒、配置服務(wù)器應(yīng)用環(huán)境(用戶權(quán)限罢洲、無密碼登錄、nodeJs應(yīng)用的環(huán)境文黎、必備依賴包惹苗、組件的安裝和搭建、端口的轉(zhuǎn)發(fā)耸峭、SSL證書的生產(chǎn)和配置桩蓉、nginx的安裝和配置、防火墻本地數(shù)據(jù)庫自動備份的機制)
4劳闹、安裝配置數(shù)據(jù)庫(如果不用成本較高的云數(shù)據(jù)庫院究,服務(wù)器的本地數(shù)據(jù)庫涉及到數(shù)據(jù)庫角色洽瞬,讀寫權(quán)限,自動備份機制)
5业汰、通過網(wǎng)絡(luò)提供商的資源及平臺對域名進行備案伙窃,接受監(jiān)管。如果想用短信服務(wù)样漆,郵件服務(wù)或者基于微信公眾號小程序的服務(wù)那么備案是逃不過去的为障,如果在國外生活并且不使用上述的服務(wù),那么可以不備案放祟。
6鳍怨、項目遠程部署發(fā)布與更新(可以粗暴的把本地項目拷貝上傳到服務(wù)器中啟動,但是這樣比較低效,而且容易出錯,現(xiàn)在可以選擇使用私密git倉庫這種平臺來把代碼自動部署到線上,在線上進行服務(wù)的重啟,讓整個過程自動化傻瓜化,來解決效率的問題)
總結(jié):搞定上述幾大塊,就是具備有一定運維能力的工程師了跪妥,距離一個合格的運維工程師還是差很遠很遠鞋喇。
域名選購經(jīng)驗:
平臺選擇:www.22.cn愛名網(wǎng)或者阿里云(服務(wù)器配套域名,域名備案更方便一點)或者goDaddy(在國外注冊域名,很難講以后國內(nèi)服務(wù)器部署上線是否會阻撓)。
域名選擇:全英文>全數(shù)字>拼音+數(shù)字眉撵。域名越短越好侦香,越好記越好。域名后綴不要選擇太個性話后綴纽疟,不太穩(wěn)定鄙皇,備案時可能會遇到小困難。.cn .cc .net都行仰挣。
阿里云域名備案:
個人:身份證
單位:單位證件、單位備案負責(zé)人證件(電子版照片)
首次備案和再次備案:從未備案過就是首次備案缠沈,首次備案膘壶,備案的域名是不允許線上訪問的,也就是在備案前域名不能投入使用洲愤,備案期間要關(guān)閉掉服務(wù)颓芭。再次備案,不受限制柬赐,但是需要網(wǎng)站內(nèi)容和備案主體符合亡问。接入備案,在阿里云備案系統(tǒng)中提交接入申請-初審 7小時左右網(wǎng)站就可以正常訪問肛宋,僅限使用在ECS或虛擬主機上州藕,如果審核失敗,需要根據(jù)失敗原因進行修改酝陈,之后再次提交床玻。
服務(wù)器選擇:
服務(wù)器廠商選擇:盡量選擇大廠商或者知名廠商的主機(阿里云ECS、亞馬遜AWS沉帮、Linode锈死、DigitOcean/Heroku贫堰、以及勉強入圍青云/Ucloud/百度云),不要圖便宜待牵。盡量選擇國內(nèi)主機其屏,備案和審核通過快,遠程操作快缨该。
評判服務(wù)器配置是否滿足業(yè)務(wù)需求:1核1G可以對外提供2-3w請求量(幾百人到上千人沒問題)偎行,面對上萬人數(shù)的話可以選擇2核4g,人數(shù)再多的話可以買多臺的服務(wù)器压彭,做負載均衡睦优。
IP:如果我們有好多臺內(nèi)網(wǎng)阿里云主機的話,可以通過阿里云內(nèi)網(wǎng)ip互相訪問壮不,速度非澈古蹋快。外網(wǎng)ip是給客戶用的询一。
ssh遠程登錄服務(wù)器:
第一次登錄: ssh root@ip隐孽,會說是否把服務(wù)器指紋加入到本地信任列表中。
如果購買時購買了數(shù)據(jù)盤(可以用fdisk -l來查看數(shù)據(jù)盤情況,? df -h 來查看硬盤使用情況)健蕊,這個數(shù)據(jù)盤需要額外的掛載菱阵,如果沒有買數(shù)據(jù)盤,阿里云服務(wù)器默認(rèn)給我們掛載了一個硬盤40G缩功,這個硬盤用來安裝操作系統(tǒng)晴及,如果我們把網(wǎng)站系統(tǒng)跑在這個硬盤上,也是可以的嫡锌,但是一旦重裝系統(tǒng)后所有網(wǎng)站數(shù)據(jù)都會丟失虑稼。如果我們掛載了自己買的數(shù)據(jù)盤的話,是不用擔(dān)心這個問題的势木。
如果買服務(wù)器時未買數(shù)據(jù)盤蛛倦,購買數(shù)據(jù)盤:https://help.aliyun.com/document_detail/25445.html?spm=a2c4g.11186623.6.676.4af21846NK4gOS
掛載數(shù)據(jù)盤:https://help.aliyun.com/document_detail/25446.html?spm=a2c4g.11186623.6.679.5d8a6a07Qc9zak
掛載后,數(shù)據(jù)盤格式化:https://help.aliyun.com/document_detail/25426.html?spm=a2c4e.11153987.0.0.59df779d57PtYP
若嫌輸入root@47.99.236.175麻煩啦桌,可以通過~下的.zshrc(前提下載過zsh命令工具)配置軟連接:cd 溯壶。subl .zshrc 編輯,增加一行 alias ssh_star="ssh root@xxx.xx.xx"甫男。保存且改。source .zshrc重新載入一下。輸入ssh_star就會自動調(diào)用ssh root@xxx.xx.xx板驳。但若我們有幾個服務(wù)器要登錄管理钾虐,輸密碼也很麻煩,后面會介紹通過私鑰認(rèn)證方式無密碼登錄笋庄。
開發(fā)項目需要安裝的基本工具包
1效扫、sudo apt-get install git vim openssl build-essential lib ssh-dev wget curl
2倔监、安裝nvm(全系統(tǒng)級的切換node.js版本,綠色菌仁,安全浩习,尤其在緊急升級項目所倚賴的版本時候,無副作用):
注意:如果安裝成功但執(zhí)行nvm ls報錯济丘,nvm: command not found谱秽。
1、進入nvm安裝到文件目錄摹迷,cd?~/.nvm疟赊。2、查看目錄下文件列表峡碉。3近哟、若無.bash_profile文件,則創(chuàng)建該文件:3.1 touch .bash_profile鲫寄。3.2 vi .bash_profile吉执。3.3將下部分文件粘貼至.bash_profile文件。export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"? # This loads nvm地来。(此語句是配置文件戳玫,與自己電腦有關(guān),若不知道未斑,可運行如下命令咕宿,會提示這段語句,curl-o-https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh| bash)蜡秽。3.4保存文件府阀,關(guān)閉此文件。3.5更新剛配置的環(huán)境變亮载城,source .bash_profile。4费就、輸入nvm命令,驗證是否成功。
nvm基本使用:1廉涕、nvm install v10.15.1下載特定nodeJS版本雀哨。2、切換當(dāng)前使用的node版本vm use v10.15.1眠蚂。設(shè)置使用的默認(rèn)node版本煞聪,nvm alias default v10.15.1。
配置root及應(yīng)用帳號權(quán)限:
root權(quán)限是最高權(quán)限逝慧,我們希望增加幾個有各自權(quán)限的賬戶
創(chuàng)建新帳號:adduser xxx(用戶名) 創(chuàng)建用戶名(別忘記)昔脯,接下來會讓你設(shè)置 輸入密碼(別忘記)和一些個人信息(可不填)啄糙。
刪除賬號:userdel xxx(用戶名)。
查看所有的用戶信息:
新賬號權(quán)限賦予第一步:gpasswd -a xxx(賬戶名) sudo云稚,把xxx加入具有sudo權(quán)限的隊列中(此時,該賬戶在sudo隊列中)隧饼。
新賬號權(quán)限賦予第二步:sudo visudo,我們需要找到User privilege(權(quán)限) specification(規(guī)范)静陈,它下面root ALL=(ALL:ALL) ALL再添加一行燕雁,xxx?ALL(該規(guī)范對所有sudo生效)=(ALL(xxx可以以任何用戶來執(zhí)行命令):ALL(xxx可以以任何組來執(zhí)行命令)) ALL(規(guī)則適用于所有命令),一句話鲸拥,xxx只要用sudo 就可以運行任何root能運行的命令拐格。
保存:control+x,之后shift+y 刑赶,回車捏浊,保存完畢。
測試:現(xiàn)在ssh xxx@ip 去登錄遠程服務(wù)器看看角撞。
問題:1呛伴、如果登不上,可以先用root登錄谒所,然后執(zhí)行service ssh restart重啟一下热康,再去登錄。
配置SSH無密碼登錄:
無密碼登錄原理:本地有一個私鑰劣领,通過私鑰生成公鑰傳到服務(wù)器姐军,服務(wù)器通過密鑰算法對比,對比成功則登錄成功尖淘。
查看本地私鑰是否存在:找到cd .ssh文件并進入(ls -a可以找到隱藏文件)奕锌,看到有id_rsa.pub(公鑰)、id_rsa(私鑰)村生、known_hosts(把id加入信譽列表)惊暴。如果沒有呢,新建(mkdir)一個.ssh文件趁桃,然后在外面執(zhí)行ssh-keygen -t rsa -b 4096 -C "464659446@qq.com",接下來會詢問你把rsa文件存在哪里辽话,默認(rèn)會存在.ssh文件中。
開啟ssh代理:eval "$(ssh-agent -s)"
把key加入代理中:ssh-add ~/.ssh/id_rsa, 到這一步卫病,本地的ssh已經(jīng)配置好了油啤。
遠程服務(wù)器ssh配置第一步:同上,配置ssh蟀苛。
遠程服務(wù)器ssh配置第二步:在.ssh目錄下益咬,vi authorized_keys(管理授權(quán)的文件),新建一個authorized_keys文件。
遠程服務(wù)器ssh配置第三步:把想要登錄到遠程服務(wù)器的主機的公鑰放在遠程服務(wù)器的authorized_keys文件中(cat顯示出來,復(fù)制黏貼)帜平,當(dāng)主機想要登錄服務(wù)器時幽告,遠程服務(wù)器會驗證之前放在authorized_keys中的公鑰和他登錄時提交的私鑰梅鹦,算法匹配的話,登錄成功评腺。
遠程服務(wù)器ssh配置第三步:授權(quán)chmod 600 authorized_keys(修改authorized_keys文件的權(quán)限)帘瞭,sudo service ssh restart (重啟ssh服務(wù))。
注意:如果登錄還是要密碼蒿讥。我把我的sshd.config里面的RSAAuthentication?no蝶念,PubkeyAuthentication?no。改為RSAAuthentication?yes芋绸,PubkeyAuthentication?yes媒殉。然后sudo service ssh restart重啟下就可以了。
修改服務(wù)器默認(rèn)登錄端口
修改服務(wù)器配置:阿里云購買的服務(wù)器默認(rèn)端口是22摔敛,出于安全考慮廷蓉,我們需要修改一下。sudo vi /etc/ssh/sshd_config(去修改配置文件)马昙。注意:修改配置前桃犬,最好多開一個窗口去連接好服務(wù)器,以防萬一修改錯誤行楞,登不上去攒暇,我們可以在這個窗口再進行修改。
相關(guān)修改:1子房、port形用,要選擇1025-65536的端口號。2证杭、useDNS保證是no田度。3、PermitRootLogin改為no, 禁止root用戶登錄(買阿里云服務(wù)器后解愤,所有人都知道登錄名是root镇饺,可以去掃描root下的所有端口,存在安全風(fēng)險)送讲。4奸笤、passwordAuthentication是否允許密碼登錄改為no,5李茫、permitEmptyPasswords改為no揭保。(因為我們現(xiàn)在不需要密碼登錄)肥橙。?6魄宏、passwordAuthentication yes后面加一行 AllowUsers xxx(用戶名)。修改之后 sudo service ssh restart重啟ssh服務(wù)存筏。
端口相關(guān):端口范圍(0~65536, 0-1024的范圍通常會被系統(tǒng)程序占用,必須以root身份才能啟動宠互。所以我們要選擇1025-65536的端口號)味榛。
登錄:ssh -p xxx(端口號) xxx(用戶名)@xxx(IP)
配置iptables防火墻(阿里云服務(wù)器可以設(shè)置安全組來配置,不用手動配置)
iptables:是允許靈活配置安全策略的防火墻框架(設(shè)置一些出入的大門,篩選掉惡意的訪問)予跌。
先升級一下服務(wù)器搏色,sudo apt-get update && sudo apt-get upgrade。
把iptables的現(xiàn)有規(guī)則清空掉券册,sudo iptables -F频轿。
配置iptables規(guī)則,sudo vi /etc/iptables.up.rules烁焙,新建一個空文件航邢。首先輸入一個*filter表示過濾。第一條規(guī)則:-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(允許所有建立起來的連接)骄蝇。第二條規(guī)則:-A OUTPUT -j ACCEPT (允許所有出去的流量)膳殷。第三條規(guī)則:-A INPUT -p tcp --dport 443?-j?ACCEPT?(允許https請求的連接)。第四條規(guī)則:-A?INPUT?-p tcp --dport 80 -j?ACCEPT?(所有網(wǎng)站訪問服務(wù)器都是從80端口進去的九火,我們讓80端口流量可以進出赚窃,你若要開放其他端口,再配置一條岔激,把端口號替換一下就好了)勒极。第五條規(guī)則:-A?INPUT?-p tcp -m state --state NEW?--dport xxx(我們新建帳號對應(yīng)的端口號) -j?ACCEPT?(登錄服務(wù)器只能從這個端口登錄,不是這個端口鹦倚,在防火墻層面就把它攔截了)河质。第六條規(guī)則:-A?INPUT?-p icmp -m icmp --icmp-type 8 -j?ACCEPT(允許從外網(wǎng)某臺服務(wù)器pin到這臺服務(wù)器,方便測試我們服務(wù)器是否停機震叙、某個機房網(wǎng)絡(luò)不通等)掀鹅。第七條規(guī)則:-A INPUT -m limit?--limit 5/min -j LOG --log-prefix "iptables denied:" --log-level 7 (記錄下被拒絕的請求)。第八條規(guī)則:-A INPUT -j REJECT? 換行? -A FORWARD -j REJECT(拒絕所有其他對服務(wù)器的訪問)媒楼。第九條規(guī)則:-A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set 換行 -A INPUT -p?tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 150 -j DROP (惡意訪問進行攔截乐尊,如果某個ip對我們80端口在60秒內(nèi)發(fā)出超過150的請求,被認(rèn)為是敏感訪問划址,進行攔截)扔嵌。規(guī)則寫完后,在最后寫入COMMIT夺颤。
告訴服務(wù)器我們的配置文件(修改完配置都執(zhí)行一下)痢缎,sudo iptables-restore < /etc/iptables.up.rules
激活防火墻:sudo ufw enable,查看防火墻是否激活sudo ufw status世澜,關(guān)閉防火墻:sudo ufw stop独旷。
防火墻自動啟動(服務(wù)器重啟需要):sudo vi /etc/network/if-up.d/iptables。寫入腳本,#!/bin/sh 換行 iptables-restore /etc/iptables.up.rules嵌洼,再給予腳本執(zhí)行的權(quán)限案疲,sudo chmod +x /etc/network/if-up.d/iptables
配置Fail2Ben增強防護安全
一個防御性動作庫,通過監(jiān)控系統(tǒng)中的日志文件麻养,根據(jù)監(jiān)測到的任何可疑行為褐啡,觸發(fā)不同的反應(yīng)動作。比如把執(zhí)行可疑行為的ip進行鎖定鳖昌。
安裝: sudo apt-get install fail2ban
配置文件: sudo vi /etc/fail2ban/jail.conf备畦。1、bantime可以設(shè)置大一點,比如3600许昨。2萍恕、destmail = 464659446@qq.com可以改成自己的郵箱。3车要、action = %(action_mw)s允粤。
Fail2Ben運行:sudo service fail2ban status(查看Fail2Ben是否運行)。sudo service fail2ban stop(停掉)翼岁。sudo service fail2ban start(開啟)
安全配置總結(jié)类垫,配置root及應(yīng)用帳號權(quán)限、配置SSH無密碼登錄琅坡、修改服務(wù)器默認(rèn)登錄端口悉患、配置iptables防火墻、配置Fail2Ben增強防護安全榆俺。通過這些基礎(chǔ)性簡單的安全配置售躁,相對于裸機安全等級提高很多,對付一些常規(guī)簡單的惡意行為綽綽有余茴晋。如果想要更高安全等級陪捷,需要更高的安全知識儲備,比如我們可以對服務(wù)器登錄設(shè)置ip的綁定诺擅,只有特定內(nèi)網(wǎng)的ip才能登錄到這臺服務(wù)器市袖,通俗所講的在內(nèi)網(wǎng)架設(shè)一臺跳板機,通過本地電腦連上跳板機烁涌,再從跳板機連上生產(chǎn)服務(wù)器苍碟。
搭建服務(wù)器node.js環(huán)境
更新一下服務(wù)器:sudo apt-get update
安裝一些模塊:sudo apt-get install vim openssl build-essential libssl-dev wget curl git 回車。
安裝node.js:我們會使用nvm方便管理node.js版本撮执。安裝一下nvm,wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh|bash微峰。重新打開一個終端窗口登陸服務(wù)器,nvm install v6.9.5(去安裝node.js)抒钱,nvm use v6.9.5(使用node.js)蜓肆,nvm alias default v6.9.5(node默認(rèn)版本設(shè)為6.9.5)掂榔,node -v(查看node版本)。
安裝cnpm:
1症杏、npm install --registry=https://registry.npm.taobao.org?-g npm(有時候會連不上npm或者下載太慢,我們可用register參數(shù)來指定使用國內(nèi)淘寶鏡像來下載,這里是使用國內(nèi)淘寶鏡像來安裝npm)瑞信。
2厉颤、npm install --registry=https://registry.npm.taobao.org?-g cnpm(安裝cnpm,為了保證更快更穩(wěn)定的速度,有時可以用cnpm替代npm,若我們npm安裝不上凡简,可以通過cnpm sync xxx來同步一個模塊逼友,它會強制把這個模塊拉到國內(nèi)鏡像上)。
3秤涩、我們需要監(jiān)控系統(tǒng)文件數(shù)目監(jiān)控帜乞,echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo?sysctl -p。
安裝一下常用的npm包:npm i pm2 webpack
開啟一個node服務(wù)(若80端口不通,需要去防火墻配置文件/etc/iptables.up.rules再去配置一下):
pm2啟動服務(wù)(node服務(wù)啟動在后臺,出現(xiàn)異常時能自動重啟):
在終端啟動node服務(wù)是不合適的筐眷,一旦終端關(guān)閉服務(wù)就停止了黎烈,我們希望服務(wù)可以在后臺運行,而且在出現(xiàn)異常時可以做到自動重啟匀谣。我們會用到pm2(nodeJS部署及進程管理的工具)照棋。pm2 start xxx.js(啟動服務(wù))。pm2 list(可以列出當(dāng)前服務(wù)器上目前所運行的node服務(wù)有哪些)武翎。pm2 show xxx(看指定node服務(wù)有哪些詳細的信息烈炭,比如script path運行腳本所在的位置,error log path出現(xiàn)錯誤時錯誤信息的記錄位置)宝恶。pm2 logs(查看實時日志)符隙。
pm2自動拉取線上最新代碼進行重新部署:
pm2 deploy ecosystem.json production setup(第一次發(fā)布前初始化)
pm2 deploy ecosystem.json production (進行發(fā)布)
ecosystem.json配置見https://github.com/FishEmperor/ice。
nginx反向代理NodeJs端口(讓web服務(wù)可以通過80端口,被外網(wǎng)能訪問到)
1垫毙、因為我們當(dāng)前賬戶下,node是不具備root的運行權(quán)限的霹疫,不能監(jiān)聽0-1024的任何端口(包括80端口)。我們需要啟動nginx以root權(quán)限來對80端口進行監(jiān)聽综芥,同時把來自80端口的流量分配給node服務(wù)的另外一個端口更米,實現(xiàn)服務(wù)的代理。
2毫痕、如果服務(wù)器只要放一個網(wǎng)站程序征峦,解析網(wǎng)站到服務(wù)器的一個網(wǎng)址,網(wǎng)站程序監(jiān)聽80端口就可以了消请,如果服務(wù)器有很多應(yīng)用栏笆,借助nginx不僅可以實現(xiàn)接口的代理,還可以實現(xiàn)負載均衡臊泰,讓他來判斷是來自哪個域名/ip的訪問蛉加,根據(jù)配置的規(guī)則,原封不動轉(zhuǎn)發(fā)給特定的端口或者是特定的某幾臺機器。
3针饥、一般購買的阿里云服務(wù)器,可能會預(yù)裝阿帕奇服務(wù)器厂抽,如果沒有特別的項目是用不到的,可以先停掉 sudo service apache2 stop 和 sudo service apache stop丁眼。再刪掉 update-rc.d -f apache2 remove 和 sudo apt-get remove apache2筷凤。更新一下包列表,sudo apt-get update苞七。
4藐守、安裝nginx,sudo apt-get install nginx蹂风。進入到nginx配置中卢厂,cd /etc/nginx/conf.d,新建一個配置文件sudo vi xxx.conf惠啄。
配置內(nèi)容:
????1慎恒、upstream imooc(應(yīng)用名) { server 127.0.0.1:8081(反向代理到這里) }? 。upstream可以用來設(shè)置負載均衡的策略撵渡,2巧号、server { listen 80; server_name xxx(服務(wù)器ip,比如120.26.235.4); 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}}
5、在/etc/nginx下找到nginx.conf文件铜跑,sudo vi nginx.conf门怪,確保配置有 include /etc/nginx/conf.d/*.conf(把conf.d下所有配置文件都加載進來);
6、測試一下配置文件有無錯誤锅纺,sudo nginx -t掷空,修正錯誤。sudo nginx -s reload囤锉,重啟一下nginx服務(wù)坦弟。如果想把開發(fā)者工具中請求顯示的Server顯示的nginx版本信息隱藏,可以配置nginx主配置文件 sudo vi /etc/nginx/nginx.conf官地,找到 "##server_tokens off" 把"##"刪除酿傍,取消注釋。重啟一下nginx配置驱入,sudo service nginx reload(若報錯,先nginx -c?/etc/nginx/nginx.conf赤炒。再sudo nginx -s reload)氯析。
7、看到控制臺請求頭中會顯示nginx版本信息莺褒,可以通過把nginx.conf中的#server_tokens off前面的注釋“#”號拿掉掩缓。
更改域名的DNS根服務(wù)器:
需要一個域名解析服務(wù)器DNS,這個服務(wù)器通常是你購買域名的服務(wù)商來提供的遵岩,比如阿里云/goDaddy等你辣。1個域名只可對應(yīng)1個ip地址,1個ip地址可以對應(yīng)多個域名旷余。
對于域名,通過阿里云服務(wù)有免費的云解析服務(wù)扁达,但是最好把域名放到DNSPod上進行解析正卧,因為它是個老廠商,技術(shù)背景成熟跪解。另一方面炉旷,我們的域名不一定是通過阿里云購買,我們可以在DNSPod上進行批量管理叉讥,更方便窘行。
我們在阿里云-域名列表-管理-修改DNS。再進入DNSPod-常見問題-功能介紹及使用教程-各個注冊商修改域名DNS地址的方法-萬網(wǎng) 图仓。查到解析服務(wù)器填入“修改DNS”即可罐盔。
MongoDB數(shù)據(jù)庫:
阿里云有付費的云數(shù)據(jù)庫MongoDB版本,有主副節(jié)點和備份機制(適合商用)救崔,數(shù)據(jù)庫服務(wù)器和項目服務(wù)器分開惶看。
我們自己玩玩的項目,能跑起來就行六孵,那么數(shù)據(jù)庫和項目在同一臺服務(wù)器上纬黎。
安裝mongoDB(https://docs.mongodb.com/manual/tutorial/install-mongodb-on-unbuntu/)
根據(jù)自己服務(wù)器 手動安裝MongoDB,如果我們使用的是Ubuntu服務(wù)器:1劫窒、登錄服務(wù)器 ssh -p 39999 imooc_manager@120.26.235.4本今。2、導(dǎo)入public key主巍。3冠息、為MongoDB的配置文件創(chuàng)建一個列表。4孕索、更新本地包铐达。5、安裝檬果。6瓮孙、開啟服務(wù)唐断、sudo service mongod start(重啟的話是restart)。7杭抠、檢查是否開啟成功 mongo 去連接mongo數(shù)據(jù)庫脸甘。8、終止mongodb服務(wù),sudo service mongod stop偏灿。
注意:
1丹诀、如果下載安裝出錯,可能是因為翁垂,我們用的是阿里云服務(wù)器铆遭,他默認(rèn)安裝源也是阿里云,我們可以先把源屏蔽掉試試沿猜,sudo vi /etc/apt/apt.conf枚荣,可以把第一行給注釋掉,最前面加入"#"啼肩。
2橄妆、如果覺得安裝太慢,可以sudo vi /etc/apt/souces.list.d/mongodb-org-3.4.list祈坠,把這個文件里的 http://repo.mongodb.org/apt/ubantu? 改成 http://mirrors.aliyun.com/mongodb/apt/ubantu害碾,然后執(zhí)行sudo apt-get update。
3赦拘、如果mongo 連接不上數(shù)據(jù)庫慌随,可能是防火墻沒有允許本地連接27017的端口(mongo的默認(rèn)端口),我們需要編輯一下防火墻 sudo vi /etc/iptables.up.rules躺同。找到#ping 來添加2條規(guī)則 -A INPUT -s 127.0.0.1 -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT 和??-A OUTPUT -d 127.0.0.1 -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT儒陨。重新載入一下防火墻 sudo iptables-restore < /etc/iptables.up.rules
4、大家都知道m(xù)ongodb默認(rèn)端口是27017笋籽,出于最基本的安全考慮蹦漠,需要把默認(rèn)端口改一下,sudo vi /etc/mongod.conf? 找到port 改成19999车海。再改一下防火墻的端口sudo vi /etc/iptables.up.rules笛园,把上e面3中的27017改成19999。重新載入一下防火墻 sudo iptables-restore < /etc/iptables.up.rules侍芝。之后連接mogodb 需要 mongo --port 19999 來連接數(shù)據(jù)庫研铆。
往線上MongoDB導(dǎo)入單表數(shù)據(jù)或數(shù)據(jù)庫
備份/導(dǎo)出本地數(shù)據(jù)庫:mongodump -h <hostname>(域名)<:port>(端口號) -d?dbname(需要備份的數(shù)據(jù)庫實例) -o?dbdirectory(備份數(shù)據(jù)庫存放的位置)
打包導(dǎo)出的數(shù)據(jù)庫:tar zcvf name1.tar.gz(打包后的文件名) name2(打包原文件名)
上傳打包好的數(shù)據(jù)庫到服務(wù)器:scp -P xxx(端口號)???/xxx/xxx.xx(本地文件地址)?root@xxx:/xxx/xx.xx(:后面跟服務(wù)器文件地址)
服務(wù)器上解壓上傳的數(shù)據(jù)庫包:tar xvf name.tar.gz(要解壓的包名)
服務(wù)器mongodb導(dǎo)入數(shù)據(jù)庫包:mongorestore --host 127.0.0.1:xxx(端口號) -d?dbname(需要導(dǎo)入的數(shù)據(jù)庫實例) dbdirectory(導(dǎo)入數(shù)據(jù)包的位置)
本地導(dǎo)出單條數(shù)據(jù)表:mongoexport -d dbname(需要導(dǎo)出的數(shù)據(jù)庫實例) -c name(需要導(dǎo)出的數(shù)據(jù)庫表名) -q '{"name": {$ne: null}}'(需要導(dǎo)出的數(shù)據(jù)的查詢條件,這里是name不為空) -o?dbdirectory(導(dǎo)出數(shù)據(jù)包的位置)
上傳到服務(wù)器后州叠,服務(wù)器導(dǎo)入單表:mongoimport --host 127.0.0.1:xxx -d?dbname(需要導(dǎo)入的數(shù)據(jù)庫實例) -c name(需要導(dǎo)入的數(shù)據(jù)庫表名)??dbdirectory(導(dǎo)入數(shù)據(jù)包的位置)
清空數(shù)據(jù)庫:mogo --host 127.0.0.1:xxx dbname(數(shù)據(jù)庫實例名) --eval "db.dropDatabase()"
MongoDB數(shù)據(jù)庫讀寫權(quán)限
1棵红、MongoDB沒有默認(rèn)的管理員帳號,添加管理員帳號咧栗,開啟權(quán)限的認(rèn)證逆甜。
2虱肄、切換到admin數(shù)據(jù)庫后,添加的帳號為管理員帳號交煞。
3咏窿、用戶只能訪問和登錄用戶所在的數(shù)據(jù)庫和管理員帳號。
4素征、管理員可以管理所有數(shù)據(jù)庫集嵌,但不能直接管理,首先需要到admin中認(rèn)證過才可以御毅。
設(shè)置管理員(超級權(quán)限):
mongo --port xxx(端口號) 進入到mongo的命令行環(huán)境下根欧。
switched to db admin 進入到admin數(shù)據(jù)庫
添加admin數(shù)據(jù)庫管理員:db.createUser({user(用戶名): 'xxx', pwd(密碼): 'xxx', roles: [{'role'(角色): 'userAdminAnyDatabase', 'db'(數(shù)據(jù)庫): 'admin'}]}) 添加完管理員記得記錄下賬號密碼,這個管理員可以間接管理所有數(shù)據(jù)庫端蛆。
在admin數(shù)據(jù)庫下對這個管理員進行授權(quán):db.auth('xxx'(用戶名), 'xxx'(密碼))凤粗,顯示是1代表授權(quán)成功
切換到指定數(shù)據(jù)庫: switched to db xxx(數(shù)據(jù)庫名)
添加指定數(shù)據(jù)庫管理員:db.createUser({user(用戶名): 'xxx', pwd(密碼): 'xxx', roles: [{'role'(角色): 'readWrite', 'db'(數(shù)據(jù)庫): 'xxx'}]})?
添加指定數(shù)據(jù)庫 負責(zé)備份管理員:db.createUser({user(用戶名): 'xxx', pwd(密碼): 'xxx', roles: [{'role'(角色): 'read', 'db'(數(shù)據(jù)庫): 'xxx'}]})?
用戶創(chuàng)建完畢,還不能驗證欺税,需要通過配置文件開啟驗證:sudo vi /etc/mongod.conf 侈沪。找到"#security:"揭璃,去掉#(取消注釋)晚凿,下一行空二格,寫入 authorization: 'enabled'(同意授權(quán))
重啟mongod:sudo service mongod restart瘦馍。此時我們 mongo --port xxx 進入數(shù)據(jù)庫中歼秽,show dbs會報錯(因為沒有權(quán)限),我們需要use admin先進入admin中情组,再db.auth('xxx', 'xxx')去認(rèn)證燥筷,此時再去show dbs 就可以了。
如果想直接進入指定數(shù)據(jù)庫:mongo 127.0.0.1:xxx(端口號)/xxx(數(shù)據(jù)庫名) -u xxx(賬號名) -p xxx(密碼) 即可院崇。
從一臺線上服務(wù)器遷移數(shù)據(jù)到另一個線上MongoDB中
1肆氓、先把線上服務(wù)器數(shù)據(jù)導(dǎo)出來。
? ? 新建/進入 文件夾容器底瓣,mkdir db 谢揪。 cd db 。
? ? ?遷移整個數(shù)據(jù)庫實例:通過 負責(zé)備份管理員導(dǎo)出數(shù)據(jù)捐凭,mongodump -h <hostname>(域名)<:port>(端口號) -d?dbname(需要備份的數(shù)據(jù)庫實例) -u xxx(用戶名) -p xxx(密碼) -o?dbdirectory(備份數(shù)據(jù)庫存放的位置)
? ? 遷移單表:mongoexport?-h <hostname>(域名)<:port>(端口號) -d dbname(需要導(dǎo)出的數(shù)據(jù)庫實例)?-c name(需要導(dǎo)出的數(shù)據(jù)庫表名)??-u xxx(用戶名) -p xxx(密碼)?-q '{"name": {$ne: null}}'(需要導(dǎo)出的數(shù)據(jù)的查詢條件拨扶,這里是name不為空) -o?dbdirectory(導(dǎo)出數(shù)據(jù)包的位置)
? ? 打包:tar zcvf name1.tar.gz(打包后的文件名) name2(打包原文件名)
2、把數(shù)據(jù)傳到本地茁肠,并發(fā)送到新服務(wù)器患民。
? ? 給服務(wù)器傳輸文: scp -r(如果是文件夾加上-r)? /xxx/xxx.xx(本地文件地址)?root@xxx:/xxx/xx.xx(:后面跟服務(wù)器文件地址)
????從服務(wù)器下載文:scp (-P xxx 如果設(shè)置了免密) root@xxx:/xxx/xx.xx(:后面跟服務(wù)器文件地址) ?/xxx/xxx.xx(本地文件地址)?
3、新服務(wù)器 解壓縮文件垦梆,并導(dǎo)入數(shù)據(jù)匹颤。
? ? 服務(wù)器上解壓上傳的數(shù)據(jù)庫包:tar xvf name.tar.gz(要解壓的包名)
? ? 連上數(shù)據(jù)庫:mongo --port xxx 仅孩。
????進入admin:use admin。
????授權(quán):db.auth('xxx', 'xxx')惋嚎。
????切換到指定數(shù)據(jù)庫:use xxx杠氢。
? ??添加指定數(shù)據(jù)庫管理員+添加指定數(shù)據(jù)庫 負責(zé)備份管理員。
? ? 服務(wù)器mongodb導(dǎo)入數(shù)據(jù)庫包:mongorestore --h 127.0.0.1:xxx(端口號) -d?dbname(需要導(dǎo)入的數(shù)據(jù)庫實例) dbdirectory(導(dǎo)入數(shù)據(jù)包的位置)
? ??服務(wù)器導(dǎo)入單表:mongoimport --host 127.0.0.1:xxx -d?dbname(需要導(dǎo)入的數(shù)據(jù)庫實例) -c name(需要導(dǎo)入的數(shù)據(jù)庫表名)??dbdirectory(導(dǎo)入數(shù)據(jù)包的位置)
? ? 查看是否導(dǎo)入成功:mongo 127.0.0.1:xxx(端口號)/xxx(數(shù)據(jù)庫名) -u xxx(賬號名) -p xxx(密碼) 即可另伍。
為數(shù)據(jù)庫實現(xiàn)定時備份方案(方案很多鼻百,介紹一種簡單,易上手的方式)
原理:利用系統(tǒng)任務(wù)通過自動定時來對數(shù)據(jù)庫備份。
寫一個執(zhí)行任務(wù)的腳本:
? ? 1摆尝、新建/進入文件夾温艇,mkdir tasks ,cd tasks堕汞。
? ? 2勺爱、編輯一個腳本,vi movie.backup.sh讯检。
? ? ? ? #!/bin/sh(表示是一個可執(zhí)行的腳本)
? ? ? ? backUpFolder=/home/imooc_manager/backup/movie(設(shè)置一個變量琐鲁,表示備份數(shù)據(jù)庫導(dǎo)出的目錄)
? ? ? ? date_now=`date +%Y_%m_%d_%H%M` (設(shè)置當(dāng)前日期)
? ? ? ? backFileName=movie_$date_now(備份出的文件名)
? ? ? ? cd $backUpFolder(進入到需要備份數(shù)據(jù)庫的目錄)
? ? ? ? mkdir -p $backFileName(創(chuàng)建一個文件夾,用于存放導(dǎo)出的數(shù)據(jù))
? ? ? ? mongodump -h <hostname>(域名)<:port>(端口號) -d?dbname(需要備份的數(shù)據(jù)庫實例) -u xxx(用戶名) -p xxx(密碼) -o?dbdirectory(備份數(shù)據(jù)庫存放的位置)? ?(導(dǎo)出數(shù)據(jù))
? ??????tar zcvf name1.tar.gz(打包后的文件名) name2(打包原文件名)? (壓縮)
? ? ? ? rm -rf $backFileName(清理導(dǎo)出未壓縮的數(shù)據(jù))
? ? ? 3人灼、新建文件夾用來存放導(dǎo)出的數(shù)據(jù)围段,執(zhí)行腳本文件:mkdir backup。 cd?backup投放。mkdir movie奈泪。cd 。sudo sh ./tasks/movie.backup.sh
? ? ? 4灸芳、定時腳本跑起來涝桅。
????????????cd(進入用戶根目錄)。
????????????crontab -e (啟動系統(tǒng)自動任務(wù)的設(shè)定)烙样,第一次進入會有一個nano編輯器選擇冯遂,選擇2就好了。(關(guān)于crontab的定時規(guī)則可以去了解文檔)
? ? ? ? ? ? 最后一行輸入:13 00 * * * sh /home/imooc_manager/tasks/movie.backup.sh谒获。 control+x蛤肌。shift+y【糠矗回車(在凌晨13分會去執(zhí)行腳本)
注意:現(xiàn)在我們存放備份數(shù)據(jù)都在服務(wù)器硬盤上存著,服務(wù)器被人攻擊或者誤操作寻定,可能會導(dǎo)致數(shù)據(jù)文件被刪除,建議把數(shù)據(jù)包存到第三方云平臺上或者自建的服務(wù)器上精耐。
上傳項目代碼到線上私有Git倉庫
服務(wù)器上安裝nginx和pm2狼速,通過nginx端口映射把前端發(fā)出的http請求轉(zhuǎn)發(fā)到后端的node.js上,node.js本身我們會通過pm2來進行維護卦停。
具體詳細操作請到git相關(guān)文檔去看向胡。
配置PM2恼蓬,一鍵部署線上項目結(jié)構(gòu)(在本地,登陸上服務(wù)器僵芹,服務(wù)器去拉取git倉庫最新代碼处硬,部署到相應(yīng)文件夾中等待進一步操作)
現(xiàn)在我們可以從git倉庫下載到最新代碼,我們需要一個傻瓜式管理代碼更新和服務(wù)運行的工具(即pm2)拇派,幫助我們同步代碼更新和服務(wù)重啟荷辕。關(guān)于部署,pm2有詳細文檔(pm2.keymetrics.io)。
我們通過配置文件的方式來配置pm2件豌,文檔中有一個deployment文檔疮方,需要在項目靜態(tài)文件中建一個ecosystem.json,在這里面我們來配置 倉庫的地址茧彤,服務(wù)器的ip骡显、賬號等。
? ? {"apps": [
????????{? "name"(項目名): "xxx",
? ? ? ? ? ? "script"(執(zhí)行的腳本): "app.js",
? ? ? ? ? ? "env"(腳本中要傳入的變量): { "COMMON_VARIABLE": "true" },
? ? ? ? ? ? "env_production"(生產(chǎn)環(huán)境的變量): {"NODE_ENV: "production"}
????????}
????],deploy(部署的任務(wù)):{
? ? ? ? "production":{
? ? ? ? ? ? "user"(服務(wù)器上用來發(fā)布的用戶名): "xxx",
? ? ? ? ? ? "host"(IP): ["xxx.xxx.xxx"],
? ? ? ? ? ? "port": "xxxx",
? ? ? ? ? ? "ref"(主分支): "origin/master",
? ? ? ? ? ? "repo"(倉庫地址):? git@.... ,
? ? ? ? ? ? "path"(需要把項目部署到服務(wù)器哪個目錄下): "/www/website/production",
? ? ? ? ? ? "ssh_options"(把key校驗取消掉): "StrictHostKeyChecking=no",
? ? ? ? ? ? "env": {
? ? ? ? ? ? ? ? "NODE_ENV": "production"
????????????}
????????}
????}}
登上服務(wù)器曾掂,到服務(wù)器根路徑 創(chuàng)建靜態(tài)網(wǎng)站部署的路徑惫谤。mkdir?www。cd www珠洗。mkdir?website溜歪。cd website。
運行:pm2 deploy?ecosystem.json production(參數(shù),配置的任務(wù)的名字) setup(命令险污,pm2連接上服務(wù)器痹愚,在服務(wù)創(chuàng)建發(fā)布項目所需要的文件夾)富岳。執(zhí)行完畢會發(fā)現(xiàn)服務(wù)器"/www/website/production"目錄下會有三個文件夾 current(當(dāng)前服務(wù)所運行的文件夾)蛔糯、shared(日志文件等共享數(shù)據(jù))、source(clone下來的源代碼)
注意:我們所用的user用戶名對于根目錄下的website可能沒有讀寫權(quán)限窖式,我們需要在服務(wù)器執(zhí)行 cd?/www/website蚁飒。sudo chmod 777 website。賦予user用戶名對website文件夾的讀寫權(quán)限萝喘。另外淮逻,上面的直接sudo chmod 777 website,讓所有用戶對website有操作權(quán)限的做法其實不妥阁簸,我們應(yīng)該創(chuàng)建一個專門操作website的用戶組爬早。
從本地發(fā)布上線和更新服務(wù)器的Node.js項目
發(fā)布流程:完成上一步操作后,我們進入本地項目中启妹,執(zhí)行?pm2 deploy?ecosystem.json production(配置的任務(wù)的名字) 筛严。
注意:
????????通常會報錯pm2命令找不著,那是因為pm2在服務(wù)器使用的是非交互的ssh連接方式饶米。我們需要進入服務(wù)器對應(yīng)用戶下桨啃,vi .bashrc編輯該文件车胡,把 case $- in 到esac都注釋掉后保存。再通過 source?.bashrc來重新加載bashrc照瘾,再去下載pm2(npm i pm2 -g)匈棘。
????????也會報錯ecosystem.json在服務(wù)器上沒找到,我們需要提交到git析命。再執(zhí)行?pm2 deploy?ecosystem.json production(配置的任務(wù)的名字) 來重新發(fā)布主卫。
修改域名指向:通過域名來訪問到靜態(tài)網(wǎng)站所提供的web服務(wù)。
修改nginx配置文件:
????通過nginx來識別請求后鹃愤,把請求轉(zhuǎn)發(fā)到服務(wù)器的3000端口队秩。服務(wù)器的nginx配置文件我們原本放在/etc/nginx/conf.d中會有一個imooc-com-8081.conf,我們把它改名成www-iblack7-com-3000.conf昼浦。編輯這個文件馍资,upstream imooc改成upstream website弛槐;端口8081改成3000阵谚;server_name改成www.iblack7.com(域名);把location中proxy_pass改成http://website森书。保存使兔。
? ? 重啟nginx服務(wù)建钥,sudo nginx -s reload,在瀏覽器通過域名去訪問網(wǎng)站虐沥。
? ? 注意:如果訪問失敗502熊经,除了nginx服務(wù)器端口映射和nodeJs本身會出問題,還有可能防火墻有問題欲险。我們現(xiàn)在通過nginx把通過來自www.iblack7.com的請求轉(zhuǎn)發(fā)到了服務(wù)器本地的3000端口镐依,防火墻需要允許3000端口的訪問。我們來配置一下防火墻配置天试,sudo vi /etc/iptables.up.rules槐壳,在mongodb connect的下面再增加2行:把前面兩行復(fù)制一下,-A INPUT...和-A OUTPUT喜每,黏貼在后面务唐,端口號改成3000,保存带兜。重新載入一下防火墻配置枫笛,sudo iptables-restore < /etc/iptables.up.rules。
此后刚照,更新發(fā)布刑巧,只需要修改完畢后push到git倉庫,在本地執(zhí)行?pm2 deploy?ecosystem.json production(配置的任務(wù)的名字) 。即可完成更新發(fā)布海诲。
選購申請SSL證書
2017年開始繁莹,谷歌開始對采用http協(xié)議的網(wǎng)站標(biāo)記為不安全的網(wǎng)站,蘋果所有應(yīng)用必須采用https的加密鏈接特幔。國內(nèi)小程序要求必須使用https協(xié)議接入域名咨演。
如果采用http協(xié)議,很容易被聯(lián)通電信劫持蚯斯,注入話費充值廣告等薄风,采用https協(xié)議起碼會避免asp劫持。
證書對于瀏覽器或操作系統(tǒng)的支持范圍:Chrome拍嵌、windows遭赂、safairs、mac OS等横辆。
證書的類型:通常證書是向國際認(rèn)證的認(rèn)證機構(gòu)(CA)來申請撇他,能夠申請到的證書類型:
1、域名級證書(DV)狈蚤,信任等級一般困肩,一般用于個人博客、產(chǎn)品演示脆侮、中小企業(yè)網(wǎng)站锌畸,對信息安全等級不高的情況下使用,申請流程簡單靖避。
2潭枣、企業(yè)級別的證書(OA),信任等級較高幻捏,通常用于電商網(wǎng)站盆犁、私密社交等涉及到用戶資料、訂單支付場景粘咖,申請較嚴(yán)格蚣抗,價格不親民侈百,對業(yè)務(wù)有一定規(guī)模的公司可以考慮瓮下。
3、增強型證書(EA)钝域,全球統(tǒng)一的讽坏,嚴(yán)格實名認(rèn)證標(biāo)準(zhǔn)頒發(fā)的SSL證書,目前全球最高等級的SSL證書例证,安全性很高路呜,一個網(wǎng)站如果使用了該證書地址欄會顯示為綠色,一般用在金融支付,網(wǎng)上銀行等一些資金交易比較敏感的場景胀葱。
證書的維護成本:時效有3個月漠秋、1年,過期后需要更新證書或者重新提交申請抵屿,我們還可以通過一些工具或者腳本來解決證書的自動更新庆锦,節(jié)省維護成本。
免費申請SSL證書的平臺:有拍云轧葛、騰訊云(推薦)搂抒、七牛、阿里云尿扯。注意:域名需要已備案
證書申請機構(gòu):賽門鐵克求晶、