一: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).
-
sudo apt-get install --reinstall npm
-
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協議,看一篇就夠了
什么是非對稱加密?
(四)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搜索打開文件
注意:調試服務端,需要使用客戶端進行事件觸發,否則可能導致服務端代碼無事件觸發,阻塞執行!!!