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是一个文本文 ...
随机推荐
- [Android Pro] Android的5个进程等级
1.foreground process 正处于activity resume状态 正处于bound服务交互的状态 正处于服务在前台运行的状态(StartForeGround( ...
- Centos 7 通过yum的方式安装配置Artifactory 5.10
制品仓库系统有很多,例如:Artifactory,Nexus,Archiva, 其中Artifactory拥有很多强大的企业级特性和人性化的用户接口,很多大型的公司都在使用它. 背景:因客户需求,需要 ...
- UVA 10441 - Catenyms(欧拉道路)
UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...
- maven install时报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
事故现场: 解决办法: 一是命令行, mvn clean package -Dmaven.test.skip=true 二是写入pom文件, <plugin> <groupId> ...
- Android Exception 13(Can't create handler inside thread that has not called Looper.prepare())
10-12 17:02:55.500: E/AndroidRuntime(28343): FATAL EXCEPTION: Timer-2 10-12 17:02:55.500: E/AndroidR ...
- 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)
什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...
- Android 6.0 超级简单的权限申请 (Permission)
代码地址如下:http://www.demodashi.com/demo/13369.html 背景描述 随着Android系统的不断升级,谷歌对用户的隐私是越来越注重了,给我们开发者带来了更多的繁琐 ...
- Python-文件修改器
#-*- coding: utf-8 -*- import os import sys import glob from PyQt4.QtGui import * from PyQt4.QtCore ...
- python内置函数、匿名函数、递归
python3--内置函数 内置函数: 截止到python 3.6.2 版本,现在python一共提供了68个内置函数:即python提供给你直接可以拿来使用的所有函数. 内置函数 (点击函数查 ...
- 哈希key个数
$length = keys %hashname; 则$length中得到的直接是该hash的key的个数.