专注服务器设计、开发; https://github.com/justscu;
分类: 服务器与存储
2014-01-27 09:57:00
本文编译nginx-1.4.4源码和可选模块push-stream-module。
使用http技术实现管道长连接,可以用于消息的推送。用pub/sub模式来管理长链接,一端sub,一端pub。当pub发送消息时,所有的sub都可以收到该消息。
代码主页:
假设nginx-1.4.4放到"~/commlib/src/nginx-1.4.4"目录,nginx-push-stream-module放到"~/commlib/src/nginx-push-stream-module-master"目录。1.2 测试
(1) 进入到nginx目录, cd ~/commlib/src/nginx-1.4.4/
(2) 配置:./configure --prefix=~/commlib/u01/nginx-1.4.4 --add-module=~/commlib/src/nginx-push-stream-module-master/ --with-http_ssl_module --with-openssl=~/commlib/src/openssl-1.0.1c/ [注:openssl的源文件路径]
(3) make & make install点击(此处)折叠或打开
- Configuration summary
- + using system PCRE library
- + using OpenSSL library: ~/commlib/u01/openssl-1.0.1c/
- + md5: using system crypto library
- + sha1: using system crypto library
- + using system zlib library
- nginx path prefix: "~/commlib/u01/nginx-1.4.4"
- nginx binary file: "~/commlib/u01/nginx-1.4.4/sbin/nginx"
- nginx configuration prefix: "~/commlib/u01/nginx-1.4.4/conf"
- nginx configuration file: "~/commlib/u01/nginx-1.4.4/conf/nginx.conf"
- nginx pid file: "~/commlib/u01/nginx-1.4.4/logs/nginx.pid"
- nginx error log file: "~/commlib/u01/nginx-1.4.4/logs/error.log"
- nginx http access log file: "~/commlib/u01/nginx-1.4.4/logs/access.log"
- nginx http client request body temporary files: "client_body_temp"
- nginx http proxy temporary files: "proxy_temp"
- nginx http fastcgi temporary files: "fastcgi_temp"
- nginx http uwsgi temporary files: "uwsgi_temp"
- nginx http scgi temporary files: "scgi_temp"
cd ~/commlib/u01/nginx-1.4.4/sbin;
./nginx -c ~/commlib/src/nginx-push-stream-module-master/misc/nginx.conf -t
其中: -c: 指定配置文件; -t: 测试
若出现 nginx: the configuration file ~/commlib/src/nginx-push-stream-module-master/misc/nginx.conf syntax is ok1.3 运行
nginx: configuration file ~/commlib/src/nginx-push-stream-module-master/misc/nginx.conf test is successful
表明成功。
./nginx -c ~/commlib/src/nginx-push-stream-module-master/misc/nginx.conf1.4 增加任意启动目录
由于openssl中包含sha1的功能,也可以用openssl提供的功能,即libcrypto库来解决。首先看看系统中是否含有libcrypto库(执行whereis libcrypto命令),若没有的话,可以将openssl编译后生成的libcrypto.a拷贝到/user/lib目录下,并执行sudo ldconfig命令。之后再重新配置(./configure)。Configuration summary+ using system PCRE library+ using OpenSSL library: /home/ll/commlib/openssl-1.0.1c+ using builtin md5 code+ sha1 library is not found+ using system zlib library---------------------------------------In file included from src/core/ngx_crypt.c:12:src/core/ngx_sha1.h:19: fatal error: sha.h: No such file or directorycompilation terminated.make[1]: *** [objs/src/core/ngx_crypt.o] Error 1make[1]: Leaving directory `/home/ll/work/nginx-1.4.4'make: *** [build] Error 2
Configuration summary+ using system PCRE library+ using OpenSSL library: /home/ll/commlib/openssl-1.0.1c+ md5: using system crypto library+ sha1: using system crypto library+ using system zlib library
至此,问题顺利解决。
执行sudo ldconfig -p,可以查看系统中库的位置。
3 测试
利用curl,对nginx的pub/sub功能进行简单测试。curl是文件传输工具,可以发送/接收http数据包。
(1)启动nginx,命令为:./nginx -c ~/commlib/src/nginx-push-stream-module-master/misc/nginx.conf。这里用的是push-stream-module的配置。假设nginx服务器的地址和端口为 10.15.62.31:10800。
(2)订阅sub。起命令行,输入:curl ,在命令行下会打印给nginx服务器发的http协议的内容(GET)。
(3)发布pub。另起命令行,输入:curl -d helloworld 。该命令是向nginx的c1通道发布一条数据(POST),数据的内容为helloworld。
此时,在订阅命令行下,可以看到curl收到的消息。
(4)删除delete。另起命令行,输入:curl -X DELETE ''。该命令是让nginx删除c1通道(DELETE)。之后除非重新订阅,否则pub无效。
(5)测试发现,客户端可以启动5W条链接至nginx,同时每条链接进行5个不同的订阅。nginx的性能完全没有问题。
在测试中,发现open too many files错误是,可能是你系统的fd太少(用ulimit -a查看),调大即可,具体方法见TCP状态之CLOSE_WAIT。
4 为Nginx增加动态库
点击(此处)折叠或打开
点击(此处)折叠或打开
第一种方法:在执行./cofigure后,会生成objs目录,及Makefile文件。修改objs/Makefile文件。
在$(LINK)后面,加上对应的so文件路径
objs/src/http/modules/ngx_http_upstream_keepalive_module.o \
objs/addon/src/ngx_http_push_stream_module.o \
objs/ngx_modules.o \
-L/home/ll/work/so_create -ldl -lprint_so -lpthread -lcrypt -lpcre -lcrypto -lcrypto -lz
第二种方法:在执行./configure命令之前,修改auto/options文件。
NGX_DEBUG=NO
#NGX_CC_OPT=
# 不优化,便于调试,加上调试信息
NGX_CC_OPT="-O0 -g"
# 新增加的so文件及其路径
NGX_LD_OPT="-L/home/ll/work/so_create -ldl -lprint_so"
CPU=NO
(4)编译,运行
make & make install