nginx详细文档.docx
- 文档编号:30625882
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:77
- 大小:61.25KB
nginx详细文档.docx
《nginx详细文档.docx》由会员分享,可在线阅读,更多相关《nginx详细文档.docx(77页珍藏版)》请在冰豆网上搜索。
nginx详细文档
nginx详细文档
(安装配置,深入源码,模块编写,编译器参数,系统函数)
吴东
April28,2009
Contents
Contents1
Chapter1前言2
Chapter2基本配置3
2.1安装3
2.2.配置说明5
2.3启动和控制17
Chapter3深入源码18
3.1源码结构18
3.2configure配置18
3.3nginx源码习惯18
3.4.常用基础库18
3.5.core模块28
3.6event模块32
3.7http模块34
Chapter4模块编写38
4.1http模块编写39
4.2基于nginx的高性能服务器开发39
4.2.基于nginx的高性能服务器开发Chapter4.模块编写39
Chapter5附录39
5.1编译器参数39
5.2系统函数41
Chapter1前言
在互联网编程中,http服务器编程作为一个非常重要方向一直为各种语言所重视,从c语言的apache,Lighttpd到当前非常流行的nginx。
Java有tom-cat,jetty,websphere等众多服务器,pyhoen的zope等服务器。
既有重量级的服务器,又有轻量级的,嵌入式的服务器。
从互联网的应用来说,c语言的http服务器一直占有主导地位,当前最流行的三个开源服务器有apache,Lighttpd和nginx。
Apache作为经典的Web服务器,除了慢没有别的缺点了,Apache2对fcgi支持并不好,非常好用的proxy和proxy_ajp(很多人用它作为tomcat的前端),不支持epoll(这年头,epoll几乎是性能的必备)。
Lighttpd作为杀手级的静态文件能力,杀手级的fcgi能力但是proxy模块不够稳定。
Nginx速度快,占用资源少,杀手级的proxy和rewrite,非常不错的静态文件能力,最适合作为整个网站的前端服务(将php、svn等不同请求发送往后端apache)。
现在国内Nginx的用户越来越多了,多数拥抱Nginx的网站都钟意其优异的性能表现,如果是相对比较大的网站,节约下来的服务器成本无疑是客观的。
当前Ngnix美中不足之处是相关的文档和用户经验都还是很欠缺,用户之间还很难做到可借鉴性的交流。
最近因为朋友遇到一些技术问题,我也翻阅了不少Nginx的邮件列表内容,发现大量的技术细节仍然在频繁变化中,可是中文社区内相关的记录和讨论太少了。
相信国内这些Nginx用户积攒的经验肯定是不少的,但可能是因为某些其它因素考虑而看不到相关的技术分享。
本书的写作就是为了向大家展示nginx的内部结构,以便于大家更好的使用该服务器。
对于一个八万行代码的http服务器,从性能来看它是那么的出色,从功能来看它并不逊色于几十万行的apache服务器。
Nginx是实现有几个非常出色的地方:
模块化设计,流水线请求处理,多进程控制,epoll的使用,平滑的升级程序或是配置文件。
Nginx采用的是单线程的方式,网络服务器的几种模型可以参考C10K的介绍。
当然,如果在linux下,最好的模型自然是EPool(effectiveepoll?
)。
目前一台服务器支持10K个客户访问,基本上还比较麻烦,64位的CPU,可能是一个比较好的解决方案。
2块1000M网卡,10K客户端,每个客户端的带宽是2000/10000=200K,这是理论值,勉强可行。
考虑一下纯粹的线程模型。
10K个客户端,需要10K个线程。
考虑到每个进程3G的用户空间,那么每个线程的空间是3000M/10K=300K,只能说非常勉强可以运行(每个线程的cruntime大约需要2-3K空间)。
但是大量的线程调度会极大的减缓系统效率。
再考虑一下多个进程的模型,每个进程创建多个线程。
其实与纯粹的线程模型差异不大,不过是每个线程的用户空间不受太大限制。
大量的线程调度带来的巨大性能损耗会使得整个系统效率及其低下。
当然,这种模型也不是一无是处,对于客户端数目不多的情况,比如ftp服务器,这种模型是非常合适的。
然后就剩下epoll模型。
要使用epoll模型,首先必须有Linux2.6的内核。
了解select模型的人都知道,select每个句柄只能支持64个socket,这可以通过阅读linuxselect.h知道。
而Poll模型则是一种事件触发的模型,没有64个socket的限制。
epoll是对Poll模型的一个改造,让一个Poll句柄可以同时支持多个Socket句柄,好处是将大量Poll句柄的事件探测机制放到内核中处理,大大减少了将数据从内核态拷贝到用户态的次数,从而提高效率。
阅读Linux的源码可以看到,epoll的内部使用的是一个Hashmap,Hashmap中存放Poll对象,所以从根本上来说,epoll模型是一种更好的Poll模型(我一直理解为EffectivePoll)。
当然nginx也有不足的地方,例如各个模块之间的耦合性太强,各个模块不适合直接拿出来使用。
Nginx的作者过于强调按照他自己所理解的模块化,而把一些基础模块也用作者所谓的模块化来实现,导致代码相互引用太多,艰涩难懂。
本书的编写的面向的用户除了初级linux工程师外,还可以为中高级linux工程师作为开发高性能服务器的工具书,目的除了向用户展示nginx精巧的设计和完整的实现外,还希望通过本书的讲解能够让用户以nginx作为基本框架或是自己实现更多的高性能服务器。
Chapter2基本配置
2.1安装
安装依赖模块
1.gzip模块需要zlib库,该模块在
2.rewrite模块需要pcre库,该模块在http:
//www.pcre.org/网站下载。
3.ssl功能需要openssl库该模块在http:
//www.openssl.org/网站下载。
官方源代码下载
在http:
//sysoev.ru/nginx/download.html网站上可以下载nginx源代码。
使用源代码安装
Nginx使用Unix下常用的‘./configure&&make&&makeinstall’过程来编译安装。
configure脚本确定系统所具有一些特性,特别是nginx用来处理连接的方法。
然后,它创建Makefile文件。
configure支持下面的选项:
–prefix=
-Nginx安装路径。
如果没有指定,默认为/usr/local/nginx。
–sbin-path=
-Nginx可执行文件安装路径。
只能安装时指定,如果没有指定,默认为
/sbin/nginx。
–conf-path=
-在没有给定-c选项下默认的nginx.conf的路径。
如果没有指定,默认为
/conf/nginx.conf。
–pid-path=
-在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径。
如果没有指定,默认为
/logs/nginx.pid。
–lock-path=
-nginx.lock文件的路径。
–error-log-path=
-在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。
如果没有指定,默认为
/logs/er-ror.log。
–http-log-path=
-在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。
如果没有指定,默认为
/logs/ac-cess.log。
–user=-在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。
如果没有指定,默认为nobody。
–group=-在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。
如果没有指定,默认为nobody。
–builddir=DIR-指定编译的目录–with-rtsig_module-启用rtsig模块
–with-select_module–without-select_module-允许或不允许开启SE-LECT模式,如果configure没有找到更合适的模式,比如:
kqueue(sunos),epoll(linuxkenel2.6+),rtsig(实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相同,都是采用轮训方法)SELECT模式将是默认安装模式
–with-poll_module–without-poll_module-允许或不允许开启pool模式.–with-http_ssl_module-开启HTTPSSL模块,使NGINX可以支持HTTPS请求。
这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl–with-http_realip_module-启用ngx_http_realip_module。
–with-http_addition_module-启用ngx_http_addition_module–with-http_sub_module-启用ngx_http_sub_module–with-http_dav_module-启用ngx_http_dav_module–with-http_flv_module-启用ngx_http_flv_module–with-http_stub_status_module-启用“serverstatus”页–without-http_charset_module-禁用ngx_http_charset_module–without-http_gzip_module-禁用ngx_http_gzip_module.如果启用,需要zlib。
–without-http_ssi_module-禁用ngx_http_ssi_module–without-http_userid_module-禁用ngx_http_userid_module–without-http_access_module-禁用ngx_http_access_module–without-http_auth_basic_module-禁用ngx_http_auth_basic_module–without-http_autoindex_module-禁用ngx_http_autoindex_module–without-http_geo_module-禁用ngx_http_geo_module–without-http_map_module-禁用ngx_http_map_module–without-http_referer_module-禁用ngx_http_referer_module–without-http_rewrite_module-禁用ngx_http_rewrite_module.如果启用需要PCRE。
–without-http_proxy_module-禁用ngx_http_proxy_module
–without-http_fastcgi_module-禁用ngx_http_fastcgi_module–without-http_memcached_module-禁用ngx_http_memcached_module–without-http_limit_zone_module-禁用ngx_http_limit_zone_module–without-http_empty_gif_module-禁用ngx_http_empty_gif_module–without-http_browser_module-禁用ngx_http_browser_module–without-http_upstream_ip_hash_module-禁用ngx_http_upstream_ip_hash_module–with-http_perl_module-启用ngx_http_perl_module–with-perl_modules_path=PATH-指定perl模块的路径–with-perl=PATH
-指定perl执行文件的路径–http-log-path=PATH-Setpathtothehttpaccesslog–http-client-body-temp-path=PATH-Setpathtothehttpclient
requestbodytemporaryfiles–http-proxy-temp-path=PATH-Setpathtothehttpproxytemporaryfiles–http-fastcgi-temp-path=PATH-Setpathtothehttpfastcgitem-
poraryfiles–without-http-禁用HTTPserver–with-mail-启用IMAP4/POP3/SMTP代理模块–with-mail_ssl_module-启用ngx_mail_ssl_module–with-cc=PATH-指定C编译器的路径–with-cpp=PATH-指定C预
处理器的路径–with-cc-opt=OPTIONS-AdditionalparameterswhichwillbeaddedtothevariableCFLAGS.WiththeuseofthesystemlibraryPCREinFreeBSD,itisnecessarytoindicate–with-cc-opt=”-I/usr/local/include”.Ifweareusingselect()anditisnecessarytoincreasethenumberoffiledescriptors,then
thisalsocanbeassignedhere:
–with-cc-opt=”-DFD_SETSIZE=2048″.–with-ld-opt=OPTIONS-Additionalparameterspassedtothelinker.
WiththeuseofthesystemlibraryPCREinFreeBSD,itisnecessarytoindicate–with-ld-opt=”-L/usr/local/lib”.
–with-cpu-opt=CPU-为特定的CPU编译,有效的值包括:
pentium,pentiumpro,pentium3,pentium4,athlon,opteron,amd64,sparc32,sparc64,ppc64
–without-pcre-禁止PCRE库的使用。
同时也会禁止HTTPrewrite模块。
在“location”配置指令中的正则表达式也需要PCRE。
–with-pcre=DIR-指定PCRE库的源代码的路径。
–with-pcre-opt=OPTIONS-SetadditionaloptionsforPCREbuilding.–with-md5=DIR-Setpathtomd5librarysources.
2.2.配置说明
–with-md5-opt=OPTIONS-Setadditionaloptionsformd5building.
–with-md5-asm-Usemd5assemblersources.
–with-sha1=DIR-Setpathtosha1librarysources.
–with-sha1-opt=OPTIONS-Setadditionaloptionsforsha1building.
–with-sha1-asm-Usesha1assemblersources.
–with-zlib=DIR-Setpathtozliblibrarysources.
–with-zlib-opt=OPTIONS-Setadditionaloptionsforzlibbuilding.
–with-zlib-asm=CPU-Usezlibassemblersourcesoptimizedfor
specifiedCPU,validvaluesare:
pentium,pentiumpro–with-openssl=DIR-SetpathtoOpenSSLlibrarysources–with-openssl-opt=OPTIONS-SetadditionaloptionsforOpenSSL
building–with-debug-启用调试日志–add-module=PATH-Addinathird-partymodulefoundindirectory
PATH在不同版本间,选项可能会有些许变化,请总是使用./configure–help命令来检查一下当前的选项列表。
示例(最好能在同一行):
1./configure\
2..sbin.path=/usr/local/nginx/nginx\
3..conf.path=/usr/local/nginx/nginx.conf\
4..pid.path=/usr/local/nginx/nginx.pid\
5..with.http_ssl_module\
6..with.pcre=../pcre.4.4\
7..with.zlib=../zlib.1.1.3
ExampleonUbuntu/debianwithlibgcrypt11-dev,libpcre3-devandlibssl-devinstalled(chooseEITHER–with-md5OR–with-sha1,butnotboth;ondebianandubuntu,theyshouldbothpointto/usr/lib)
1./configure\
2..with.openssl=/usr/lib/ssl/\
3..with.md5=/usr/lib
AnUbuntuEdgy.debforversion0.5.2canbefoundhere:
nginx_0.5.2-1_i386.deb.(NOTE:
AccordingtoanOctober2006messagemd5wasusedinanowbrokenhttpcachemoduleandsha1isusedinanincompletemysqllibrarymoduleandsoarecurrentlynotneeded.)
2.2配置说明
主模块
daemon
Chapter2.基本配置2.2.配置说明
语法:
daemonon|off
缺省值:
on生产环境中不要使用”daemon”和”master_process”指令,这
些选项仅用于开发调试。
debug_points
语法:
debug_points[stop|abort]
缺省值:
nonedebug_pointsstop;应该适用于调试,在调试器内设置断
点之类的。
error_log
语法:
error_logfile[debug|info|notice|warn|error|crit
]
缺省值:
${prefix}/logs/error.logNginx添加–with-debug编译参数,你还能够使用以下配置:
error_logLOGFILE[debug_core|debug_alloc
|debug_mutex|debug_event|debug_http|debug_imap];
include
语法:
includefile|*
缺省值:
none你可以在任意地方使用include指令实现配置文件的包含,类似于apache中的include方法,可减少主配置文件d。
include指令还支持像下面配置一样的全局包含的方法,例如包含一个目录下所有以”.conf”结尾的文件:
includevhosts/*.conf;注意路径受到configure编译参数–prefix=<路径>指令的影响,如果没有指定,Nginx默认是被编译在/usr/local/nginx。
lock_file
语法:
lock_filefile
缺省值:
compile-timeoptionlock_file/var/log/lock_file;nginxusesacceptmutextoserializeaccept()syscalls.Ifnginxisbuiltbygcc,IntelC++,orSunProC++compilersoni386,amd64,sparc64,andppc64,thennginxusestheatomicinstructionstoimplementthemutex.Inothercasesthelockfilewouldbeused.
master_process
语法:
master_processon|off
缺省值:
onmaster_processoff;生产环境中不要使用”daemon”和”master_process”指
令,这些选项仅用于开发调试。
pid
语法:
pidfile
缺省值:
compile-timeoptionExample:
pid/var/log/nginx.pid;进程
id存储文件。
可以使用kill-HUPcat/var/log/nginx.pid\对Nginx进行配置文件重新加载。
SSL_ENGINE
语法:
ssl_engineengine
缺省值:
systemdependent该指令用于指定openssl使用的引擎。
你可以通过下面的命令行获知系统目前支持的openssl引擎opensslengine-t例如:
$opensslengine-t(cryptodev)BSDcryptodevengine[available
](dynamic)Dynamicengineloadingsupport[unavailable]
timer_resolution
语法:
timer_resolutiont
缺省值:
noneExample:
timer_resolution100ms;Thedirectiveal-lowstodecreasenumbergettimeofday()syscalls.By缺省值gettime-ofday()iscalledaftereachreturnfromkevent(),epoll,/dev/poll,select(),poll().Butifyou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- nginx 详细 文档
![提示](https://static.bdocx.com/images/bang_tan.gif)