关于vhost

  个人理解为vhost是一种可以在一个ip下同时部署多个不同域名站点的的概念。

  其好处就是对一些小型的网站不必每个网站都占用一个ip,或者说一个服务,举个例子,vhost的概念就相当于打开一个浏览器,里面有多个窗口,每个窗口就是一个站点,而不是说打开多个浏览器,一个浏览器只开一个窗口。

  之所以可以这么做,主要因为以下2方面:

    1、访问一个域名时,客户端不仅通过dns找到对应的ip,还会把域名也发送过去。

    2、中间件的存在,使得每个请求可以被预处理,从而可以通过域名获取客户端访问的站点。

关于中间件

  在这里可以这么理解,中间件就是一系列的过滤器,当服务器接收每一个到请求时,会先通过中间价做一些处理,再到真正的请求响应程序,在预处理的过程中的改动都会存在request中。

基于nodejs的代码实现

需要安装2个模块

npm install express -g
npm install vhost -g

简单代码,文件名为Evhost.js

var ex = require('express')
var vhost = require('vhost') var app = ex() function handler(req, res, next) {
console.log(req.vhost);
res.send('your request site: ' + req.vhost.hostname)
} var domain_sn = vhost('sn.cn', handler) var domain_vra = vhost('vra.cn', handler) app.use(domain_sn)//使用中间件
app.use(domain_vra) app.listen(80,function(err){
if (err)
throw err
console.log('服务启动,监听端口:80');
})

运行该程序

node Evhost.js

关于express:www.expressjs.com.cn/

关于vhost:https://github.com/expressjs/vhost

vhost关键代码解析,整个vhost的模块代码其实很简单

/**
* Create a vhost middleware.
*
* @param {string|RegExp} hostname
* @param {function} handle
* @return {Function}
* @api public
*/ module.exports = function vhost(hostname, handle) {
if (!hostname) {
throw new TypeError('argument hostname is required')
} if (!handle) {
throw new TypeError('argument handle is required')
} if (typeof handle !== 'function') {
throw new TypeError('argument handle must be a function')
} // create regular expression for hostname
var regexp = hostregexp(hostname) return function vhost(req, res, next) {//返回一个函数,作为中间件
var vhostdata = vhostof(req, regexp)//通过正则表达式判断域名是否是这个host处理
if (!vhostdata) {//不是则调到下一个中间件
return next()
} // populate
req.vhost = vhostdata//将域名信息存到request的vhost变量汇中 // handle
handle(req, res, next)//执行这个host绑定的处理程序
};
};

通过输入域名进行访问

因为需要获取域名信息,所以不可以通过输入ip直接进行访问,由于80端口是默认的http端口,所有不需要在后面再加上端口号。

如果该端口被占用则必须先关闭占用该端口的程序:http://jingyan.baidu.com/article/37bce2be10a5c21002f3a2cf.html

在访问之前还需要配置系统的vhost:http://www.cnblogs.com/sesna/p/host_troubleshot.html

  

vhost in nodejs的更多相关文章

  1. Node.js之路【第二篇】Nodejs中的pip(NPM)&REPL

    什么是NPM 在学Python的时候我们肯定会使用第三方模块或者编写模块供别人使用,我们有一个非常好用的pip来帮我们管理我们的模块包!那么Nodejs重的模块包呢? 对没错就是NPM,他是随同Nod ...

  2. nginx 各类网站设置 (laravel , thinkphp , nodejs , https)

    基础部分设置 [root@centos ~]# vim /opt/nginx/conf/nginx.conf user www www;worker_processes auto;pid logs/n ...

  3. nodejs review-03

    39 Serve different file types with our server 处理文件类型 function content_type(filename) { var ext = pat ...

  4. [转]Nodejs基础中间件Connect

    Nodejs基础中间件Connect 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的J ...

  5. Nodejs基础中间件

    Nodejs基础中间件Connect   http://www.tuicool.com/articles/emeuie 关于作者 张丹(Conan), 程序员Java,R,PHP,Javascript ...

  6. Nodejs基础中间件Connect

    http://www.tuicool.com/articles/emeuie 关于作者 张丹(Conan), 程序员Java,R,PHP,Javascript weibo:@Conan_Z blog: ...

  7. NodeJS 框架 Express 从 3.0升级至4.0的新特性

    NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...

  8. nodejs学习笔记之包、模块实现

        简单了解了node的安装和一些基本的常识之后,今天学习了node中很重要的包和模块的一些知识点.       首先学习一下包的规范,它由包结构和包描述两部分组成.包结构用于组织包的各种文件,包 ...

  9. NodeJS爬虫系统初探

    NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文 ...

随机推荐

  1. Lidgren.Network – an introduction to networking in C# games

    Lidgren.Network – an introduction to networking in C# games http://genericgamedev.com/tutorials/lidg ...

  2. [Functional Programming ADT] Adapt Redux Actions/Reducers for Use with the State ADT

    By using the State ADT to define how our application state transitions over time, we clear up the ne ...

  3. SVG路径字符串格式

    命令 名称 参数 M 移动到(moveTo) (x y)+ Z 闭合路径(closepath) (none) L 直线(lineTo) (x y)+ H 水平直线 x+ V 垂直直线 y+ C 曲线( ...

  4. Node.js abaike图片批量下载Node.js爬虫1.01版

    //====================================================== // abaike图片批量下载Node.js爬虫1.01 // 1.01 修正了输出目 ...

  5. 云计算之路-试用Azure:竟然无法重置虚拟机的管理员密码

    在忘记管理员密码的情况下,可以远程重置服务器的管理员密码是云计算服务的一个优势,这是使用自己的物理服务器无法实现的. 但是,在使用Azure的时候,我们找遍Azure管理控制台也没找到可以重置虚拟机( ...

  6. 微信公众平台开发小记(ASP.NET)

    微信的好东西,提供了很大的平台去发挥,公司最近推出微信公众账号,也接触了一些东西, 最终决定用asp.net来开发服务端程序. 微信公众平台的API很简单,利用XML来规范格式,并且所有的数据都在CD ...

  7. 关联规则( Association Rules)之频繁模式树(FP-Tree)

    Frequent Pattern Tree(频繁模式树)是Jiawei Han在2004年的文章<Mining Frequent Patterns without Candidate Gener ...

  8. COSMOSBOX手遊制作手册(Word备份)

    20140712版 版本号 Version 日期 Date 作者 Author 变更主要原因描述 Brief Description 1.0 2014-4-26 陈霈霖 初稿 2.0 1. 前言 本手 ...

  9. Android 开发之使用Eclipse Debug调试详解(转)

    转自 http://blog.csdn.net/xys289187120/article/details/6636331 1.在程序中添加一个断点 如果所示:在Eclipse中添加了一个程序断点 在E ...

  10. jetty maven插件端口设置

    在jetty的maven插件中有两种方式设置jetty的端口(默认为:8080). 第一种,通过命令行,在启动jetty的时候设置:mvn -Djetty.port=8081 jetty:run 第二 ...