一个周末掌握IT前沿技术之node.js篇<五>:Node.js与Nginx





早上好!一夜的休息让我们精神饱满。窗外阳光满满,微风轻轻。让我踏上征服IT前沿技术的旅程。

昨天我们学习了JavaScript以及Node.js的基本特性、连接数据库、服务端模板和RESTful-API,今天我们要将这些点系统地组织架构起来,搭建轻轻松松处理数万用户的高性能的web应用服务。首先我们需要用到一个神器,它叫Nginx。

在互联网服务器架构中,我们可以经常听到LAMP(Linux+Apache+Mysql+PHP/Python/Perl)架构。它最早出现在1998年,是一种非常优秀的架构。有一个绿色工具XAMPP可以帮助你一键部署一个LAMP环境。

XAMPP下载地址:{官网}

在web2.0时代,这是最流行的架构环境。然而随着技术的发展,这种架构逐渐地被超越被取代。Nginx拥有超越Apache的卓越性能;有了更方便的redis和更强大的HBase,我们不再需要把什么数据都存在Mysql中;我们正在学习的Node.js比PHP更强大,比Python/Perl更专注于网络开发。似乎唯一不能取代的就是Linux。只是我们在两天学习过程中,完全不需要搭建一台Linux服务器。相信只要在编译的时候加几个参数,一台高性能的web应用服务器,完全可以运行在一个Android手机或iPad上面。

题外讨论:《变化》
变化是唯一的不变,我们要用发展的眼光看问题。一直以来LAMP是最好的服务器架构,它在性能、开发成本、部署成本等各方面确实优于同时代的其他一些技术。是否听说过tomcat、Servlet,asp.net甚至于IIS。虽然这些技术也不乏使用者,存在就有它的理由。有一些全世界都在等(world wide wait)的网站,就是用JSP构建的。例如:工商银行网站。现在我们觉得(Nginx+RESTful+Node.js)也许是最好的服务器架构,但是它很快也会被超越。如果5年后还在使用我们今天所学的这些东西的话,做出的将是一个全世界都在等(world wide wait)的网络应用。

在(Nginx+RESTful+Node.js)架构中,Nginx是组织者、整合者。那么利用Nginx怎样将一个web应用服务所需要的各种资源整合起来呢?我们接下来去学习。


五. Node.js与 Nginx


Nginx(“engine x”)是一个高性能的HTTP和反向代理服务器,开发者Igor Sysoev于2004年10月4日发布了第一个公开版本。

《安装Nginx》
windows版的Nginx是绿色的,推荐使用Stable versionnginx/Windows-1.0.14稳定版:

下载地址:{官网} {微盘}

一个很好的中文教程:《Nginx:取代Apache的高性能WEb服务器》。请仔细学习它的第1章、第3章、第6章、第10章、第11章。

下载地址: {微盘}

下面的命令可以运行Nginx服务器

//开启Nginx服务器
E:\nginx>nginx.exe -c conf/nginx4node.conf
//重新载入nginx4node.conf
E:\nginx>nginx.exe -s reload -c conf/nginx4node.conf

5.1 Nginx作为静态服务器

使用Node.js可以开发一个静态服务器,《用NodeJS打造你的静态文件服务器》。静态服务器是Nginx的专长,Node.js的专长是作为RESTful-API服务器。对于静态文件和流式数据,现阶段没有比使用Nginx更好的解决方案。
我们将一个静态网页的内容放到Nginx目录的html/diandian/之下,这么配置nginx4node.conf就可以让Nginx作为一个一个静态服务器:

worker_processes  1;

events {
	#use epoll;#这里又遇到epoll
    worker_connections  51200;#并发连接数
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

	#开启gzip模块
	gzip on;
	gzip_min_length 1100;
	gzip_buffers 4 8k;
	gzip_types text/plain application/x-javascript text/css;
	output_buffers 1 32k;
	postpone_output 1460; 	

	client_max_body_size 20m;#上传文件大小限制	

    server {
        listen       80;
		server_name  *.test1.com;

		location / {
			index index.html;
			root html\diandian;
		}
    }	

	server {
        listen       80;
		server_name  *.test2.com;

		location ~ ^/(static|image|css|js){
			index index.html;
			root html\diandian;
		}
    }
}

为了测试,我们将www.test1.com和www.test2.com指向本机,修改“C:\WINDOWS\system32\drivers\etc\host”文件:

127.0.0.1       localhost
127.0.0.1       www.test1.com
127.0.0.1       www.test2.com

我们访问http://www.test1.com,结果如下图所示。

在这个Nginx实例中,“*.test1.com”和“*.test2.com”是我们配置的虚拟主机。Nginx支持基于IP、基于域名、基于端口的3种虚拟主机。当然他还有路由的功能,将它配置成一个反向代理集群时,它会把不同的url请求,交给相应的集群去处理。我们看下面的例子。


5.2 Nginx反向代理负载均衡

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
传统的负载均衡方式还有:DNS轮询,软硬件四/七层负载均衡设备,多线多地区智能DNS解析等等。
我们将Nginx配置成一个反向代理服务器。静态内容还是放在html/diandian/之下,动态的RESTful-API我们让Node.js服务器来处理。nginx4node.conf配置如下:

worker_processes  1;
events {
    worker_connections  51200;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

	#开启gzip模块
	gzip on;
	gzip_min_length 1100;
	gzip_buffers 4 8k;
	gzip_types text/plain application/x-javascript text/css;
	output_buffers 1 32k;
	postpone_output 1460;
	client_max_body_size 20m;

	#配置API_Server服务器集群
	upstream API_Server_Cluster {
		server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
	} 

	#配置其他服务器集群,weight参数配置服务器权重
	upstream Apache_Server_Cluster {
		server 192.168.1.180:8070 weight=1 max_fails=2 fail_timeout=30s;
		server 192.168.1.181:8070 weight=1 max_fails=2 fail_timeout=30s;
		server 192.168.1.182:8070 weight=2 max_fails=2 fail_timeout=30s;
	} 

	server {
        listen       80;
		server_name  localhost;

		location / {
			index index.html;
			root html\diandian;
		}

		location ~ ^/(static|image|css|js){
			index index.html;
			root html\diandian;
		}	

		location  ~ ^/(api|nodeapi) {
			proxy_pass http://API_Server_Cluster;
			proxy_redirect off;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $remote_addr;
			client_max_body_size 10m;
			client_body_buffer_size 128k;
			proxy_connect_timeout 90;
			proxy_send_timeout 90;
			proxy_read_timeout 90;
			proxy_buffer_size 4k;
			proxy_buffers 4 32k;
			proxy_busy_buffers_size 64k;
			proxy_temp_file_write_size 64k;
		}
    }
}

用Node.js打开第四章中的那个“最简单的RESTful-API”服务器,监听8080端口。然后我们访问80端口。如下图所示。可以发现直接访问80端口,和第四章中访问8080端口,浏览器收到了同样的响应。


5.3 Ajax访问反向代理RESTful-API

Ajax是一种动态网页技术,它使用XMLHttpRequest对象,在浏览器与 Web 服务器之间使用异步数据传输。下面这个例子帮助我们理解Ajax。
我们写一个只有一个button按钮的网页,test.html如下:

<!doctype html>
<html>
<head>
</head>
<body>
	<button id="testAjax" value="">发送Ajax请求</button>
	<script type="text/javascript" src="/static/js/jquery.min.js"></script>
	<script type="text/javascript" src="/static/js/test.js"></script>
</body>
</html>

test.js如下:

$(document).ready(function () {//页面初始化完成,会执行此匿名函数。
	$("#testAjax").click(//"$"为jquery内置对象,"#"为id选择器。
		testAjax);//选择网页中id为"testAjax"的元素,注册点击事件回调函数
});

function testAjax() {
	$.getJSON("/api/test1", //jquery的一个内置方法,发送get请求,获得结果为JSON数据。
		function (result) { //服务器响应的JSON数据,会被自动转换为JavaScript对象。
		alert(JSON.stringify(result));
	});
}

将该页面和js代码当做静态文件放在服务器相应位置,通过浏览器访问测试,结果如下图所示:

这就是传说中的Ajax,抛开一些概念,它一点也不复杂。但有一点需要指出,那就是Ajax本身基于HTTP协议,是一种“客户端拉协议”。也就是说,只有客户端去访问服务器时才会得到响应,服务器不会主动去通知客户端。而为了在网页上实现一种交互应用,比如说“聊天室”,人们常常使用一种叫做Ajax长连接的技术。可以这么描述这种技术,客户端向服务器发送一个Ajax请求,服务器暂时不予响应,一直到需要通知客户端的事件发生,服务器才发出那个久违了的响应,就感觉是服务器主动通知客户端一样。

HTML5有一个socket io机制,Node.js也支持这种机制。由于IPv4网络中,有一个叫网络地址转换(NAT)的机制,它的存在,使得要建立P2P网络的工作变得异常复杂。同样也制约着“服务器推协议”的实现。所以,socket io暂时不把它列入本次学习的内容。但我们要知道,随着IPv6网络的普及,服务器推技术将会有广泛的应用。

在心底勾勒未来的蓝图,在隐忍中奋斗,在孤独中跋涉,用坚实的脚步慢慢靠近远方的憧憬。

本文目录:《一个周末掌握IT前沿技术之node.js篇》
1.《Node.js与javascript》
2.《Node.js与redis》
3.《Node.js与服务端模板引擎》
4.《Node.js与Restful API》
5.《Node.js与Nginx》
6.《Node.js与客户端模板引擎》
7.《Node.js与HBase》
文本粗陋,欢迎斧正!欢迎投稿!原创文章,转载请链接。
联系邮箱:(it.Web.technical#gmail.com)
IT技术精研院
 

Leave a Reply

无觅相关文章插件,快速提升流量