• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sesna
博客园    首页    新随笔    联系   管理    订阅  订阅
vhost in nodejs
vhost 原理 实现

关于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

 

  

posted on 2015-05-03 15:51  sesna  阅读(1439)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3