vhost in nodejs
关于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的更多相关文章
- Node.js之路【第二篇】Nodejs中的pip(NPM)&REPL
什么是NPM 在学Python的时候我们肯定会使用第三方模块或者编写模块供别人使用,我们有一个非常好用的pip来帮我们管理我们的模块包!那么Nodejs重的模块包呢? 对没错就是NPM,他是随同Nod ...
- nginx 各类网站设置 (laravel , thinkphp , nodejs , https)
基础部分设置 [root@centos ~]# vim /opt/nginx/conf/nginx.conf user www www;worker_processes auto;pid logs/n ...
- nodejs review-03
39 Serve different file types with our server 处理文件类型 function content_type(filename) { var ext = pat ...
- [转]Nodejs基础中间件Connect
Nodejs基础中间件Connect 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的J ...
- Nodejs基础中间件
Nodejs基础中间件Connect http://www.tuicool.com/articles/emeuie 关于作者 张丹(Conan), 程序员Java,R,PHP,Javascript ...
- Nodejs基础中间件Connect
http://www.tuicool.com/articles/emeuie 关于作者 张丹(Conan), 程序员Java,R,PHP,Javascript weibo:@Conan_Z blog: ...
- NodeJS 框架 Express 从 3.0升级至4.0的新特性
NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...
- nodejs学习笔记之包、模块实现
简单了解了node的安装和一些基本的常识之后,今天学习了node中很重要的包和模块的一些知识点. 首先学习一下包的规范,它由包结构和包描述两部分组成.包结构用于组织包的各种文件,包 ...
- NodeJS爬虫系统初探
NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文 ...
随机推荐
- Java小案例-(逃离迷宫)
Java小案例-(逃离迷宫) 一,迷宫需求描述: 1,用户输入迷宫图(限制方形):字母1位墙,0为通,e为出口,m为入口,*为已访问的位置,用外围1围住迷宫 2,运行轨迹右,左,下,上 3,判断该迷宫 ...
- .Net Framework 之 托管代码和非托管代码的区别
一.什么是托管代码(managed code)? 托管代码:是微软的中间语言(IL),即微软中间语言MSIL(Microsoft Interspace Language). “ 源代码→机器码 ”运行 ...
- Android 如何添加一个新的时区
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- thinkphp+Jquery MiniUI 开发 管理系统
Jquery Miniui JS 兼容IE6+的浏览器,非常适合在企业内部使用. 管理系统等都非常方便. 在企业内部正在使用的是前期asp.net +fineui实现的管理系统.经过了几年的实践检验. ...
- SQL数据库有阻塞就自动发邮件警报
1.建查询是否有阻塞的视图 create view [dbo].[VW_WaitingCount] as SELECT s.session_id, r.blocking_session_id, s.h ...
- iOS中 最新微信支付/最全的微信支付教程具体解释 韩俊强的博客
亲们, 首先让我们来看一下微信支付的流程吧. 1. 注冊微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些參数. 2. 下载微信支付sdk 3. clien ...
- 经常使用的 WEB server
对于刚開始学习的人来说,或许自己能够写出一些简单的演示样例DEMO,但却纠结于不知道应该怎样才干訪问自己的页面,这里进行了一些简单的WEBserver总结.便于新朋友配置使用 静态HTML页面 对于静 ...
- 04-hibernate注解-一对一双向外键关联
一对一双向外键 1,主控方的配置同一对一单向外键关联. 2,@OneToOne(mappedBy="card") //被控方 @OneToOne(mappedBy="ca ...
- 解析Linux特殊文件【转】
您有Dos和Windows经验,就大概知道系统存在若干类型的文件,如系统文件.只读文件.隐含文件等.在Linux下用ls –l 命令来判断文件类型,可以依据第一列中的10个字符来判断.-rw-r—r— ...
- Java Collection之Queue具体解释及用途
Queue是一种常见的数据结构,其主要特征在于FIFO(先进先出),Java中的Queue是这样定义的: public interface Queue<E> extends Collect ...