菜鸟玩云计算之六:Ubuntu Server 12.10 上安装 nodejs, zeromq

Ubuntu Server 12.10 上安装 python, nodejs, zeromq


nodejs是一个基于google v8+javascript的服务端编程框架。对于搞云计算,用nj来做系统管理Web站点是非常合适的。理由是:

a.足够简单。
b.足够快。
c.足够小巧。
d.前后端一致性。

下面是安装步骤:

1 首先确保系统安装了python, gcc, g++,如果没有则安装:

$ sudo apt-get install python
$ sudo apt-get install build-essential
$ sudo apt-get install gcc
$ sudo apt-get install g++

2 安装 python bindings


2.1 安装python自动安装工具: easy_install

$ sudo apt-get install python-setuptools

2.2 安装python的编译环境

$ sudo apt-get install python-dev

2.3 安装 pythong zmq 的 binding:

$ sudo easy_install pyzmq

3 下载最新版源代码包:node-v0.8.14.tar.gz


3.1 解压:

$ sudo tar -zxf node-v0.8.14.tar.gz
$ cd node-v0.8.14

3.2 默认方式安装:


$ ./configure
$ make
$ sudo make install

3.3 选择目录方式安装:

$ ./configure --prefix=/opt/node
$ make -j 3     # 3=CPU核数+1
$ sudo make install

安装结束后, 用下面的命令检查安装的版本:
$ node --version
v0.8.14

3.4 接下来参考下面的文章开始你的nodejs编程之旅吧:


http://www.nodebeginner.org/index-zh-cn.html#a-full-blown-web-application-with-nodejs

4 zeromq

zmq 是一个基于c的消息队列编程框架。zeromq用处很多, 它具有:


a.足够简单。
b.足够快。
c.足够小巧。

等优点. 下面是安装步骤:

4.1 下载: zero-3.2.1

http://www.zeromq.org/

$ tar -xzf zeromq-3.2.1.tar.gz
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig

4.2 下面写一个c的客户端mqclient.c和一个服务端mqserver.c测试:


[cpp]  view plain copy print ?
  1. <span style="font-size:12px;">//  
  2. // mqclient.c  
  3. // Hello World client  
  4. // Connects REQ socket to tcp://localhost:5555  
  5. // Sends "Hello" to server, expects "World" back  
  6. //  
  7. #include <zmq.h>  
  8. #include <string.h>  
  9. #include <stdio.h>  
  10. #include <unistd.h>  
  11.   
  12. int main (void)  
  13. {  
  14.     void *context = zmq_ctx_new ();  
  15.   
  16.     // Socket to talk to server  
  17.     printf ("Connecting to hello world server…\n");  
  18.     void *requester = zmq_socket (context, ZMQ_REQ);  
  19.     zmq_connect (requester, "tcp://localhost:5555");  
  20.   
  21.     int request_nbr;  
  22.     for (request_nbr = 0; request_nbr != 10; request_nbr++) {  
  23.         zmq_msg_t request;  
  24.                   
  25.         zmq_msg_init_data (&request, "Hello", 6, 0, 0);  
  26.   
  27.         printf ("Sending Hello %d…\n", request_nbr);  
  28.         zmq_msg_send (&request, requester, 0);  
  29.         zmq_msg_close (&request);  
  30.                 printf ("prepare recv message\n");  
  31.   
  32.         zmq_msg_t reply;  
  33.         zmq_msg_init (&reply);  
  34.         if (-1==zmq_msg_recv (&reply, requester, 0)) {  
  35.             printf("recv data error.\n");  
  36.         }  
  37.         printf ("Received World %d\n", request_nbr);  
  38.         zmq_msg_close (&reply);  
  39.     }  
  40.     zmq_close (requester);  
  41.     zmq_ctx_destroy (context);  
  42.     return 0;  
  43. }</span>  


[cpp]  view plain copy print ?
  1. <span style="font-size:12px;">//  
  2. // mqserver.c  
  3. // Hello World server  
  4. // Binds REP socket to tcp://*:5555  
  5. // Expects "Hello" from client, replies with "World"  
  6. //  
  7. #include <zmq.h>  
  8. #include <stdio.h>  
  9. #include <unistd.h>  
  10. #include <string.h>  
  11.   
  12. int main (void)  
  13. {  
  14.     int ret;  
  15.     char buf[5]="world";  
  16.     buf[5] = 0;  
  17.     void *context = zmq_ctx_new ();  
  18.   
  19.     // Socket to talk to clients  
  20.     void *responder = zmq_socket (context, ZMQ_REP);  
  21.     ret = zmq_bind (responder, "tcp://*:5555");  
  22.         if (ret==0) {  
  23.         printf("zmq_bind success\n");  
  24.     } else {  
  25.         printf("zmq_bind error=%d:%s\n", ret, strerror(errno));  
  26.         exit(ret);  
  27.         }  
  28.     while (1==1) {  
  29.         // Wait for next request from client  
  30.                 printf("wait for clients...\n");  
  31.         zmq_msg_t request;  
  32.         zmq_msg_init (&request);  
  33.         ret = zmq_msg_recv (&request, responder, 0);  
  34.         printf ("Received=%d\n", ret);  
  35.         zmq_msg_close (&request);  
  36.   
  37.         // Do some 'work'  
  38.         sleep (1);  
  39.   
  40.         // Send reply back to client  
  41.         zmq_msg_t reply;  
  42.         zmq_msg_init_data (&reply, buf, 6, 0, 0);  
  43.         ret = zmq_msg_send (&reply, responder, 0);  
  44.                 printf("zmq_msg_send ret=%d\n", ret);  
  45.         zmq_msg_close (&reply);  
  46.     }  
  47.     // We never get here but if we did, this would be how we end  
  48.     zmq_close (responder);  
  49.     zmq_ctx_destroy (context);  
  50.     return 0;  
  51. }</span>  


下面是编译命令:
$ gcc mqclient.c -o mqclnt -lzmq
$ gcc mqserver.c -o mqsrvr -lzmq

运行:
$ ./mqsrvr &

$ ./mqclnt

5 使用python来编写zeromq程序

参考:  http://zguide.zeromq.org/py:all


这是一个发布(PUB)和订阅(SUB)模型。发布者发布信息,订阅者接收并处理和自己相关的信息。一个发布者对应多个订阅者。

               |----->SUB a
PUB------>|----->SUB b
               |----->SUB c

5.1 发布者:mqpub.py


[python]  view plain copy print ?
  1. <span style="font-size:12px;">#############################################################  
  2. # mqpub.py  
  3. # Weather update server  
  4. # Binds PUB socket to tcp://*:5556  
  5. # Publishes random weather updates  
  6. #############################################################  
  7.   
  8. import zmq  
  9. import random  
  10.   
  11. context = zmq.Context()  
  12. socket = context.socket(zmq.PUB)  
  13. socket.bind("tcp://*:5556")  
  14.   
  15. while True:  
  16.     zipcode = random.randrange(1,100000)  
  17.     temperature = random.randrange(1,215) - 80  
  18.     relhumidity = random.randrange(1,50) + 10  
  19.   
  20. socket.send("%d %d %d" % (zipcode, temperature, relhumidity))</span>  

5.2 订阅者:mqsub.py

[python]  view plain copy print ?
  1. <span style="font-size:12px;">#############################################################  
  2. # mqsub.py  
  3. # Weather update client  
  4. # Connects SUB socket to tcp://localhost:5556  
  5. # Collects weather updates and finds avg temp in zipcode  
  6. #############################################################  
  7.   
  8. import sys  
  9. import zmq  
  10.   
  11. # Socket to talk to server  
  12. context = zmq.Context()  
  13. socket = context.socket(zmq.SUB)  
  14.   
  15. print "Collecting updates from weather server"  
  16. socket.connect ("tcp://localhost:5556")  
  17.   
  18. # Subscribe to zipcode, default is NYC, 10001  
  19. zip_filter = sys.argv[1if len(sys.argv) > 1 else "10001"  
  20. socket.setsockopt(zmq.SUBSCRIBE, zip_filter)  
  21.   
  22. # Process 5 updates  
  23. total_temp = 0  
  24. for update_nbr in range (5):  
  25.     string = socket.recv()  
  26.     zipcode, temperature, relhumidity = string.split()  
  27.     total_temp += int(temperature)  
  28.   
  29. print "Average temperature for zipcode '%s' was %dF" % (zip_filter, total_temp / update_nbr)</span>  

5.3 打开2个终端,分别运行:

$ python ./mqpub.py

$ python ./mqsub.py

你可能感兴趣的:(菜鸟玩云计算之六:Ubuntu Server 12.10 上安装 nodejs, zeromq)