網站的錯誤不常常發生,但當咱們遇到的時候很是使人懊惱,好比當咱們想要在線掛號的時候,遇到了這個: css
爲何會出現這種狀況,背後的服務器發生了什麼?咱們將使用Node.js
作一個簡單的web
服務器並利用好雨應用管理平臺將咱們本地的服務放到互聯網上面。html
Node.js
是一個開源的跨平臺運行環境,容許咱們構建一個服務器端和網絡應用的運行環境。使用JavaScript
語言開發能夠經過Node.js
運行時環境跑在任何平臺。固然,開始使用前咱們須要先進行安裝,經過這個下載地址找到適合咱們系統的安裝包進行安裝。node
首先咱們須要寫一個JavaScript
文件,咱們叫它server.js
,這個就是咱們運行web
服務器的程序。git
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("It's work!"); response.end(); }).listen(5000);
相信我,這是你看到的最簡單的服務器程序了,是否是很簡單,接着咱們在命令行下運行這個文件。程序員
node server.js
這樣咱們的web
服務器就已經運行了,打開瀏覽器讓咱們確認一下它正常工做了。web
Node.js
能夠用不多的資源,應付大流量訪問,由於node
採用了event loop
機制來解決單線程的問題,這種運行方式稱爲"異步模式"(asynchronous I/O
)或"非堵塞模式"(non-blocking mode
)。編程
讓咱們經過這幅圖解釋的更詳細一些:json
這幅圖很好的展現了在Node.js服務內部是如何工做的。一個用來處理外部事件而且把它們轉換成對回調的調用的實體。瀏覽器
這些工做都是在服務內服實現的,咱們在寫代碼的過程當中不會接觸到這些問題。因此咱們只須要了解Node運行如此快的緣由正是基於這種"異步I/O模式"就能夠了。服務器
個人服務器已經正常運行了,但是它只是跑在個人本地,若是想要讓更多的人訪問個人網站,我須要將它放到互聯網上咱們須要選擇一個雲平臺來部署咱們的網站。對於雲平臺咱們有不少選擇,好比亞馬遜
、Heroku
等等,但由於衆所周知的緣由,國外的雲服務咱們使用起來並不方便,甚至沒法訪問。因此我選擇了好雨雲
來部署網站,好雨雲
是一個雲端的應用管理平臺,也就是咱們一般所說的PaaS
(platform as a service),它容許你自動部署web應用,支持幾種構建方式,好比我使用就是源碼構建,這節省了我不少時間,可讓我專心寫代碼,不用爲服務器、網絡以及代碼運行環境的配置操心。
好,在部署以前,咱們須要進行一些開發的工做,讓咱們寫個簡單網站,新建項目目錄名爲myblog
,並建立server.js
(上面說過的,還記得嗎?)首先聲明一些變量:
var http = require("http"); var fs = require("fs"); var path = require("path"); var mime = require("mime");
這裏包含了一個第三方的依賴mime
,他不是node
的一部分,咱們須要先安裝這些第三方依賴才能讓程序工做。爲了解決依賴問題咱們須要寫一個package.json
文件將咱們項目須要的依賴放進去。
就像這樣:
{ "name" : "myblog", "version" : "0.0.1", "description" : "a simple blog", "dependencies" : { "mime" : "~1.2.7" }, "scripts": { "start": "node server.js" }, "engines": { "node": "4.7.2" } }
語法很簡單,但要注意一些語法細節,否則常常會發生由於少了逗號或者引號形成構建失敗這種低級的錯誤。這裏咱們聲明依賴的mime
的版本、啓動命令以及node
的版本。
若是咱們代碼的根目錄下存在package.json
文件那麼好雨雲
就會判斷這是Node.js
程序並安裝相應的依賴以及調用咱們聲明的命令來啓動程序。
接着咱們須要爲web
服務器增長一些功能來處理不一樣的請求,send404
是當請求到不存在的文件時,咱們要如何處理:
function send404(response) { response.writeHead(404, {"Content-type" : "text/plain"}); response.write("Error 404: resource not found"); response.end(); }
sendFile
文件數據服務:
function sendFile(response, filePath, fileContents) { response.writeHead(200, {"Content-type" : mime.lookup(path.basename(filePath))}); response.end(fileContents); }
定義服務器如何執行請求:
function serverWorking(response, absPath) { fs.exists(absPath, function(exists) { if (exists) { fs.readFile(absPath, function(err, data) { if (err) { send404(response) } else { sendFile(response, absPath, data); } }); } else { send404(response); } }); }
建立http
服務器:
var server = http.createServer(function(request, response) { var filePath = false; if (request.url == '/') { filePath = "public/index.html"; } else { filePath = "public" + request.url; } var absPath = "./" + filePath; serverWorking(response, absPath); });
配置服務的監控端口:
var port_number = server.listen(process.env.PORT || 5000);
爲啥是5000
呢?由於好雨雲
默認分配5000
的監控端口。因此咱們將這裏配置好,就能夠直接被訪問到。
而後咱們開始寫內容,在項目目錄(myblog
)下新建幾個目錄:public
、stylesheets
和images
。咱們將index.html
放到public
下,將咱們樣式文件 style.css
放到stylesheets
下,靜態資源圖片放到images下。
博客的首頁index.html
代碼以下:
<!DOCTYPE html> <html> <head> <title>個人博客</title> <link rel="stylesheet" type="text/css" href="http://oe5ahutux.bkt.clouddn.com/style.css"> </head> <body> <div id="header"> <span>一個簡單的博客</span> </div> <div id="content"> <h2><a href="http://www.amazon.cn/gp/product/B007VISQ1Y/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B007VISQ1Y&linkCode=as2&tag=jysperm07-23">JavaScript 權威指南</a></h2> <p>這本書事無鉅細地介紹了 JasvaScript 語言核心、標準庫以及瀏覽器提供的 DOM 和 BOM. 本書並無由淺入深的結構,而是通篇平鋪直敘地介紹,所以適合有必定 JavaScript 基礎的人從頭到尾閱讀來掌握一些相對細節的 JavaScript 知識,或遇到具體問題時查閱相關章節。</p> <h2><a href="something.html">JavaScript 異步編程</a></h2> <p>這本書介紹了 JavaScript 中事件模型、Promise、async.js 等異步抽象的設計和實現,同時也介紹了 Web Woerk 等在瀏覽器中優化性能的技巧。這本書適合全部 JavaScript 程序員增長對 Promise 等異步模型的理解,並在實踐中挑選合適的異步模型。</p> </div> </body> </html>
瀏覽器中訪問的樣子:
首頁代碼中,我故意寫了一個能夠訪問的正確連接和一個不可訪問的錯誤連接,這樣我能夠試一下404
返回內容。
###部署到好雨雲
OK,到這裏咱們的網站寫好了,須要將代碼提交到好雨雲
來部署,點新建應用
後,好雨平臺會給咱們一個git代碼倉庫的地址,咱們只須要將代碼提交到這個地址就能夠了。
在咱們本地的myblog
項目目錄中執行
# 初始化本地git倉庫 git init # 添加遠程倉庫地址 git remote add goodrain http://code.goodrain.com/app/simtime_gr8904c4.git # 執行提交 git add . git commit -m "first commit" git push -u goodrain master
提交後,平臺自動識別了咱們的語言
在自動構建和部署以後,咱們就能夠訪問到咱們的網站了。
咱們寫了不到60行代碼,將咱們的web
服務器構建了起來,並寫了一個演示用的博客頁面,也許你會說這太簡單了,沒錯,確實是這樣,但經過這些你能夠快速的瞭解到web服務器是如何工做。你還能夠將Node.js
與更多技術結合,好比HTML5
、CSS3
以及JavaScript
,固然還包括種類豐富的庫和框架支持。
PaaS
雲平臺的選擇也是一個重點,能夠幫助咱們快速學習、試驗咱們的代碼,將咱們從複雜的配置和運維工做中解脫了出來。
參考資料: http://abdelraoof.com/blog/2015/10/28/understanding-nodejs-event-loop/ http://doc.goodrain.com/usage/181950