代碼運行流程
首先開啓服務器,在npm run dev的時候運行了bin目錄下的www.js文件,啓動http服務
當前端進行訪問的時候,經過app.js文件
App.js是整個項目的入口文件,首先判斷這個用戶在http的header頭中帶了那些驗證的信息,例如帶了userid(cookie),有userid就賦值給req.session和存入redis,沒有就創建一個
驗證完信息後,進入每個模塊的處理區間,例如博客、用戶
例如進入到了博客區間,通過router文件blog.js,通過req.query獲取到路由,進入到當前的路由區間
通過req.body或req.query獲取接口的參數,調用控制器的方法,根據參數處理數據
通過封裝的處理數據模塊返回固定的數據格式(succesfulModel、errorModel)
App.js中調用handleBlogRouter獲取到處理後的數據,轉換爲字符串,然後返回給前端
Cookie
什麼是cookie,cookie是存在瀏覽器的一段字符串,格式k1=v1;k2=v2;可存儲結構化數據
Cookie的大小,5kb
Cookie不允許跨域,跨域不共享
每次發送http請求,會將請求域的cookie一起發送給server
Server端可以修改cookie,並返回給瀏覽器
瀏覽器也可以修改cookie,通過document.cookie,可以限制瀏覽器對cookie的寫入,寫入的不能覆蓋受限制的cookie
Cookie中不要暴露用戶的敏感信息
Session
Session中存儲用戶的信息,通過cookie中獲取到的信息,查詢出需要驗證的信息
Session存放在數據庫中,如果存儲在進程的內存中,會導致進程卡死,緩慢
正式上線會啓用多進程,多進程中的內存無法共享
系統會限制進程的內存
Redis
Web server最常用的緩存數據庫,數據存放在內存中
相比mysql讀取速度快(內存讀取的速度比硬盤快的多)
成本高,可存儲的數據量更少
Nginx
Nginx反向代理,安裝nginx,配置nginx.conf文件
記錄日誌
日誌有可能比較大,存儲在redis或mysql中都不太合適,存在redis中,如果文件比較大,相對會消耗內存,導致程序卡頓或緩慢,存儲在mysql中,讀取和查看不方便,不如文件直接,遷移到其他服務器,又要搭建mysql環境等
存在在文件中,解決文件過大的問題,通過管道的方式進行傳輸,一點一點的流到需要接收的端
做定時任務,使用linux的crontab,*****command, 分 時 天 月 星期 命令
日誌逐行讀取,使用readline
Server安全
預防sql攻擊,例如註釋掉部分條件語句,通過傳進來的sql
Xss攻擊,往服務器中添加js代碼,預防主要是過濾掉<>尖括號,轉換成html格式,安裝xss
密碼加密
萬一數據庫被攻破,最不應該泄露的就是用戶信息
攻擊方式:獲取用戶名和密碼,再去嘗試登錄其他系統
預防措施:進行密碼加密,致使拿到密碼也不知道明文
github倉庫地址:https://github.com/Sun-Traget/Node.js-Web-Server.git