摘要:什么是在開始打造自己的服務器之前我們首先明確一下服務器的定義一個管理資源并為用戶提供服務的計算機軟件。如何實現一個自己的服務器在實現自己的服務器之前首先我們明確一下的本質屬于應用層的協議基于的封裝而的應用實現是基于無論是還是都有的封裝。
什么是server
在開始打造自己的服務器之前,我們首先明確一下服務器的定義:一個管理資源并為用戶提供服務的計算機軟件。
根據功能服務器分為兩類動靜態服務器區別static web server,例如常見的nginx apache等等
dynamic web server,例如常見的tomcat,jboss,resin等等
對于靜態服務器來說一般就是讀取資源然后返回給browser;動態服務器意味著返回給browser的文件是經過邏輯處理動態產生的。
服務器具有的功能特性nginx nginx特點nginx,tomcat這個兩個之前用過,也研究過,所以拿這兩個舉一下示例,不過現在很少用了,現在基本上都是使用node相關的,所以最后構建的serve會基于node。
nginx應用場景 靜態服務器(圖片,js,css等等)配置簡單,靈活(只有一個主配置文件nginx.conf)
支持高并發(靜態小文件)
占用資源相對較少(2w并發,開啟10個線程,內存消耗只有幾百M)
功能種類多(例如proxy,cache,Log,Gzip等等)
server { listen 8080; server_name localhost; location / { root html; index index.html index.htm; } }
說明 上面是nginx配置,指定訪問根目錄和默認主頁,以及監聽端口
? ~ clear ? ~ curl -i http://127.0.0.1:8080 HTTP/1.1 200 OK Server: nginx/1.12.2 //服務器類型和版本 Date: Fri, 02 Mar 2018 08:49:44 GMT Content-Type: text/html Content-Length: 11 Last-Modified: Fri, 02 Mar 2018 08:46:27 GMT //支持Last-Modified緩存機制 Connection: keep-alive //支持持久連接 ETag: "5a990f63-b" //支持ETag緩存機制 Accept-Ranges: bytes // 支持斷點續傳 hello jsdt% //響應體
說明 上面是本地測試請求,從響應頭中可以看到支持很多功能
反向代理,負載均衡
說明 上面是試驗效果
upstream jsdt.com { server 127.0.0.1:8083 max_fails=3 fail_timeout=30s weight=1; server 47.97.xxx.xxx:8084 max_fails=3 fail_timeout=30s weight=2; //為了安全 隱藏真實ip地址 } server { listen 8080; server_name localhost; location / { root html; # index index.html index.htm; proxy_pass http://jsdt.com; proxy_redirect default; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }}
說明 上面我摘取了關鍵的部分配置,采用了輪訓+weight算法,其它還有ip_hash、url_hash等算法。真實的應用情況,還需要考慮很多問題,例如集群的session同步,記得大學實習期間,當時公司用的是cookie+memcache集群的方案。
tomcat tomcat特點tomcat運行在jvm上,跨平臺,是一個Servlet容器(可以運行Servlet,編譯jsp),實現了在http請求響應處理中所需要的http接口相關實現類。除此之外也支持虛擬主機,session共享,靜態文件處理等等,只不過沒那么專業而已。tomcat應用場景
說明 如上所示,我們可以在頁面中添加動態的處理邏輯,返回的數據根據用戶可定制化(相比靜態服務器優點),最終.jsp被tomcat編譯為.java,然后被javac編譯為通用字節碼文件,最終運行在jvm上。
在實現自己的服務器之前,首先我們明確一下server的本質,server屬于應用層的協議,基于tcp的封裝, 而tcp的應用實現是基于socket(無論是node,還是java都有socket)的封裝。接下來實現自己的靜態server
socket監聽某個端口,獲取面向流的數據data,我們的server所要做的就是對data進行解析封裝,以使其符合http的規范。
因為有http模塊,所以node當中實現一個基礎server很簡單。但是如果附加額外的功能,例如壓縮,緩存,斷點續傳,反向代理什么的就需要自己添加了。
接下來首先看一下項目結構,bin目錄主要是放啟動腳本相關的,主邏輯在app.js中,然后根據功能將代碼拆分成不同的模塊。templatet目錄放置編譯的原始模板。
|____bin | |____.DS_Store | |____deamon.js | |____start | |____yargsConfig.js |____node_modules |____package-lock.json |____package.json |____readme.md |____src | |____.DS_Store | |____app.js | |____asset | |____cacheSupport.js | |____config.js | |____picGuard.js | |____template | |____util.js
在server運行前,首先我們通過yargs模塊獲取解析好的命令行參數。如下所示
if(argv.D){ let sp = cp.spawn(process.execPath, ["deamon.js"],{ cwd: __dirname, stdio: ["ignore","ignore","ignore"], env: argv, detached: true //http://nodejs.cn/api/child_process.html#child_process_child_process_spawn_command_args_options } ) sp.unref() } else { let config = Object.assign({}, defautConfig, argv) let server = new Server(config); server.start(); console.log("server already started") }
說明 如果開啟deamon模式,則通過子進程的方式讓服務在后臺運行,反之則直接啟動server實例
在啟動server之后,開始接受并處理請求,下面以斷點續傳功能模塊作為示例
function byteRangeStream(req, res, filepath, statObj) { let start = 0 let end = statObj.size-1 let range = req.headers["range"] if (range){ res.setHeader("Accept-Range","bytes") res.statusCode = 206 //a part of content let result = range.match(/bytes=(d*)-(d*)/); if (result) { start = isNaN(result[1]) ? start : parseInt(result[1]); end = isNaN(result[2]) ? end : parseInt(result[2]) - 1; } } return fs.createReadStream(filepath,{ start, end }) } module.exports ={ byteRangeStream }
說明 在主模塊app.js中,導入上述模塊,如代碼中所示首先判斷客戶端是否支持斷點續傳,依據range請求頭,如果有請求范圍,直接返回請求范圍內的數據,否則全部讀取返回,靠的是browser和server的協商機制,需要雙方都支持才能完成整個過程。
更多功能模塊可以參考我的github, 歡迎star。
寫這篇文章,總結了下server的相關知識,參考了之前大學時做的筆記,看到之前做的記錄,回憶當時在學校學習和公司實習的經歷,感慨萬千。時光易逝,做好當下的自己。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93095.html
摘要:優化刪除自帶的不必要的文件是有必要的,最大限度保證系統安全。所以我們要對進行必要的修改,讓等待數據庫啟動完畢再啟動。 showImg(https://segmentfault.com/img/remote/1460000014711637?w=1010&h=276); 本文是鋼哥的Oracle APEX系列文章中的第五篇,完整 Oracle APEX 系列文章如下: Oracle A...
閱讀 2265·2021-09-27 13:35
閱讀 561·2019-08-30 15:55
閱讀 810·2019-08-30 15:53
閱讀 555·2019-08-30 15:52
閱讀 2146·2019-08-30 12:59
閱讀 2269·2019-08-29 16:42
閱讀 1385·2019-08-26 18:26
閱讀 2467·2019-08-26 13:48