随笔分类 - NGINX
摘要:最近很多人问我nginx lua的优势是什么?为什么?一、同步和异步、阻塞和非阻塞如果要说清楚这个问题首先要了解:同步和异步、阻塞和非阻塞的关系同步:php、java的正常代码都是同步执行的异步:javascript的回调函数就是异步的说白了自己写的程序里面如果没有回调函数都是同步的,常见的php、...
阅读全文
摘要:前两天发现一个问题,当使用proxy_pass的时候,发现域名对应IP是缓存的,这样一旦VIP变化之后,就会报错,下面就来详细分析一下这个问题。一、问题说明 location = /test { internal; no_error_pages; proxy_pass_request_headers off; proxy_pass 'http://www.taobao.com/test/router/rest'; } 大家应该知道,这是向http://www.taobao.com/test/router/rest发送请求,其实是向202.108.250.25...
阅读全文
摘要:一、概况 Nginx可以开启多个进程,每个进程拥有最大上限128个子线程以及一定的可用连接数。最大客户端连接数等于进程数与连接数的乘积,连接是在主进程中初始化的,一开始所有连接处于空闲状态。每一个客户端请求进来以后会通过事件处理机制,在Linux是Epoll,在FreeBSD下是KQueue放到空闲的连接里。如果设置了线程数,那么被填充的连接会在子线程中处理,否则会在主线程中依次处理。如果解析出是动态脚本请求,会根据fast-cgi的设置访问php-cgi进程,php进程数量的多少依据php-fpm.conf中max_children的设置。因此Nginx的动态请求能力不仅仅依靠Nginx本.
阅读全文
摘要:查看源代码入门 这是一篇关于NGINX的MAIN()函数入门说明文章,相比其他这篇十分枯燥,其实写的时候更是无聊,不过学了这么长时间的WEB开发,连NGINX源代码都没有读下来,总是觉得有些缺憾,希望这一次可以弥补一下。一、下载NGINX下载地址:http://nginx.org/en/download.htmltar -zxvf *.tar.gz && ./configure && make && sudo make install查看NGINX目录有如下文件夹:auto CHANGES CHANGES.ru conf configure co
阅读全文
摘要:现在我已经将翻译的内容放到:http://wiki.nginx.org/HttpLuaModuleZhNginx API for LuaIntroduction各种各样的*_by_lua和*_by_lua_file配置文件服务在都在nginx.conf文件内。这些LUA API只能运行在这些配置文件里面。这个API有两个标准的包NGX和NDK。这个包在ngx_lua内默认的包。这个软件包可以这样的引入外部的文件 local say = ngx.say module(...) function foo(a) say(a) end强烈不推荐使用pack...
阅读全文
摘要:access_by_luaaccess阶段。事例:location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all; access_by_lua ' local res = ngx.location.capture("/mysql", { ... }) ... '; # proxy_pass/fastcgi_pass/... }也...
阅读全文
摘要:最近经常使用春哥和小哲老师写的NGINX-LUA,非常苦于没有中文文档,特别是向我这种英文水平实在有限的同学,所以将遇到的模块记录下来,供以后参考!原文:http://wiki.nginx.org/HttpLuaModulelua_code_cache一般放在nginx.conf里面,设置lua程序是否缓存,默认是开启的,开发模式开启即可:lua_code_cache off。开启后,重启nginx会有提示:nginx: [warn] lua_code_cache is off; this will hurt performance in /home/wb-liqiu/git/dante/co
阅读全文
摘要:模块上下文结构 这是一个ngx_http_module_t类型的静态变量。这个变量实际上是提供一组回调函数指针,这些函数有在创建存储配置信息的对象的函数,也有在创建前和创建后会调用的函数。这些函数都将被nginx在合适的时间进行调用。typedef struct { ngx_int_t (*preconfiguration)(ngx_conf_t *cf); ngx_int_t (*postconfiguration)(ngx_conf_t *cf); void *(*create_main_conf)(ngx_conf_t *cf); char ...
阅读全文
摘要:handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识。基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-balancer。Handler模块就是接受来自客户端的请求并产生输出的模块。至于有些地方说的upstream模块则实际上也是一种handler。只不过它产生的内容来自于从后端服务器获取的,而非在本机产生的。 当Nginx系统启动的时候,每个handler都有一次机会把自己关联到一个在配置文件中使用location指令配置的一个location上。如果有多个handler模块都去关联同一个loca..
阅读全文
摘要:From:http://tengine.taobao.org/book/chapter_02.htmlnginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于nginx安装目录下的conf目录下。 配置文件中以#开始的行,或者是前面有若干空格或者TAB,然后再跟#的行,都被认为是注释,也就是只对编辑查看文件的用户有意义,程序在读取这些注释行的时候,其实际的内容是被忽略的。 由于除主配置文件nginx.conf以外的文件都是在某些情况下才使用的,而只有主配置文件是在任何情况下都被使用的。所以在这里我们就以主配置文件为例...
阅读全文
摘要:lingering_close,字面意思就是延迟关闭,也就是说,当nginx要关闭连接时,并非立即关闭连接,而是再等待一段时间后才真正关掉连接。为什么要这样呢?我们先来看看这样一个场景。nginx在接收客户端的请求时,可能由于客户端或服务端出错了,要立即响应错误信息给客户端,而nginx在响应错误信息后,大分部情况下是需要关闭当前连接。如果客户端正在发送数据,或数据还没有到达服务端,服务端就将连接关掉了。那么,客户端发送的数据会收到RST包,此时,客户端对于接收到的服务端的数据,将不会发送ACK,也就是说,客户端将不会拿到服务端发送过来的错误信息数据。那客户端肯定会想,这服务器好霸道,动不..
阅读全文
摘要:keapalive 当然,在nginx中,对于http1.0与http1.1也是支持长连接的。什么是长连接呢?我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次握手来确定的,如果客户端与服务端之间网络差一点,这三次交互消费的时间会比较多,而且三次交互也会带来网络流量。当然,当连接断开后,也会有四次的交互,当然对用户体验来说就不重要了。而http请求是请求应答式的,如果我们能知道每个请求头与响应体的长度,那么我们是可以在一个连接上面执行多个请求的,这就是所谓的长连接,但前提条件是我们先得确定请求头与响应体的...
阅读全文
摘要:这节我们讲request,在nginx中我们指的是http请求,具体到nginx中的数据结构是ngx_http_request_t。ngx_http_request_t是对一个http请求的封装。 我们知道,一个http请求,包含请求行、请求头、请求体、响应行、响应头、响应体。 http请求是典型的请求-响应类型的的网络协议,而http是文件协议,所以我们在分析请求行与请求头,以及输出响应行与响应头,往往是一行一行的进行处理。如果我们自己来写一个http服务器,通常在一个连接建立好后,客户端会发送请求过来。然后我们读取一行数据,分析出请求行中包含的method、uri、http_vers...
阅读全文
摘要:在nginx中connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件。利用nginx封装的connection,我们可以很方便的使用nginx来处理与连接相关的事情,比如,建立连接,发送与接受数据等。而nginx中的http请求的处理就是建立在connection之上的,所以nginx不仅可以作为一个web服务器,也可以作为邮件服务器。当然,利用nginx提供的connection,我们可以与任何后端服务打交道。 结合一个tcp连接的生命周期,我们看看nginx是如何处理一个连接的。首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然...
阅读全文
摘要:From:http://tengine.taobao.org/book/chapter_02.html 上篇文章讲了很多关于nginx的进程模型,接下来,我们来看看nginx的是如何处理事件的。 有人可能要问了,nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就 能处理多少个并发,何来高并发呢?非也,这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理 成千上万个请求的。想想apache的常用工作方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突..
阅读全文
摘要:来源:http://tengine.taobao.org/book/chapter_02.html 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧。 nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。我们也可以手动地关掉daemon模式,让nginx在前台运行,这个时候,nginx就是一个单进程的,很显然,生产环境下我们肯定不会这么做,所以关掉daemon的方式,一般是用来调试用的,在后面的章节里面,我们会详细地讲解如何调试..
阅读全文
摘要:1.worker_processes8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数(如,2个四核的cpu计为8)。2.worker_cpu_affinity0000000100000010000001000000100000010000001000000100000010000000; 为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。3.worker_rlimit_nofile65535; 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit-n)与nginx进程数相除...
阅读全文
摘要:链接:http://wiki.nginx.org/HttpUpstreamKeepaliveModule今天看了一些代码:upstream b_memc2 { server 192.168.10.253:11211; keepalive 30 single;}看见KEEPALIVE的时候,上网上搜索,都是关于长连接的。其实在这里是最多连接数量。比如上面的代码,意思是:链接253的时候,最多保持30个长链接。为什么使用长连接?什么是长连接,移步:http://baike.baidu.com/view/2831907.htm
阅读全文
摘要:Nginx中upstream有以下几种方式:1、轮询(weight=1)默认选项,当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。upstream bakend { server 192.168.1.10; server 192.168.1.11;}2、weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如果后端服务器down掉,能自动剔除。比如下面配置,则1.11服务器的访问量为1.10服务器的两倍。upstream bakend { server 192...
阅读全文
摘要:最近学习了NGINX模块开发,由于只有大学时代了解过C语言,所以看起来很纠结,但是回过头来想想也可以更方便的掌握基本的方法。本文参阅@夜沨 的文章。代码下载链接,也有详细的模块开发事例一、设定一个目录,里面两个文件建立目录~/ngx_http_echo_module建立下面文件:~/ ngx_http_echo_module|--- ngx_http_echo_module.c|--- config二、编写ngx_http_echo_module.c文件/** Copyright (C) Eric Zhang*/#include #include #include /* Module conf
阅读全文