版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、部署_nginx_pm2_docker課程目標Nginx靜態(tài) location 動態(tài)數(shù)據(jù)請求proxy 負載均衡了解cluster原理掌握pm2部署NodeJS服務參考文檔使用pm2+nginx部署koa2(https) 課程內(nèi)容如何構(gòu)建一個高可用的node環(huán)境主要解決問題故障恢復多核利用 796914多進程共享端口/ app.jsconst Koa = require(koa);/ 創(chuàng)建一個Koa對象表示web app本身: const app = new Koa();/ 對于任何請求,app將調(diào)用該異步函數(shù)處理請求:app.use(async (ctx, next) = / 隨機產(chǎn)生錯誤M
2、ath.random() 0.9 ? aaa() : 2await next();ctx.response.type = text/html; ctx.response.body = Hello, koa2!;);if (!module.parent) 開課吧web全棧架構(gòu)師開課吧web全棧架構(gòu)師app.listen(3000);console.log(app started at port 3000.); else module.exports = app/ test.jsvar http = require(http); setInterval(async () = try await h
3、ttp.get(); catch (error) , 1000)/ cluster.jsvar cluster = require(cluster);var os = require(os); / 獲取CPU 的數(shù)量var numCPUs = os.cpus().length; var process = require(process)console.log(numCPUs:, numCPUs) var workers = ;if (cluster.isMaster) / 主進程分支cluster.on(death, function (worker) / 當一個工作進程結(jié)束時,重啟工作進程
4、 delete workersworker.pid; worker = cluster.fork();workersworker.pid = worker;);/ 初始開啟與CPU 數(shù)量相同的工作進程for (var i = 0; i console.log(worker + cluster.worker.id + ,PID: + process.pid) next()app.listen(3000);/ 當主進程被終止時,關閉所有工作進程process.on(SIGTERM, function () for (var pid in workers) process.kill(pid);pro
5、cess.exit(0););require(./test)文件上傳服務器scp (最原始)scp docker-compose.yml root3:/root/source/ #文件scp -r mini-01 root3:/root/source/ #文件夾git (實際工作中) deploy插件 (debug)PM2的應用內(nèi)建負載均衡(使用Node cluster 集群模塊、子進程,可以參考樸靈的深入淺出node.js一書第九章) 線程守護,keep alive0秒停機重載,維護升級的時候不需要停機.現(xiàn)在 Linux (stable) & Ma
6、cOSx (stable) & Windows (stable).多平臺支持停止不穩(wěn)定的進程(避免無限循環(huán))控制臺檢測 https:/id.keymetrics.io/api/oauth/login#/register提供 HTTP API配置npm install -g pm2pm2 start app.js -watch -i 2/ watch 監(jiān)聽文件變化/ -i 啟動多少個實例pm2 stop all pm2 listpm2 start app.js -i max # 根據(jù)機器CPU核數(shù),開啟對應數(shù)目的進程配置process.ymlapps:- script : app.js inst
7、ances: 2 watch : true env :NODE_ENV: productionKeymetrics在線監(jiān)控開課吧web全棧架構(gòu)師 pm2 link 8hxvp4bfrftvwxn uis7ndy58fvuf7l TARO-SAMPLEpm2設置為開機啟動 pm2 startupNginx 反向 + 前端打包Dist安裝yum install nginxapt updateapt install nginx添加靜態(tài)路由# /etc/nginx/sites-enable/taroserver listen 80;server_name ; location / root /root
8、/source/taro-node/dist; index index.html index.htm;# 驗證Nginx配置nginx -t# 重新啟動Nginx service nginx restartnginx -s reload# /etc/nginx/sites-enable # taroserver listen 80;server_name ;開課吧web全棧架構(gòu)師# 查看配置文件位置nginx -t# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok# nginx: configuration fi
9、le /etc/nginx/nginx.conf successful#重啟service nginx restartnginx -reloadDocker概念操作系統(tǒng)層面的虛擬化技術的進程 于宿主和其它的 的進程 - 容器GO語言開發(fā)特點高效的利用系統(tǒng)快速的啟動時間一致的運行環(huán)境持續(xù)交付和部署更輕松的遷移對比傳統(tǒng)虛擬機總結(jié)開課吧web全棧架構(gòu)師特性容器虛擬機啟動秒級分鐘級硬盤使用一般為 MB一般為 GB性能接近原生弱于系統(tǒng)支持量單機支持上千個容器一般幾十個location / root /root/source/taro-node/dist; index index.html index.h
10、tm;location .(gif|jpg|png)$ root /root/source/taro-node/server/static;location /api proxy_pass;proxy_redirect off;proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;三個 概念鏡像容器倉庫Docker基本使用構(gòu)建一個Nginx服務器1. 拉取 鏡像# 拉取 鏡像docker pu
11、ll nginx# 查看docker images nginx# 啟動鏡像mkdir wwwecho hello docker! www/index.html# 啟動# www目錄里面放一個index.htmldocker run -p 80:80 -v $PWD/www:/usr/share/nginx/html -d nginx# 查看進程docker psdocker ps -a / 查看全部# 偽終端 ff6容器的uuid# -t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上,# -i 則讓容器的標準輸入保持打開docker exec -it ff6
12、 /bin/bash# 停止docker stop ff6# 刪除鏡像docker rm ff6Dockerle定制鏡像#DockerfileFROM nginx:latestRUN echo Hello, Kaikeba! /usr/share/nginx/html/index.html開課吧web全棧架構(gòu)師# 定制鏡像docker build -t mynginx .# 運行# -d 守護態(tài)運行docker run -p 80:80 -d mynginx定制一個程序NodeJS鏡像npm init -y npm i koa -s/ package.jsonname: myappp,vers
13、ion: 1.0.0,main: app.js, scripts: test: echo Error: no test specified & exit 1,keywords: ,author: ,license: ISC, description: myappp, dependencies: koa: 2.7.0/ app.jsconst Koa = require(koa) const app = new Koa() app.use(ctx = Math.random() 0.8 ? abc() : ctx.body = Hello Docker)app.listen(3000, () =
14、 console.log(app started at)開課吧web全棧架構(gòu)師#Dockerfile#制定node鏡像的版本FROM node:10-alpine#移動當前目錄下面的文件到app目錄下ADD . /app/#進入到app目錄下面,類似cd WORKDIR /app#安裝依賴RUN npm install#對外 的端口EXPOSE 3000#程序啟動CMD node, app.js# 定制鏡像docker build -t mynode .# 運行docker run -p 3000:3000 -d mynodePm2 - 利用多核# .dockerignore node_mod
15、ules/ process.yml apps:- script : app.js instances: 2 watch : true env :NODE_ENV: production# DockerfileFROM keymetrics/pm2:latest-alpine WORKDIR /usr/src/appADD . /usr/src/appRUN npm config set registry npm iEXPOSE 3000#pm2在docker中使用命令為pm2-dockerCMD pm2-runtime, start, process.yml& 開課吧web全棧架構(gòu)師# 定制鏡
16、像docker build -t mypm2 .# 運行docker run -p 3000:3000 -d mypm2Docker-Compose#docker-compose.yml app-pm2:container_name: app-pm2 #構(gòu)建容器build: . # volumes:# - .:/usr/src/app ports:- 3000:3000/ 強制重新構(gòu)建并啟# -force-recreate 強制重建容器# -build 強制編譯docker-compose up -d -force-recreate -build#docker-compose.yml vers
17、ion: 3.1 services:nginx:image: nginx:kaikeba ports:- 80:80# 運行docker-compose up# 運行docker-compose up -d部署Mongo + MongoExpress開課吧web全棧架構(gòu)師#docker-compose.yml version: 3.1 services:mongo:image: mongo restart: always ports:- 27017:27017mongo-express:image: mongo-express restart: always ports:- 8081:8081
18、代碼中添加Mongoose調(diào)用/ mongoose.jsconst mongoose = require(mongoose);/ 1.連接mongoose.connect(mongodb:/mongo:27017/test, useNewUrlParser: true );const conn = mongoose.connection;conn.on(error, () = console.error(連接數(shù)據(jù)庫失敗);/ app.jsconst mongoose = require(mongoose); mongoose.connect(mongodb:/mongo:27017/test,
19、 useNewUrlParser: true); const Cat = mongoose.m (Cat, name: String );Cat.deleteMany()const kitty = new Cat( name: Zildjian ); kitty.save().then() = console.log(meow);app.use(async ctx = ctx.body = await Cat.find()WebHook實現(xiàn)CI持續(xù)集成啟動NodeJS開課吧web全棧架構(gòu)師var http = require(http)var createHandler = require(
20、-webhook-handler)var handler = createHandler( path: /webhooks, secret: myHashSecret )/ 上面的 secret 保持和設置的一致function run_cmd(cmd, args, callback) var spawn = require(child_process).spawn; var child = spawn(cmd, args);var resp = ;child.stdout.on(data, function (buffer) resp += buffer.toString(); ); child.stdout.on(end, function () callback(resp) );http.createServer(function (req, res) handler(req, res, function (err) res.statusCode = 404 res.end(no such location).listen(3000)handler.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024物業(yè)資產(chǎn)讓與擔保合同 資產(chǎn)方與受讓方協(xié)議
- 二零二四年免租金科研機構(gòu)租賃合同規(guī)范文本3篇
- 2025年管道檢測與修復水管安裝合同樣本3篇
- 2025年酒店布草租賃與智能化管理服務合同2篇
- 二零二五年度草料種植基地土壤治理合同3篇
- 二零二五年度租賃房屋租賃保證金監(jiān)管服務合同范本3篇
- 2025年校園體育設施平整施工合同6篇
- 二零二五年度數(shù)據(jù)中心場地租賃合同及數(shù)據(jù)安全保障與服務標準3篇
- 二零二五惠州法務專員招聘與法律知識普及培訓合同3篇
- 2024金融機構(gòu)貸款擔保合同
- 危險性較大分部分項工程及施工現(xiàn)場易發(fā)生重大事故的部位、環(huán)節(jié)的預防監(jiān)控措施
- 繼電保護試題庫(含參考答案)
- 《榜樣9》觀后感心得體會四
- 2023事業(yè)單位筆試《公共基礎知識》備考題庫(含答案)
- 《住院患者身體約束的護理》團體標準解讀課件
- 酒店一線員工績效考核指標體系優(yōu)化研究
- 成都市優(yōu)質(zhì)結(jié)構(gòu)工程申報指南
- 小學四年級上冊-數(shù)學口算題精選(分頁打印)
- 【納棺夫日記】
- 《鐵路貨車運用維修規(guī)程》2018年10月
- 水利工程竣工驗收報告表格(共5頁)
評論
0/150
提交評論