网站的错误不常常发生,但当咱们遇到的时候很是使人懊恼,好比当咱们想要在线挂号的时候,遇到了这个: 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