#部署生產環境的基本條件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萬的用戶量
阿里雲主機默認會掛載一個系統盤,最好本身再掛載一個數據盤,這樣即便清空數據盤也不會影響主機的系統運行,不然一旦重裝系統,本身的應用就都沒有了。
1.不要用root用戶去部署服務,要配置一個帳戶用於部署,防止root操做形成誤刪; 2.部署經常使用命令
解決方法: 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 // 確認保存便可
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 公鑰
而後再在服務器上一樣執行如下操做:
ssh-keygen -t rsa -b 4096 -C "2441150413@qq.com" eval "$(ssh-agent -s)"
下一步本地和服務器配對:
本地操做:
cat id_rsa.pub // 複製公鑰
而後複製其所有內容
服務器操做:
vi authorized_keys
i // 在vi編輯狀態下開始insert
粘貼剛纔複製的內容,而後esc
shift+: wq! enter
sudo vi /etc/ssh/sshd_config
新開一個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來登陸,就會發現
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端口代理到對應端口服務
檢測是否安裝了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;-----------------------------------------------------------
#域名解析DNSPod 一個域名只能有一個ip,可是一個ip地址能夠對應多個域名;
配置二級域名
登陸www.dnspod.cn網站,點擊域名解析,執行添加操做
配置結果爲:
此時咱們的二級域名就配置好了,訪問的時候就分別是#服務器安裝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就行了。
默認端口每每不夠安全,因此咱們儘可能修改端口
編輯mongod.conf 文件
sudo vi /etc/mongod.conf 找到下面代碼修改端口 port: 27017 ---------> 此處改成19999
bindIp: 127.0.0.1
重啓mongo: sudo service mongod restart
執行 mongo --port 19999 便可鏈接成功。
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', 'Safe124$')
返回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 127.0.0.1:9999/imooc-movie -u imooc-movie-runner -p '這裏寫密碼' 成功便可執行相關操做,
例如:show tables
還有數據庫的遷移和單表遷移也是經常使用的指令,你們在使用到以後能夠自行查閱嘗試
數據庫的定時備份
咱們能夠經過腳本文件執行來達到定時屢次備份數據庫的任務,腳本內容以下:
腳本執行
有時咱們還須要將備份的數據庫文件定時上傳到備份服務器上(此處以上傳到七牛雲對象存儲爲例),這個服務咱們能夠用nodejs來實現 這部分代碼七牛雲提供了相關實現方式,
末尾添加如下代碼來傳輸
對上面的代碼進行參數解析: 也可將上面的任務配置成定時任務便可Tips:若是有多個數據庫,最好每一個數據庫單獨配置一個備份腳本,而不是一次性寫在一個腳本中,這樣防止一個出問題都出問題。
遠程服務器也去git倉庫clone最新代碼; 服務器安裝git : sudo apt-get install git 服務器clone最新代碼下來:
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配置文件寫錯,也會報錯,須要注意!!! 修改文件夾相對當前用戶的讀寫權限:sudo chmod 777 xxx (該用戶對xxx文件夾具備讀寫權限)
Git 全局設置:
建立 git 倉庫:
已有倉庫?