WebRTC學習(二)Web服務器搭建


一:Web服務器了解

(一)Web服務器類型

Nodejs

比較特殊,可以用js開發服務端程序;
有兩份JS,一份是用於控制服務器的,一份是用於下載到客戶端去運行的;

Nginx

性能上比Apache更好,靈活度等也優於Apache,
所以逐漸把Apache取代;

Apache 

一開始出現的時候占服務器市場80%,
逐漸被Nginx取代;

(二)Web服務器原理

(三)NodeJS工作原理

1.Application:我們自己開發的JavaScript程序

Application運行,首先輸出給V8JS引擎;

2.V8 JavaScript Engine【V8JS引擎 | 重點】

這個引擎是從Chrome項目中抽取出來的;
主要是對JS進行一些解析工作,解析完了之后生成二進制代碼;

3.【NODE.JS BINDINGS】

解析生成的二進制代碼去調用 Nodejs的API【NODE.JS BINDINGS】,
隨后【NODE.JS BINDINGS】會調用LIBUV【一個事件處理庫】

4.【LIBUV】事件處理機制

事件循環,通過結合事件隊列,對事件進行相應處理

(四)JavaScript解析

1.在服務端寫服務的時候,首先是用JS寫一個JS源程序;

2.V8引擎 會收到 JS源程序;JS源程序經過V8,通過parser,解析成Abstract Syntax Tree,最終交給解析器【interpreter】;

3.【interpreter】將其解析成bytecode【字節碼,執行代碼】;也可能【interpreter】經過編譯優化【optimizing compiler】,形成優化后的代碼【optimized code】,最終再轉化成bytecode;

(五)Nodejs事件處理

Nodejs收到事件之后的大概的處理流程:

1.首先是若干個Request,請求到Node.js 應用上來;

2.拿到請求之后,會生成請求對應的事件,插入到事件隊列【LIBUV中 的 Event Queue】中去,

3.【LIBUV】中的Event Loop會不斷循環,讀取【Event Queue】隊頭的事件進行處理;

3.1 簡單的事件則直接【Callback】,返回一個【Response】

(如請求一個HTML簡單頁面的事件);

3.2 還有復雜一點的事件,

可能需要調用數據庫、做一些查詢工作、做數據統計,最終展示頁面,
這個時候會從線程池【Thread Pool】取出一個線程【Thread】, 執行對應的【Function】,最后【Callback】,返回一個【Response】; 最后回收線程;

4. 以上兩個步驟的【Callback】,如果是最終結果,自然是直接返回一個【Response】,

如果只是中間結果,可能還需要再次生成事件,插入【Event Queue】,進行下一輪的事件處理;

(五)兩個V8引擎(服務器、客戶端)

我們說Nodejs比較特殊,可以用js開發服務端程序;
有兩份JS,一份是用於控制服務器的,一份是用於下載到客戶端去運行的;

那么 服務端、客戶端 其實分別對應着一個V8引擎;

1.一般情況下,在客戶端發送請求之前,Nodejs的服務是要先運行起來的【running】,
服務端有自己的JS,經過(服務端 的)V8解析、中間層LIBUV處理,然后先運行起來了;
2.客戶端發送一個http請求到Nodejs服務端,比如要請求【Request】某一個JS文件, 那【Request】生成對應的事件【Event】之后,經過LIBUV的事件處理機制【上述流程】, 進行事件處理,操作磁盤,拿到對應JS文件,然后Callback、Response返回給客戶端【瀏覽器】; 3.瀏覽器【客戶端】收到服務端的JS文件之后,也將JS代碼交給【(瀏覽器/客戶端 自己的)V8】進行解析; 解析得到執行代碼【byteCode】之后;隨后進行JS邏輯對應的中間層、底層操作;

二:Nodejs環境搭建

(一)Nodejs安裝

1.二進制安裝步驟(不推薦、版本太低)

開發nodejs時所需要的依賴庫放在一個公共的源上,通過npm工具可以直接下載這些依賴庫。

2.源碼安裝:https://nodejs.org/zh-cn/download/

生成Makefile文件時,使用./configure --prefix=/usr/local/nodejs 即可配置安裝位置

在生成的目錄下面的bin目錄中存在node與npm文件。因此還需要修改環境變量或者添加軟鏈接

3.nodejs升級:https://blog.csdn.net/weixin_47385625/article/details/114137413

如果版本太低,可能導致后面無法支持forever軟件啟動

4.npm升級

sudo npm install -g npm

補充:NodeJs與npm版本對應:https://nodejs.org/zh-cn/download/releases/

補充:npm升級

sudo npm install -g npm

補充:npm卸載https://blog.csdn.net/weixin_43339112/article/details/111311357

1.npm root -g 確認全局安裝所在目錄

2.刪除目錄下的npm和npm_cache文件夾 

3.刪除/usr/bin下的鏈接

補充:出現npm is already the newest version (3.5.2-0ubuntu4).

  1. sudo apt-get  install --reinstall npm
  2.  sudo apt- get upgrade

(二)Nodejs服務端的開發(簡單、模塊多、生態鏈不錯):最簡單的Http服務器

'use strict'    //使用最嚴格的語法,防止出現語法漏洞

var http = require("http");

var app = http.createServer(function(request,response){    //配置回調函數
    response.writeHead(200,{    //寫入Http頭
        "Content-Type":"text/plain;charset=utf-8"    //輸出文本類型
    });
    response.write("Hello World\n");                //頁面輸出
    response.end();                                    //頁面結束
}).listen(8080,"0.0.0.0");        //監聽本機(服務端)的所有網卡的8080端口

啟動服務:

通過netstat -ntpl查看程序名稱和對應監聽的端口

 

結果顯示:

補充:啟動Nodejs服務方法

安裝forever:

sudo npm install forever -g 如果不加-g,則會將軟件安裝在當前目錄下,不能進行調用

在使用forever時,需要為nodejs創建軟鏈接:

sudo ln -s nodejs /usr/bin/node

forever命令:

npm install forever -g   #安裝
forever start app.js     #啟動應用
forever stop app.js      #關閉應用
forever restart app.js   #重啟應用
forever stopall          #關閉所有應用
forever restartall       #重啟所有應用
forever list             #顯示所有運行的應用

(三)HTTPS服務了解

后面的使用,會調用音視頻設備這些設備會涉及個人隱私問題,對於chrome,對於這些檢查是非常嚴格的。如果不是https服務的話,是無法調用去打開音視頻設備的!

HTTP和HTTPS協議,看一篇就夠了

什么是非對稱加密?

https/ssl原理,如何保護數據不被竊聽

 后半段使用對稱加密通信

(四)Nodejs搭建HTTPS服務

本地https快速解決方案——mkcert(可以使用在服務端,實現https訪問,需要開啟端口)

'use strict'

var https = require("https");        //引入https庫
var fs = require("fs");                //文件系統,用來讀取證書

var options = {
    key : fs.readFileSync("./ca/learn.webrtc.com-key.pem"),            //同步讀取文件key
    cert: fs.readFileSync("./ca/learn.webrtc.com.pem"),                //同步讀取文件證書
};

var app = https.createServer(options,function(request,response){
    response.writeHead(200,{
        'Content-Type':"text/plain;charset=utf-8"
    });
    response.write("Hello World\n");                //頁面輸出
    response.end();                                    //頁面結束
}).listen(8080,'0.0.0.0');

1.啟動https服務

node 02_server_https.js

2.訪問https服務

https://learn.webrtc.com:8080/

三:實現真正Web服務

express模塊是nodejs里中專門用於處理web服務的模塊

serve-index模塊發布目錄,使得目錄下的所有文件都可以共享,可以通過瀏覽器瀏覽

安裝到當前目錄下:

npm install express
npm install serve-index

(一)代碼實現

'use strict'

var http = require("http");
var https = require("https");
var fs = require("fs");

var express = require("express");
var serveIndex = require("serve-index");


var app = express();                    //實例化express
app.use(serveIndex("./public"));        //設置首路徑,url會直接去訪問該目錄下的文件
app.use(express.static("./public"));    //可以訪問目錄下的所有文件

//http server
var http_server = http.createServer(app);    //這里不使用匿名函數,使用express對象
http_server.listen(8080,"0.0.0.0");

//https server
var options = {
    key : fs.readFileSync("./ca/learn.webrtc.com-key.pem"),            //同步讀取文件key
    cert: fs.readFileSync("./ca/learn.webrtc.com.pem"),                //同步讀取文件證書
};

var https_server = https.createServer(options,app);
https_server.listen(8083,"0.0.0.0");

(二)測試

1.啟動服務

2.結果顯示

 

四:如果配置到服務器,需要設置防火牆,開啟端口

(一)基本操作

1.查看防火牆狀態

systemctl status firewalld.service

2.關閉防火牆(重啟失效)

systemctl stop firewalld.service

3.禁止防火牆(重啟依舊生效)

systemctl disable firewalld.service

4.防火牆重啟

sudo systemctl restart firewalld.service

(二)端口操作

1.添加端口

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

注意:開啟端口后需要重新啟動防火牆!!!!!!

sudo systemctl restart firewalld.service
或者:重新載入
firewall-cmd --reload

2.查看端口狀態

sudo firewall-cmd --zone=public --query-port=80/tcp

3.刪除端口

sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent

五:調試相關

(一)客戶端代碼調試

通過瀏覽器ctrl+shift+c可以調出開發者工具進行調試!

(二)服務端代碼調試

 

在啟動服務之后,通過瀏覽器去訪問這個服務,會與服務端建立連接進行通訊:

首先將服務端代碼下載到瀏覽器中,每次執行都會與服務端進行交互。可以支持斷點,服務端會返回調試信息---實現遠端調試!!

(三)實現調試服務端代碼

1.啟動服務

sudo node --inspect-brk server.js

2.設置瀏覽器

最下面,出現我們開啟的服務端程序,server.js

使用Ctrl+P搜索打開文件

注意:調試服務端,需要使用客戶端進行事件觸發,否則可能導致服務端代碼無事件觸發,阻塞執行!!!

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM