网站的错误不经常发生,但当我们遇到的时候非常令人懊恼,比如当我们想要在线挂号的时候,遇到了这个:
为什么会出现这种情况,背后的服务器发生了什么?我们将使用Node.js
做一个简单的web
服务器并利用好雨应用管理平台将我们本地的服务放到互联网上面。
Node.js
是一个开源的跨平台运行环境,允许我们构建一个服务器端和网络应用的运行环境。使用JavaScript
语言开发可以通过Node.js
运行时环境跑在任何平台。当然,开始使用前我们需要先进行安装,通过这个下载地址找到适合我们系统的安装包进行安装。
首先我们需要写一个JavaScript
文件,我们叫它server.js
,这个就是我们运行web
服务器的程序。
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
服务器就已经运行了,打开浏览器让我们确认一下它正常工作了。
Node.js
可以用很少的资源,应付大流量访问,因为node
采用了event loop
机制来解决单线程的问题,这种运行方式称为"异步模式"(asynchronous I/O
)或"非堵塞模式"(non-blocking mode
)。
让我们通过这幅图解释的更详细一些:
这幅图很好的展示了在 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.