关于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. elastic不错的官方文档(中文)

    https://www.blog-china.cn/template/documentHtml/1484101683485.html http://www.open-open.com/doc/list ...

  2. 动态网站技术CGI

    递信息的规程.CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静三种主流的动态网站技术: ASP JSP PHP 除之外,此还要了解的动态网站技术 ...

  3. 通过NAT实例实现外部访问AWS的ElastiCache资源

    ElastiCache作为AWS的内存缓存组建可以说做的一点也不友好了, 你可以通过ElastiCache创建redis,memcache的实例,却不能被外部访问. 背景 人傻钱多的客户总有人傻钱多的 ...

  4. docker学习笔记-1

    docker学习笔记一:安装 mac安装docker docker官方文档上有这么一段话: Because the Docker daemon uses Linux-specific kernel f ...

  5. redis3.0.6安装配置

    运行linux客户端 1     安装依赖 yum install gcc-c++ -y(安装gcc) 2     创建安装目录.编译.安装 mkdir -p /usr/local/redis(创建安 ...

  6. 如何在网页中嵌入QQ 阿里旺旺等代码

    1 登陆以下网址: http://wp.qq.com/login.html?target=1 2 复制代码到HTML中即可 3 将对方和自己的QQ都登陆测试(注意自己QQ必须是2010以上版本,否则会 ...

  7. PagerAdapter刷新问题

    一.PagerAdapter介绍 PagerAdapter简介 ListView 大家应该都很熟悉吧!ListView 一般都需要一个 Adapter 来填充数据,如 ArrayAdapter.Sim ...

  8. 也谈编译 VS 解释

    语言发展 计算机的硬件仅仅能识别0和1组成的机器指令,而机器指令是最主要的计算机语言,可是我们平时进行程序设计时肯定不会用机器语言来编程,由于用它的效率低.更让人难以理解. 因此聪明的人类发明了汇编语 ...

  9. Visual studio之C# 调用系统软键盘(外部"osk.exe")

    背景 App需要调用系统软键盘输入数据,自己去实现软键盘有些复杂,现在又是急需,没时间去研究实现软键盘,所以只能调用系统软键盘. 正文 需要添加命名空间, using System.Diagnosti ...

  10. Drupal的钩子系统

    Drupal的很多功能都是可以定制的.以导航菜单为例,blog模块需要在菜单上添加一些功能,comment模块需要在菜单上添加一些功能,我们开发的自定义模块也需要在菜单上添加一些功能.Drupal开发 ...