06 2013 档案
摘要:模块上下文结构 这是一个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进程数相除...
阅读全文
摘要:1 <?php 2 /** 3 * Flexihash - A simple consistent hashing implementation for PHP. 4 * 5 * The MIT License 6 * 7 * Copyright (c) 2008 Paul Annesley 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a copy 10 * of this software and associated documentat...
阅读全文
摘要:当两台主机采用 TCP 协议进行通信时,在交换数据前将建立连接。通信完成后,将关闭会话并终止连接。连接和会话机制保障了TCP 的可靠性功能。请参见图中建立并终止 TCP 连接的步骤。主机将跟踪会话过程中的每个数据段,并使用 TCP 报头中的信息了解每台主机所接收到的数据。每个连接都代表两股单向通信数据流或者会话。若要建立连接,主机应执行三次握手。TCP 报头中的控制位指出了连接的进度和状态。三次握手:1.确认目的设备存在于网络上;2.确认目的设备有活动的服务,并且正在源客户端要使用的目的端口号上接受请求;3.通知目的设备源客户端想要在该端口号上建立通信会话。在 TCP 连接中,充当客户端的主机
阅读全文
摘要:摘要本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题。分布式缓存问题假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Memcached作为缓存机制。现在我们一共有三台机器可以作为Memcached服务器,如下图所示。很显然,最简单的策略是将每一次Memcached请求随机发送到一台Mem
阅读全文
摘要:链接: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 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。事例:1 server {2 listen 8080;3 location /bar {4 echo "foo = [$foo]";5 set $foo 32;6 }7 }[root@sysadmin nginx]# curl 127.0.0.1:8080/bar -->foo = [32]
阅读全文
摘要:Lua解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在Lua中操纵字符串的功能基本来自于string库。字符串库中的一些函数是非常简单的:string.len(s) 返回字符串s的长度;string.rep(s, n)返回重复n次字符串s的串;你使用string.rep("a", 2^20)可以创建一个1M bytes的字符串(比如,为了测试需要);string.lower(s) 将s中的大写字母转换成小写(string.upper将小写转换成大写)。如果你想不关心大小写对一个数组进行排序的话,你可以这样
阅读全文
摘要:获得前一天的日期的函数 1 function day_step(old_day,step) 2 local y,m,d 3 if("0" ~= string.sub(old_day,6,6)) then 4 m=string.sub(old_day,6,7) 5 else 6 m=string.sub(old_day,7,7) 7 end 8 9 if("0" ~= string.sub(old_day,9,9)) then10 d=string.sub(old_day,9,10)11 else12 d=s...
阅读全文