nginx源码分析-源码结构
[ 2009/05/08 18:36 | by selboo ]
本文主要简单介绍nginx源码目录结构、程序编译流程、如何构建学习nginx的环境等。
本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该版本的src目录下共有96615行代码,共记234个源码文件。
注:本系统的文章为本人学习做笔记用,为源码分析,而非模块的编写,可能会存在问题。
1.1 源码目录简述
nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明:
1.2 程序编译流程
nginx有许多值得学习的地方,它的编译脚本也不例外。nginx的编译脚本非由autoconf等相关工具生成,都是由作者手工编写的。
列举几个与后续开发相关的目录并做说明:
src/auto/modules 根据configure和编译环境的条件生成相应的模块信息。见:ngx_modules.c
src/auto/sources 定义了不同的模块的生成规则,包括相关的源文件、依赖等,最终编译过程中会生成相应的库文件。
nginx在编译安装的过程中会生成objs目录,其中包括编译过程中生成的库文件,以及相关的配置文件,进入目录会存在以下文件:
ngx_auto_config.h 生成的与程序运行相关的宏
ngx_modules.c 由编译生成的模块相关的定义
src 该目录下有许多生成的库文件,作为最终生成nginx使用
1.3 构建nginx学习环境
分析nginx源码的目的是学习nginx高效的处理能力的体系结构,并能将其思想,甚至于nginx的框架借用于服务端的开发。从可扩展的模块机制、内存管理、事件系统等各个方面都有许多值得学习的地方。
但nginx的源代码的核心包间的关联度较高,其它核心的几个数据结构,包括ngx_connection\ngx_array\ngx_buf\ngx_command等等几乎存在于代码每一个角落,我在第一次看0.1.0的时候(0.1.0是网上能找到的nginx的最早版本),发现很难将它们独立出来去对这些数据结构进行测试和学习,于是总结出自己学习的一些方法如下:
学习和熟悉核心数据结构的方法:
1、先熟悉常用的数据结构的使用,包括以下:
ngx_pool\ngx_connection\ngx_array\ngx_buf\
ngx_command\ngx_log\ngx_event\ngx_cycle\ngx_str等
对于这些数据结构的使用方法的原理基本熟悉,学习的方法就是看他们的实现以及http和mail中的使用,熟能生巧。
2、删除nginx.c中main函数的主体,在1的基础上学习其它内容,这样就不需要过多关注nginx的复杂的编译脚本就能学习到相应的知识。
附带基于nginx-0.1.0框架实现的简单echo服务端,程序读取用户输入内容,然后将该内容输出,定时断开连接。
终端:
目录结构:
如果需要该部分代码的朋友可以留下Email地址。
下一节准备对nginx的启动流程做分析。
本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该版本的src目录下共有96615行代码,共记234个源码文件。
注:本系统的文章为本人学习做笔记用,为源码分析,而非模块的编写,可能会存在问题。
1.1 源码目录简述
nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明:
├─auto 自动编译安装相关目录
│ ├─cc 针对各种编译器进行相应的编译配置目录,包括Gcc、Ccc等
│ ├─lib 程序依赖的各种库,包括md5,openssl,pcre等
│ ├─os 针对不同操作系统所做的编译配置目录
│ └─types
├─conf 相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等
├─contrib
├─html index.html
└─src 源码目录
├─core 核心源码目录,包括定义常用数据结构、体系结构实现等
├─event 封装的事件系统源码目录
├─http http服务器实现目录
├─mail 邮件代码服务器实现目录
├─misc 该目录当前版本只包含google perftools包
└─os nginx对各操作系统下的函数进行封装以及实现核心调用的目录。
│ ├─cc 针对各种编译器进行相应的编译配置目录,包括Gcc、Ccc等
│ ├─lib 程序依赖的各种库,包括md5,openssl,pcre等
│ ├─os 针对不同操作系统所做的编译配置目录
│ └─types
├─conf 相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等
├─contrib
├─html index.html
└─src 源码目录
├─core 核心源码目录,包括定义常用数据结构、体系结构实现等
├─event 封装的事件系统源码目录
├─http http服务器实现目录
├─mail 邮件代码服务器实现目录
├─misc 该目录当前版本只包含google perftools包
└─os nginx对各操作系统下的函数进行封装以及实现核心调用的目录。
1.2 程序编译流程
nginx有许多值得学习的地方,它的编译脚本也不例外。nginx的编译脚本非由autoconf等相关工具生成,都是由作者手工编写的。
列举几个与后续开发相关的目录并做说明:
src/auto/modules 根据configure和编译环境的条件生成相应的模块信息。见:ngx_modules.c
src/auto/sources 定义了不同的模块的生成规则,包括相关的源文件、依赖等,最终编译过程中会生成相应的库文件。
nginx在编译安装的过程中会生成objs目录,其中包括编译过程中生成的库文件,以及相关的配置文件,进入目录会存在以下文件:
ngx_auto_config.h 生成的与程序运行相关的宏
ngx_modules.c 由编译生成的模块相关的定义
src 该目录下有许多生成的库文件,作为最终生成nginx使用
1.3 构建nginx学习环境
分析nginx源码的目的是学习nginx高效的处理能力的体系结构,并能将其思想,甚至于nginx的框架借用于服务端的开发。从可扩展的模块机制、内存管理、事件系统等各个方面都有许多值得学习的地方。
但nginx的源代码的核心包间的关联度较高,其它核心的几个数据结构,包括ngx_connection\ngx_array\ngx_buf\ngx_command等等几乎存在于代码每一个角落,我在第一次看0.1.0的时候(0.1.0是网上能找到的nginx的最早版本),发现很难将它们独立出来去对这些数据结构进行测试和学习,于是总结出自己学习的一些方法如下:
学习和熟悉核心数据结构的方法:
1、先熟悉常用的数据结构的使用,包括以下:
ngx_pool\ngx_connection\ngx_array\ngx_buf\
ngx_command\ngx_log\ngx_event\ngx_cycle\ngx_str等
对于这些数据结构的使用方法的原理基本熟悉,学习的方法就是看他们的实现以及http和mail中的使用,熟能生巧。
2、删除nginx.c中main函数的主体,在1的基础上学习其它内容,这样就不需要过多关注nginx的复杂的编译脚本就能学习到相应的知识。
附带基于nginx-0.1.0框架实现的简单echo服务端,程序读取用户输入内容,然后将该内容输出,定时断开连接。
终端:
-bash-3.2# !te
telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
ops init connection
test
test
connection timedout
Connection closed by foreign host.
telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
ops init connection
test
test
connection timedout
Connection closed by foreign host.
目录结构:
├─core
├─event
│ └─modules
├─ops
│ ├─ngx_ops.c
│ └─ngx_ops.h
└─os
└─unix
├─event
│ └─modules
├─ops
│ ├─ngx_ops.c
│ └─ngx_ops.h
└─os
└─unix
如果需要该部分代码的朋友可以留下Email地址。
下一节准备对nginx的启动流程做分析。
Nginx在url最后补全"/"符号
[ 2009/03/29 22:22 | by selboo ]
from:http://blog.chinaunix.net/u1/55815/showart_1883628.html
今天自己在nginx环境下配置了一个wordpress,用来在实际的应用中学习nginx,不料,却遇到了个小问题,先把文件解决办法总结如下。
我设置了一个域名:http://www.wenzi.cn/
我的wordpress地址是:http://www.wenzi.cn/wordpress/
现在的问题就是如果我访问http://www.wenzi.cn/wordpress/就可以显示出我的blog的地址,但如果我访问http://www.wenzi.cn/wordpress结果却提示说找不到所需要的页面。群里问了一下,说是,nginx不会自动在请求的最后加上一个/的,原因是nginx不会自动判断请求的是一个文件还是一个目录,google上可以搜到解决办法,于是乎我就去google了一下,确实找到了
在配置文件中location里加入如下代码
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
这样再对http://www.wenzi.cn/wordpress请求,nginx就会进行判断了,如果请求的是一个文件夹,会自动在最后加上/符号,如果请求的是一个文件,则不会改变原有url
接下来对这段代码进行一个解释
1,if (-d $request_filename),如果请求的是一个文件夹,则为真,进到if语句中执行
2,rewrite是执行url重写操作
3,^/(.*)([^/])$表示以/符号开始并紧跟着任何字符,同时不是以/为结束的字符串,在我的url中,(.*)表示的wordpres,([^/])表示的s
4,http://$host/$1$2/ 表示的重写后的地址,$host是请求的域名,$1是前面第一个括号里的内容,在我的url里就是wordpres $2是前面第二个括号里的内容,在我的url里是s
5,permanent表示,返回值是301
今天自己在nginx环境下配置了一个wordpress,用来在实际的应用中学习nginx,不料,却遇到了个小问题,先把文件解决办法总结如下。
我设置了一个域名:http://www.wenzi.cn/
我的wordpress地址是:http://www.wenzi.cn/wordpress/
现在的问题就是如果我访问http://www.wenzi.cn/wordpress/就可以显示出我的blog的地址,但如果我访问http://www.wenzi.cn/wordpress结果却提示说找不到所需要的页面。群里问了一下,说是,nginx不会自动在请求的最后加上一个/的,原因是nginx不会自动判断请求的是一个文件还是一个目录,google上可以搜到解决办法,于是乎我就去google了一下,确实找到了
在配置文件中location里加入如下代码
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
这样再对http://www.wenzi.cn/wordpress请求,nginx就会进行判断了,如果请求的是一个文件夹,会自动在最后加上/符号,如果请求的是一个文件,则不会改变原有url
接下来对这段代码进行一个解释
1,if (-d $request_filename),如果请求的是一个文件夹,则为真,进到if语句中执行
2,rewrite是执行url重写操作
3,^/(.*)([^/])$表示以/符号开始并紧跟着任何字符,同时不是以/为结束的字符串,在我的url中,(.*)表示的wordpres,([^/])表示的s
4,http://$host/$1$2/ 表示的重写后的地址,$host是请求的域名,$1是前面第一个括号里的内容,在我的url里就是wordpres $2是前面第二个括号里的内容,在我的url里是s
5,permanent表示,返回值是301
Linux下webbench压力测试
[ 2009/03/04 20:12 | by selboo ]
下载安装
[root@wpcn ~]# tar -zxvf webbench-1.5.tar.gz
[root@wpcn ~]# cd webbench-1.5
[root@wpcn webbench-1.5]# make && make install
使用方法
[root@wpcn webbench-1.5]# webbench --help
webbench [option]... URL
-f|--force Don't wait for reply from server.
-r|--reload Send reload request - Pragma: no-cache.
-t|--time Run benchmark for seconds. Default 30.
-p|--proxy Use proxy server for request.
-c|--clients Run HTTP clients at once. Default one.
-9|--http09 Use HTTP/0.9 style requests.
-1|--http10 Use HTTP/1.0 protocol.
-2|--http11 Use HTTP/1.1 protocol.
--get Use GET request method.
--head Use HEAD request method.
--options Use OPTIONS request method.
--trace Use TRACE request method.
-?|-h|--help This information.
-V|--version Display program version.
以下是我在vmware测试
[root@wpcn webbench-1.5]# webbench -c 300 -t 5 http://127.0.0.1/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://127.0.0.1/
300 clients, running 5 sec.
Speed=108240 pages/min, 1813374 bytes/sec.
Requests: 9020 susceed, 0 failed.
-c 300 模拟300客户端连接
-t 5 是连接5秒钟
Speed=108240 pages/min 每分钟浏览http://127.0.0.1/selboo.php 这个页面108240次
1813374 bytes/sec. 每秒1813374个字节
Requests: 9020 susceed 连接成功9020
0 failed. 失败0
在介绍一个牛命令 from:http://blog.s135.com/post/269.htm
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
TCP状态描述:
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
[root@wpcn ~]# tar -zxvf webbench-1.5.tar.gz
[root@wpcn ~]# cd webbench-1.5
[root@wpcn webbench-1.5]# make && make install
使用方法
[root@wpcn webbench-1.5]# webbench --help
webbench [option]... URL
-f|--force Don't wait for reply from server.
-r|--reload Send reload request - Pragma: no-cache.
-t|--time
-p|--proxy
-c|--clients
-9|--http09 Use HTTP/0.9 style requests.
-1|--http10 Use HTTP/1.0 protocol.
-2|--http11 Use HTTP/1.1 protocol.
--get Use GET request method.
--head Use HEAD request method.
--options Use OPTIONS request method.
--trace Use TRACE request method.
-?|-h|--help This information.
-V|--version Display program version.
以下是我在vmware测试
[root@wpcn webbench-1.5]# webbench -c 300 -t 5 http://127.0.0.1/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://127.0.0.1/
300 clients, running 5 sec.
Speed=108240 pages/min, 1813374 bytes/sec.
Requests: 9020 susceed, 0 failed.
-c 300 模拟300客户端连接
-t 5 是连接5秒钟
Speed=108240 pages/min 每分钟浏览http://127.0.0.1/selboo.php 这个页面108240次
1813374 bytes/sec. 每秒1813374个字节
Requests: 9020 susceed 连接成功9020
0 failed. 失败0
下载文件 (已下载 409 次)
在介绍一个牛命令 from:http://blog.s135.com/post/269.htm
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
TCP状态描述:
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉