快乐12开奖直播:BlogJava-xiaomage234-随笔分类 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/category/28168.html生命本就是一次凄美的漂流,记忆中放不下的,永远是孩提时代的那一份浪漫与纯真!zh-cnSat, 26 Sep 2015 00:27:37 GMTSat, 26 Sep 2015 00:27:37 GMT60高并发 Web 服务的演变:节约系统内存和 CPU - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2015/09/25/427496.html小马歌小马歌Fri, 25 Sep 2015 08:48:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2015/09/25/427496.html//www.ot7t.com.cn/xiaomage234/comments/427496.html//www.ot7t.com.cn/xiaomage234/archive/2015/09/25/427496.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/427496.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/427496.html//blog.jobbole.com/91749/

一、越来越多的并发连接数

现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战。以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置。虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的。结合技术优化方案,才是更有效的解决方法。

并发连接数为什么呈指数增长?实际上,从这几年的用户基数上看,这个数量并没有出现指数增长,因此它并非主要原因。主要原因,还是web变得更复杂,交互更丰富所导致的。

1. 页面元素增多,交互复杂

Web页面元素越来越多,更为丰富。更多的资源元素,意味着更多的下载请求。Web系统的交互越来越复杂,交互场景和次数也大幅增加。以“www.qq.com”的首页为例子,刷新一次,大概会有244个请求。并且,在页面打开完成之后,还会有一些定时的查询或者上报请求持续运作。

目前的Http请求,为了减少反复的创建和销毁连接行为,通常都建立长连接(Connection keep-alive)。一经建立,这个连接会被保持住一段时间,被后续请求复用。然而,它也带来了另一个新的问题,连接的保持是会占用Web系统服务端资源的,如果不充分使用这个连接,会导致资源浪费。长连接被创建后,首批资源传输完毕,之后几乎没有数据交互,一直到超时时间,才会自动释放长连接占据的系统资源。

除此之外,还有一些Web需求本身就需要长期保持连接的,例如Web socket。

2. 主流的本浏览器的连接数在增加

面对越来越丰富的Web资源,主流浏览器并发连接数也在增加,同一个域下,早期的浏览器一般只有1-2个下载连接,而目前的主流浏览器通常在2-6个。增加浏览器并发连接数目,在需要下载资源比较多的场景下,可以加快页面的加载速度。更多的连接对浏览器加载页面元素是有好处的,在某些连接遭遇“网络阻塞”的情况下,其他正常的下载连接可以继续工作。

这样自然无形增加了Web系统后端的压力,更多的下载连接意味着占据了更多的Web服务器的资源。而在用户访问高峰期,自热而然就形成了“高并发”场景。这些连接和请求,占据了服务器的大量CPU和内存等资源。尤其在资源数目超过100+的网站页面中,使用更多的下载连接,非常有必要。

 

二、Web前端优化,降低服务端压力

在缓解“高并发”的压力,需要前端和后端的共同配合优化,才能达到最大效果。在用户第一线的Web前端,可以起到减少或者减轻Http请求的效果。

1. 减少Web请求

常用的实现方法是通过Http协议头中的expire或max-age来控制,将静态内容放入浏览器的本地缓存,在之后的一段时间里,不再请求Web服务器,直接使用本地资源?;褂蠬TML5中的本地存储技术(LocalStorage),也被作为一个强大的数据本地缓存。

这种方案缓存后,根本不发送请求到Web服务器,大幅降低服务器压力,也带来了良好的用户体验。但是,这种方案,对首次访问的用户无效,同时,也影响部分Web资源的实时性。

2. 减轻Web请求

浏览器的本地缓存是存在过期时间的,一旦过期,就必须重新向服务器请求。这个时候,会有两种情形:

(1)服务器的资源内容没有更新,浏览器请求Web资源,服务器回复“可以继续使用本地缓存”。(发生通信,但是Web服务器只需要做简单“回复”)

(2)服务器的文件或者内容已经更新,浏览器请求Web资源,Web服务器通过网络传输新的资源内容。(发生通信,Web服务器需要完成复杂的传输工作)

这里的协商方式是通过Http协议的Last-Modified或Etag来控制,这个时候请求服务器,如果是内容没有发生变更的情况,服务器会返回304 Not Modified。这样的话,就不需要每次请求Web服务器都做复杂的传输完整数据文件的工作,只要简单的http应答就可以达到相同的效果。

虽然上述请求,起到“减轻”Web服务器的压力,但是连接仍然被建立,请求也发生了。

3. 合并页面请求

如果是比较老一些的Web开发者,应该会更有印象,在ajax盛行之前。页面大部分都是直接输出的,并没有这么多的ajax请求,Web后端将页面内容完全拼凑好了,再返回给前端。那个时候,页面静态化,是一个挺广泛的优化方式。后来,被交互更友好的ajax渐渐替代了,一个页面的请求也变得越来越多。

由于移动端的网络(2G/3G)比起PC宽带差很多,并且部分手机配置比较低,面对一个超过100个请求的网页,加载的速度会缓慢很多。于是,优化的方向又重新回到合并页面元素,减少请求数量:

(1)合并HTML展示内容。将CSS和JS直接嵌入到HTML页面内,不通过连接的方式引入。

(2)Ajax动态内容合并请求。对于动态内容,将10次Ajax请求合并为1次的批量信息查询。

(3)小图片合并,通过CSS的偏移量技术Sprites,将很多小图片合并为一张。这个优化方式,在PC端的Web优化中,也非常常见。

合并请求,减少了传输数据的次数,也就是相当于将它们从一个一个地请求,变为一次的“批量”请求。上述优化方法,到达“减轻”Web服务器压力的目的,减少了需要建立的连接。

 

三、 节约Web服务端的内存

前端的优化完成,我们就需要着眼于Web服务端本身。内存是Web服务器非常重要的资源,更多的内存通常意味着可以同时放入更多的工作任务。就Web服务占用内存而言,可以粗略划分:

(1)用来维持连接的基本内存,进程初始化时,会载入一些基础??榈侥诖?。

(2)被传输的数据内容载入到各个缓冲区,占据的内存。

(3)程序执行过程中,申请和使用的内存。

如果维持一个连接,能够尽可能少占用内存,那么我们就可以维持更多的并发连接,从而让Web服务器支持更多的并发连接数。

Apache(httpd)是一个成熟并且古老的Web服务,而Apache的发展和演变,一直在追求做到这一点,它试图不断减少服务占据的内存,以支持更大的并发量。以Apache的工作模式的演变为视角,我们一起来看看,它们是如何优化内存的问题的。

1. prefork MPM,多进程工作模式

prefork是Apache最成熟和稳定的工作模式,即使是现在,仍然被广泛使用。主进程生成后,它先完成基础的初始化工作,然后,通过fork预先产生一批的子进程(子进程会复制父进程的内存空间,不需要再做基础的初始化工作)。然后等待服务,之所以预先生成,是为了减少频繁创建和销毁进程的开销。多进程的好处,是进程之间的内存数据不会相互干扰,同时,某个进程异常终止也不会影响其他进程。但是,就内存而言,每个httpd子进程占用了很多的内存,因为子进程的内存数据是复制父进程的。我们可以粗略认为,这里存在大量的“重复数据”被放在内存中。最终,导致我们能够生成的子进程最大数量是很有限。在面对高并发时,因为有不少Keep-alive的长连接,将这些子进程“霸占”住,很可能导致可用子进程耗尽。因此,prefork并不太适合高并发场景。

  • 优点:成熟稳定,兼容所有新老???。同时,不需要担心线程安全的问题。(例如,我们常用的mod_php,将PHP编译为Apache的子???,就不需要支持线程安全)
  • 缺点:一个服务进程占用很多内存。

2. worker MPM,多进程和多线程的混合模式

worker模式比起prefork,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量很少),然后每个子进程创建一些线程(其中包括一个监听线程)。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通?;峁蚕砀附痰哪诖婵占?,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork更省内存,因此会有更多的可用线程。

但是,它并没有解决Keep-alive的长连接“霸占”线程的问题,只是对象变成了比较轻量的线程。

有些人会觉得奇怪,那么这里为什么不完全使用多线程呢,还要引入多进程?因为还需要考虑稳定性,如果一个线程挂了,会导致同一个进程下其他正常的子线程都挂了。如果全部采用多线程,某个线程挂掉,就导致整个Apache服务“全军覆没”。而目前的工作模式,受影响的只是Apache的一部分服务,而不是整个服务。

线程共享父进程的内存空间,减少了内存的占用,却又引起了新的问题。就是“线程安全”,多个线程修改共享资源导致的“竞争行为”,又强迫我们所使用的??楸匦胫С?#8220;线程安全”。因此,它有一定程度上增加Web服务的不稳定性。例如,mod_php所使用的PHP拓展,也同样需要支持“线程安全”,否则,不能在该模式下使用。

  • 优点:占据更少的内存,高并发下表现更优秀。
  • 缺点:必须考虑线程安全的问题,同时锁的引入又增加了CPU的开销。

3. event MPM,多进程和多线程的混合模式,引入Epoll

这个是Apache中比较新的模式,在现在的版本(Apache 2.4.10)已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。它减少了“占据”连接而又不使用的资源浪费,增强了高并发场景下的请求处理能力。因为减少了“闲等”的线程,线程的数量减少,同等场景下,内存占用会下降一些。

event MPM在遇到某些不兼容的??槭?,会失效,将会回退到worker模式,一个工作线程处理一个请求。新版Apache官方自带的???,全部是支持event MPM的。注意一点,event MPM需要Linux系统(Linux 2.6+)对EPoll的支持,才能启用。Apache的三种模式中在真实应用场景中,event MPM是最节约内存的。

4. 使用比较轻量的Nginx作为Web服务器

虽然Apache的不断优化,减少了内存占用,从而增加了处理高并发的能力。但是,正如前面所说,Apache是一个古老而成熟的Web服务,同时,集成很多稳定的???,是一个比较重的Web服务。Nginx是个比较轻量的Web服务,占据的内存天然就少于Apache。而且,Nginx通过一个进程来服务于N个连接。所使用的方式,并不是Apache的增加进程/线程来支持更多的连接。对于Nginx来说,它少创建了大量的进程/线程,减少了很多内存的开销。

静态文件的QPS性能压测结果,Nginx性能大概3倍于Apache对静态文件的处理。PHP等动态文件的QPS,Nginx的做法通常是通过FastCGI的方式和PHP-FPM通信的方式完成,PHP作为一个与之无关的外部服务存在。而Apache通常将PHP编译为自己的字??椋ㄐ掳娴腁pache也支持FastCGI)。PHP动态文件,Nginx的表现略逊于Apache。

5. sendfile节约内存

Apache、Nginx等不少Web服务,都带有sendfile支持的。sendfile可以减少数据到“用户态内存空间”(用户缓冲区)的拷贝,进而减少内存的占用。当然,很多同学第一个反应当然是问Why?为了尽可能清楚讲述这个原理,我们就先回Linux内核态和用户态的存储空间的交互。

一般情况下,用户态(也就是我们的程序所在的内存空间)是不会直接读写或者操作各种设备(磁盘、网络、终端等),中间通常用内核作为“中间人”,来完成对设备的操作或者读写。

以最简单的磁盘读写例子,从磁盘中读取A文件,写入到B文件。A文件数据是从磁盘开始,然后载入到“内核缓冲区”,然后再拷贝到“用户缓冲区”,我们才可以对数据进行处理。写入的时候,也同理,从“用户态缓冲区”载入到“内核缓冲区”,最后写入到磁盘B文件。

这样写文件很累吧,于是有人觉得这里可以跳过“用户缓冲区”的拷贝。其实,这就是MMP(Memory-Mapping,内存映射)的实现,建立一个磁盘空间和内存的直接映射,数据不再复制到“用户态缓冲区”,而是返回一个指向内存空间的指针。于是,我们之前的读写文件例子,就会变成,A文件数据从磁盘载入到“内核缓冲区”,然后从“内核缓冲区”复制到B文件的“内核缓冲区”,B文件再从”内核缓冲区“写回到磁盘中。这个过程,减少了一次内存拷贝,同时也少内存占用。

好了,回到sendfile的话题上来,简单的说,sendfile的做法和MMP类似,就是减少数据从”内核态缓冲区“到”用户态缓冲区“的内存拷贝。

默认的磁盘文件读取,到传输给socket,流程(不使用sendfile)是:

使用sendfile之后:

这种方式,不仅节省了内存,而且还有CPU的开销。

 

四、节约Web服务器的CPU

对Web服务器而言,CPU是另一个非常核心的系统资源。虽然一般情况下,我们认为业务程序的执行消耗了我们主要CPU。但是,就Web服务程序而言,多线程/多进程的上下文切换,也是比较消耗CPU资源的。一个进程/线程通常不能长期占有CPU,当发生阻塞或者时间片用完,就无法继续占用CPU,这个时候,就会发生上下文切换,CPU时间片从老进程/线程切换到新的。除此之外,在并发连接数目很高的场景下,对这些用户建立的连接(socket文件描述符)状态的轮询和检测,也是比较消耗CPU的。

而Apache和Nginx的发展和演变,也在努力减少CPU开销。

1. Select/Poll(Apache早期版本的I/O多路复用)

通常,Web服务都要维护很多个和用户通信的socket文件描述符,I/O多路复用,其实就是为了方便对这些文件描述符的管理和检测。Apache早期版本,是使用select的模式,简单的说,就是将这些我们关注的socket文件描述符交给内核,让内核告诉我们,那些描述符可操作。Poll与select原理基本相同,因此放在一起,它们之间的区别,就不赘叙了哈。

select/poll返回的是一个我们之前提交的文件描述符集合(内核将其中可读、可写或者异常状态的socket文件描述符的标识位修改了),我们需要通过轮询检查才能获得我们可以操作的文件描述符。在这个过程中,不断重复执行。在实际应用场景中,大部分被我们监控的socket文件描述符,都是”空闲的“,也就是说,不能操作。我们对整个集合轮询,就是为了找了少部分我们可以操作的socket文件描述符。于是,当我们监控的socket文件描述符越多(用户并发连接数越来越多),这个轮询工作,也就越来越沉重,进而导致增大了CPU的开销。

如果我们监控的socket文件描述符,几乎都是”活跃的“,反而使用这种模式更合适一点。

2. Epoll(新版的Apache的event MPM,Nginx等支持)

Epoll是Linux2.6开始正式支持的I/O多路复用,我们可以理解为它是对select/poll的改进。首先,我们同样将我们关注的socket文件描述符集合告诉给内核,同时,给它们注册”回调函数“,如果某个socket文件准备好了,就通过回调函数通知我们。于是,我们就不需要专门去轮询整个全量的socket文件描述符集合,直接可以得到已经可操作的socket文件描述符。那么,那些大部分”空闲“的描述符,我们就不遍历了。即使我们监控的socket文件描述越来越多,我们轮询的也只是”活跃可操作“的socket文件描述符。

其实,有一种极端点的场景,就是我们全部文件描述符几乎都是”活跃“的,这样反而导致了大量回调函数的执行,又增加了CPU的开销。但是,就Web服务的真实场景,绝大部分时候,都是连接集合中都存在很多”空闲“连接。

3. 线程/进程的创建销毁和上下文切换

通常,Apache某一个时间内,是一个进程/线程服务于一个连接。于是,Apache就有很多的进程/线程,服务于很多的连接。Web服务在高峰期,会建立很多的进程/线程,也就带来很多的上下文切换开销。而Nginx,它通常只有1个master主进程和几个worker子进程,然后,1个worker进程服务很多个连接,进而节省了CPU的上下文切换开销。

两种模式虽然不同,但实际上不能直接出分好坏,综合来说,各有各自的优势,就不妄议了哈。

4. 多线程下的锁对CPU的开销

Apache中的worker和event模式,都有采用多线程。多线程因为共享父进程的内存空间,在访问共享数据的时候,就会产生竞争,也就是线程安全问题。因此通?;嵋胨↙inux下比较常用的线程相关的锁有互斥量metux,读写锁rwlock等),成功获取锁的线程可以继续执行,获取失败的通常选择阻塞等待。引入锁的机制,程序的复杂度往往增加不少,同时还有线程“死锁”或者“饿死”的风险(多进程在访问进程间共享资源的时候,也有同样的问题)。

死锁现象(两个线程彼此锁住对方想要获取的资源,相互阻塞等待,永远无法达不到满足条件):

饿死现象(某个线程,一直获取不到它想要锁资源,永远无法执行下一步):

为了避免这些锁导致的问题,就不得不加大程序的复杂度,解决方案一般有:

(1)对资源的加锁,根据约定好的顺序,大家都先对共享资源X加锁,加锁成功之后才能加锁共享资源Y。

(2)如果线程占有资源X,却加锁资源Y失败,则放弃加锁,同时也释放掉之前占有的资源X。

在使用PHP的时候,在Apache的worker和event模式下,也必须兼容线程安全。通常,新版本的PHP官方库是没有线程安全方面的问题,需要关注的是第三方扩展。PHP实现线程安全,不是通过锁的方式实现的。而是为每个线程独立申请一份全局变量的副本,相当于线程的私人内存空间,但是这样做相对消耗多一些内存。不过,这样的好处,是不需要引入复杂的锁机制实现,也避免了锁机制对CPU的开销。

这里顺便提到一下,经常和Nginx搭配工作的PHP-FPM(FastCGI)使用的是多进程,因此不会有线程安全的问题。

 

五、 小结

可能有些同学看完之后,会得出结论,Nginx+PHP-FPM的工作方式,似乎是最节省系统资源的Web系统工作方式。某种程度上说,的确是可以这么说的,但是Web系统的搭建,需要从实际业务应用的角度出发,具体问题需要具体分析,寻求最合适的技术方案。

Web服务的不断演变和发展,努力地追求用尽可能少的系统资源,来支撑更多的用户请求,这是一条波澜壮阔的前进之路。这些技术方案,汇聚了很多值得学习和借鉴的解决问题的思路。



小马歌 2015-09-25 16:48 发表评论
]]>
为最佳性能调优 Nginx[转] - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2015/07/10/426144.html小马歌小马歌Fri, 10 Jul 2015 02:23:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2015/07/10/426144.html//www.ot7t.com.cn/xiaomage234/comments/426144.html//www.ot7t.com.cn/xiaomage234/archive/2015/07/10/426144.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/426144.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/426144.html阅读全文

小马歌 2015-07-10 10:23 发表评论
]]>
nginx+Tomcat性能监控[转] - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2015/03/17/423514.html小马歌小马歌Tue, 17 Mar 2015 02:00:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2015/03/17/423514.html//www.ot7t.com.cn/xiaomage234/comments/423514.html//www.ot7t.com.cn/xiaomage234/archive/2015/03/17/423514.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/423514.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/423514.html

一、开启nginx的监控

1)、nginx简单状态监控

在nginx.conf中添加如下代码即可监控nginx当前的状态,然后访问//serverip/status即可访问

location /status {
stub_status on;
access_log off;
}

一般显示为

Active connections: 16 
server accepts handled requests
191226 191226 305915 
Reading: 0 Writing: 1 Waiting: 15

ctive connections: 对后端发起的活动连接数.

Server accepts handled requests: Nginx总共处理了24个连接,成功创建24次握手(证明中间没有失败的),总共处理了129个请求.

Reading: Nginx 读取到客户端的Header信息数.

Writing: Nginx 返回给客户端的Header信息数.

Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接.
注意的,本??槟鲜遣换岜嘁虢鳱ginx的,如果你要使用该???则要在编译安装Nginx时指定:
 ./configure –with-http_stub_status_module 
 查看已安装的 Nginx 是否包含 stub_status ???/span>
 #/usr/local/nginx/sbin/nginx -V 
 TLS SNI support disabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-file-aio --with-http_ssl_module 
 
2)、nginx的图形化监控-nginx-RRD stats
 
nginx-rrdnginx官方推荐的一款Nginx监控工具,利用nginx-rrd可以很方便的生成图表,便于我们查看。

1、运行环境(centos):

在安装前需要安装好rrdtool这个画图工具和相应的perl???,可以先运行:

yum install rrdtool libhtml-parser-perl libwww-perl librrds-perl librrd2-dev

确保rrdtool和相应的perl被安装上。

2、安装配置

下载:wget //soft.vpser.net/status/nginx-rrd/nginx-rrd-0.1.4.tgz

解压:tar zxvf nginx-rrd-0.1.4.tgz

进入nginx-rrd目录,cd nginx-rrd-0.1.4/

复制主程序:cp usr/sbin/* /usr/sbin

复制配置文件cp etc/nginx-rrd.conf /etc

复制定时执行文件:cp etc/cron.d/nginx-rrd.cron /etc/cron.d

创建nginx-rrd生成目录:mkdir /home/wwwroot/nginx && mkdir /home/wwwroot/nginx/rrd

cp html/index.php /home/wwwroot/nginx

编辑/home/wwwroot/nginx/index.php修改登录密码

<?php
header("Content-Type: text/html; charset=utf-8");

$password = "admin"; 

.........

编辑配置文件nginx-rrd.conf,修改完成后如下:

#####################################################
#
# dir where rrd databases are stored
RRD_DIR="/home/wwwroot/nginx-rrd/";
# dir where png images are presented
WWW_DIR="/home/wwwroot/nginx/";
# process nice level
NICE_LEVEL="-19";
# bin dir
BIN_DIR="/usr/sbin";
# servers to test
# server_utl;server_name
SERVERS_URL="//127.0.0.1/status;127.0.0.1"

多个server,可以SERVERS_URL中空格分开,前部分为nginx_status的地址,后面为被监控主机的域名。

SEVERS_URL 格式

注意,nginx.conf虚拟主机server{}中,需要已经加入:

location /status {
stub_status on;
access_log off;
}

以上设置就完成,可以自行运行一下:/usr/sbin/nginx-collect ,启动收集程序。cron会15分钟生成一次数据。

如果没有定时执行生成数据,可以在/etc/crontab最后面加上:

* * * * * root /usr/sbin/nginx-collect
*/15 * * * * root /usr/sbin/nginx-graph

然后输入然后访问//serverip/nginx/即可访问。

 

二、开启tomcat的监控

1)、tomcat6的配置

修改tomcat/conftomcat-users.xml文件中</tomcat-users>节点之前添加如下代码即可。

 <user username="admin" password="admin" roles="manager"/>

然后输入然后访问//serverip:8080/manager/status即可访问。

2)tomcat7的配置

修改tomcat/conftomcat-users.xml文件中</tomcat-users>节点之前添加如下代码即可。

<role rolename="manager-gui"/>
<user username="tomcat" admin="admin" roles="manager-gui"/>

然后输入然后访问//serverip:8080/manager/status即可访问。



小马歌 2015-03-17 10:00 发表评论
]]>
Tomcat 并发优化[转] - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2015/03/17/423513.html小马歌小马歌Tue, 17 Mar 2015 01:59:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2015/03/17/423513.html//www.ot7t.com.cn/xiaomage234/comments/423513.html//www.ot7t.com.cn/xiaomage234/archive/2015/03/17/423513.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/423513.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/423513.html阅读全文

小马歌 2015-03-17 09:59 发表评论
]]>
tomcat使用APR提高性能[转] - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2015/03/16/423496.html小马歌小马歌Mon, 16 Mar 2015 10:59:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2015/03/16/423496.html//www.ot7t.com.cn/xiaomage234/comments/423496.html//www.ot7t.com.cn/xiaomage234/archive/2015/03/16/423496.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/423496.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/423496.html

操作系统:Centos6.3
Tomcat:7.0.42
JDK:1.6.0_45
配置:8G,4核.

最近tomcat负载比较高,默认的配置和bio的处理方式已经无力支撑.据说APR能提升50%~60%的性能,所以尝试下APR优化.
APR介绍:

Tomcat可以使用APR来提供超强的可伸缩性和性能,更好地集成本地服务器技术。  APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心。  APR有很多用途,包括访问高级IO功能(例如sendfile,epoll和OpenSSL),OS级别功能(随机数生成,系统状态等等),本地进程管理(共享内存,NT管道和UNIX sockets)。这些功能可以使Tomcat作为一个通常的前台WEB服务器,能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器。  在产品环境中,特别是直接使用Tomcat做WEB服务器的时候,应该使用Tomcat Native来提高其性能。

1. 服务器安装GCC

客户服务器连不上外网,服务器也没有gcc,所以先使用代理连接外网,修改/etc/yum.conf,加入代理配置:

proxy=//10.103.0.46:808

如果需要验证加入用户名密码:

proxy_username=代理服务器用户名 proxy_password=代理服务器密码 

yum使用163的Centos源:参考//mirrors.163.com/.help/centos.html
先备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 

然后下载CentOS6 放入到/etc/yum.repos.d/(操作前请做好相应备份)

运行以下命令生成缓存:

yum clean all yum makecache 

然后安装gcc:

yum -y install gcc 

2. 安装APR

//apr.apache.org/download.cgi下载apr,apr-util,apr-iconv. 因为服务器没有配置全局的http代理,只是yum代理,所以下载之后传到服务器即可.

传输完安装apr:

tar zxvf apr-1.5.1.tar.gz cd apr-1.5.1 ./configure --prefix=/usr/local/apr make make install 

安装apr-iconv:

tar zxvf apr-iconv-1.2.1.tar.gz cd apr-iconv-1.2.1 ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr make make install 

安装apr-util:

tar zxvf apr-util-1.5.3.tar.gz cd apr-util-1.5.3 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv make   make install 

安装tomcat-native:首先到tomcat/bin目录下,找到对应的tar文件.

tar zxvf tomcat-native.tar.gz cd tomcat-native-1.1.27-src/jni/native/ ./configure --with-apr=/usr/local/apr --with-java-home=/usr/lib/jdk1.6.0_45 make make install 

安装完成之后 会出现如下提示信息

Libraries have been installed in: /usr/local/apr/lib 

添加环境变量: vi /etc/profile在文件末尾处添加下面的变量

export LD_LIBRARY_PATH=/usr/local/apr/lib 

然后执行下面命令,使环境变量即时生效

source /etc/profile 

以下为完整安装脚本:

#setup apr tar zxvf apr-1.5.1.tar.gz cd apr-1.5.1 ./configure --prefix=/usr/local/apr make && make install cd ../ #setup apr-iconv tar zxvf apr-iconv-1.2.1.tar.gz cd apr-iconv-1.2.1/ ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr make && make install cd ../ #setup apr-util tar zxvf apr-util-1.5.3.tar.gz cd apr-util-1.5.3 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv make && make install #setup tomcat-native cd /app/apache-tomcat-7.0.42/bin tar zxvf tomcat-native.tar.gz cd tomcat-native-1.1.27-src/jni/native ./configure --with-apr=/usr/local/apr --with-java-home=/usr/lib/jdk1.6.0_45 make && make install cd / #LD_LIBRARY_PATH echo -e 'export LD_LIBRARY_PATH=/usr/local/apr/lib' >> /etc/profile export LD_LIBRARY_PATH=/usr/local/apr/lib source /etc/profile 

3. 配置Tomcat

修改tomcat配置conf/server.xml:

<!--The connectors can use a shared executor, you can define one or more named thread pools-->     <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"         maxThreads="800" minSpareThreads="400"/>        <!-- A "Connector" represents an endpoint by which requests are received          and responses are returned. Documentation at :          Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)          Java AJP  Connector: /docs/config/ajp.html          APR (HTTP/AJP) Connector: /docs/apr.html          Define a non-SSL HTTP/1.1 Connector on port 8080     -->     <Connector port="80" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11AprProtocol"                connectionTimeout="20000"                redirectPort="8443" enableLookups="false" acceptCount="1000"/> 

修改为Http11AprProtocol 协议.

之后启动tomcat即可.

遇到问题:

SEVERE: Failed to initialize the SSLEngine. org.apache.tomcat.jni.Error: 70023: This function has not been implemented on this platform 

请关闭SSL侦听,除非你有使用SSL,修改conf/server.xml

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" /> 

压测结果:

webbench -c 4000 -t 30 //10.103.10.140/workbench/index.jsp Webbench - Simple Web Benchmark 1.5 Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.  Benchmarking: GET //10.103.10.140/workbench/index.jsp 4000 clients, running 30 sec.  Speed=484340 pages/min, 2441573 bytes/sec. Requests: 242170 susceed, 0 failed. 

参考:

//www.chepoo.com/tomcat-performance-three-times-is-not-a-dream.html

//rhomobi.com/topics/36

https://gitsea.com/2013/07/02/tomcat-%E5%B9%B6%E5%8F%91%E4%BC%98%E5%8C%96/

//pengranxiang.iteye.com/blog/1128905

//tomcat.apache.org/tomcat-7.0-doc/apr.html#Linux

//www.cnblogs.com/wanghaosoft/archive/2013/02/04/2892099.html



小马歌 2015-03-16 18:59 发表评论
]]>
Nginx出现“413 Request Entity Too Large”错误解决方法 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/11/14/420082.html小马歌小马歌Fri, 14 Nov 2014 06:08:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/11/14/420082.html//www.ot7t.com.cn/xiaomage234/comments/420082.html//www.ot7t.com.cn/xiaomage234/archive/2014/11/14/420082.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/420082.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/420082.html快乐12开奖直播:

客户端在测试服务器上上传大的图片,报“413 Request Entity Too Large”的错误,从网上搜索解决办法如下:

解决方法:打开nginx主配置文件nginx.conf,找到http{}段,添加
client_max_body_size 20m;
Centos下 vi /usr/local/nginx/conf/nginx.conf

重启NGINX
kill -HUP `cat /usr/local/nginx/nginx.pid `
恢复正常



小马歌 2014-11-14 14:08 发表评论
]]>
HTTP POST GET 本质区别详解 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/07/15/415848.html小马歌小马歌Tue, 15 Jul 2014 09:22:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/07/15/415848.html//www.ot7t.com.cn/xiaomage234/comments/415848.html//www.ot7t.com.cn/xiaomage234/archive/2014/07/15/415848.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/415848.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/415848.html阅读全文

小马歌 2014-07-15 17:22 发表评论
]]>
转 Jetty9 & WebSocket - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/06/10/414576.html小马歌小马歌Tue, 10 Jun 2014 03:55:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/06/10/414576.html//www.ot7t.com.cn/xiaomage234/comments/414576.html//www.ot7t.com.cn/xiaomage234/archive/2014/06/10/414576.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/414576.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/414576.html//webtide.intalio.com/2012/10/jetty-9-updated-websocket-api/

Creating WebSockets in Jetty is even easier with Jetty 9!

While the networking gurus in Jetty have been working on the awesome improvements to the I/O layers in core Jetty 9, the WebSocket fanatics in the community have been working on making writing WebSockets even easier.

The initial WebSocket implementation in Jetty was started back in November of 2009, well before the WebSocket protocol was finalized.

It has grown in response to Jetty’s involvement with the WebSocket draft discussions to the finalization of RFC6455, and onwards into the changes being influenced on our design as a result of WebSocket extensions drafts such as x-webkit-perframe-deflatepermessage-deflate, fragment, andongoing mux discussions.

The Jetty 7.x and Jetty 8.x codebases provided WebSockets to developers required a complex set of knowledge about how WebSockets work and how Jetty implemented WebSockets.  This complexity was as a result of this rather organic growth of WebSocket knowledge around intermediaries and WebSocket Extensions impacted the original design.

With Jetty 9.x we were given an opportunity to correct our mistakes.

The new WebSockets API in Jetty 9.x

Note: this information represents what is in the jetty-9 branch on git, which has changed in small but important ways since 9.0.0.M0 was released.

With the growing interest in next generation protocols like SPDY and HTTP/2.0, along with evolving standards being tracked for Servlet API 3.1 and Java API for WebSockets (JSR-356), the time Jetty 9.x was at hand.  We dove head first into cleaning up the codebase, performing some needed refactoring, and upgrading the codebase to Java 7.

Along the way, Jetty 9.x started to shed the old blocking I/O layers, and all of the nasty logic surrounding it, resulting on a Async I/O focused Jetty core.  We love this new layer, and we expect you will to, even if you don’t see it directly.  This change benefits Jetty with a smaller / cleaner / easier to maintain and test codebase, along with various performance improvements such as speed, CPU use, and even less memory use.

In parallel, the Jetty WebSocket codebase changed to soak up the knowledge gained in our early adoption of WebSockets and also to utilize the benefits of the new Jetty Async I/O layers better.   It is important to note that Jetty 9.x WebSockets is NOT backward compatible with prior Jetty versions.

The most significant changes:

  • Requires Java 7
  • Only supporting WebSocket version 13 (RFC-6455)
  • Artifact Split

The monolithic jetty-websocket artifact has been to split up the various websocket artifacts so that developers can pick and choose what’s important to them.

The new artifacts are all under the org.eclipse.jetty.websocket groupId on maven central.

  • websocket-core.jar – where the basic API classes reside, plus internal implementation details that are common between server & client.
  • websocket-server.jar – the server specific classes
  • websocket-client.jar – the client specific classes
  • Only 1 Listener now (WebSocketListener)
  • Now Supports Annotated WebSocket classes
  • Focus is on Messages not Frames

In our prior WebSocket API we assumed, incorrectly, that developers would want to work with the raw WebSocket framing.   This change brings us in line with how every other WebSocket API behaves, working with messages, not frames.

  • WebSocketServlet only configures for a WebSocketCreator

This subtle change means that the Servlet no longer creates websockets of its own, and instead this work is done by the WebSocketCreator of your choice (don’t worry, there is a default creator).
This is important to properly support the mux extensions and future Java API for WebSockets (JSR-356)

Jetty 9.x WebSockets Quick Start:

Before we get started, some important WebSocket Basics & Gotchas

  1. A WebSocket Frame is the most fundamental part of the protocol, however it is not really the best way to read/write to websockets.
  2. A WebSocket Message can be 1 or more frames, this is the model of interaction with a WebSocket in Jetty 9.x
  3. A WebSocket TEXT Message can only ever be UTF-8 encoded. (it you need other forms of encoding, use a BINARY Message)
  4. A WebSocket BINARY Message can be anything that will fit in a byte array.
  5. Use the WebSocketPolicy (available in the WebSocketServerFactory) to configure some constraints on what the maximum text and binary message size should be for your socket (to prevent clients from sending massive messages or frames)

First, we need the servlet to provide the glue.

We’ll be overriding the configure(WebSocketServerFactory) here to configure a basic MyEchoSocket to run when an incoming request to upgrade occurs.

package examples;  import org.eclipse.jetty.websocket.server.WebSocketServerFactory; import org.eclipse.jetty.websocket.server.WebSocketServlet;  public class MyEchoServlet extends WebSocketServlet {     @Override     public void configure(WebSocketServerFactory factory)     {         // register a socket class as default         factory.register(MyEchoSocket.class);     } }

The responsibility of your WebSocketServlet class is to configure theWebSocketServerFactory.     The most important aspect is describing how WebSocket implementations are to be created when request for new sockets arrive.  This is accomplished by configuring an appropriate WebSocketCreator object.  In the above example, the default WebSocketCreator is being used to register a specific class to instantiate on each new incoming Upgrade request.

If you wish to use your own WebSocketCreator implementation, you can provide it during this configure step.

Check the examples/echo to see how this is done with factory.setCreator() andEchoCreator.

Note that request for new websockets can arrive from a number of different code paths, not all of which will result in your WebSocketServlet being executed.  Mux for example will result in a new WebSocket request arriving as a logic channel within the MuxExtension itself.

As for implementing the MyEchoSocket, you have 3 choices.

  1. Implementing Listener
  2. Using an Adapter
  3. Using Annotations

Choice 1: implementing WebSocketListener interface.

Implementing WebSocketListener is the oldest and most fundamental approach available to you for working with WebSocket in a traditional listener approach (be sure you read the other approaches below before you settle on this approach).
It is your responsibility to handle the connection open/close events appropriately when using the WebSocketListener. Once you obtain a reference to the WebSocketConnection, you have a variety of NIO/Async based write() methods to write content back out the connection.

package examples;  import java.io.IOException;  import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.FutureCallback; import org.eclipse.jetty.websocket.core.api.WebSocketConnection; import org.eclipse.jetty.websocket.core.api.WebSocketException; import org.eclipse.jetty.websocket.core.api.WebSocketListener;  public class MyEchoSocket implements WebSocketListener {     private WebSocketConnection outbound;      @Override     public void onWebSocketBinary(byte[] payload, int offset,                                   int len)     {         /* only interested in text messages */     }      @Override     public void onWebSocketClose(int statusCode, String reason)     {         this.outbound = null;     }      @Override     public void onWebSocketConnect(WebSocketConnection connection)     {         this.outbound = connection;     }      @Override     public void onWebSocketException(WebSocketException error)     {         error.printStackTrace();     }      @Override     public void onWebSocketText(String message)     {         if (outbound == null)         {             return;         }          try         {             String context = null;             Callback callback = new FutureCallback<>();             outbound.write(context,callback,message);         }         catch (IOException e)         {             e.printStackTrace();         }     } }

Choice 2: extending from WebSocketAdapter

Using the provided WebSocketAdapter, the management of the Connection is handled for you, and access to a simplified WebSocketBlockingConnection is also available (as well as using the NIO based write signature seen above)

package examples;  import java.io.IOException; import org.eclipse.jetty.websocket.core.api.WebSocketAdapter;  public class MyEchoSocket extends WebSocketAdapter {     @Override     public void onWebSocketText(String message)     {         if (isNotConnected())         {             return;         }          try         {             // echo the data back             getBlockingConnection().write(message);         }         catch (IOException e)         {             e.printStackTrace();         }     } }

Choice 3: decorating your POJO with @WebSocket annotations.

This the easiest WebSocket you can create, and you have some flexibility in the parameters of the methods as well.

package examples;  import java.io.IOException;  import org.eclipse.jetty.util.FutureCallback; import org.eclipse.jetty.websocket.core.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.core.annotations.WebSocket; import org.eclipse.jetty.websocket.core.api.WebSocketConnection;  @WebSocket(maxTextSize = 64 * 1024) public class MyEchoSocket {     @OnWebSocketMessage     public void onText(WebSocketConnection conn, String message)     {         if (conn.isOpen())         {             return;         }         try         {             conn.write(null,new FutureCallback(),message);         }         catch (IOException e)         {             e.printStackTrace();         }     } }

The annotations you have available:
@OnWebSocketMessage: To receive websocket message events.

Examples:

  @OnWebSocketMessage   public void onTextMethod(String message) {      // simple TEXT message received   }    @OnWebSocketMessage   public void onTextMethod(WebSocketConnection connection,                             String message) {      // simple TEXT message received, with Connection       // that it occurred on.   }    @OnWebSocketMessage   public void onBinaryMethod(byte data[], int offset,                               int length) {      // simple BINARY message received   }    @OnWebSocketMessage   public void onBinaryMethod(WebSocketConnection connection,                               byte data[], int offset,                               int length) {      // simple BINARY message received, with Connection       // that it occurred on.   }

@OnWebSocketConnect: To receive websocket connection connected event (will only occur once).

Example:

  @OnWebSocketConnect   public void onConnect(WebSocketConnection connection) {      // WebSocket is now connected   }

@OnWebSocketClose: To receive websocket connection closed events (will only occur once).

Example:

  @OnWebSocketClose   public void onClose(int statusCode, String reason) {      // WebSocket is now disconnected   }    @OnWebSocketClose   public void onClose(WebSocketConnection connection,                        int statusCode, String reason) {      // WebSocket is now disconnected   }

@OnWebSocketFrame: To receive websocket framing events (read only access to the rawFrame details).

Example:

  @OnWebSocketFrame   public void onFrame(Frame frame) {      // WebSocket frame received   }    @OnWebSocketFrame   public void onFrame(WebSocketConnection connection,                        Frame frame) {      // WebSocket frame received   }

One More Thing … The Future

We aren’t done with our changes to Jetty 9.x and the WebSocket API, we are actively working on the following features as well…

  • Mux Extension

The multiplex extension being drafted will allow for multiple virtual WebSocket connections over a single physical TCP/IP connection.  This extension will allow browsers to better utilize their connection limits/counts, and allow web proxy intermediaries to bundle multiple websocket connections to a server together over a single physical connection.

  • Streaming APIs

There has been some expressed interest in providing read and write of text or binary messages using the standard Java IO Writer/Reader (for TEXT messages) and OutputStream/InputStream (for BINARY messages) APIs.

Current plans for streamed reading includes new @OnWebSocketMessage interface patterns.

  // In the near future, we will have the following some Streaming   // forms also available.  This is a delicate thing to    // implement and currently does not work properly, but is    // scheduled.    @OnWebSocketMessage   public void onTextMethod(Reader stream) {      // TEXT message received, and reported to your socket as a      // Reader. (can handle 1 message, regardless of size or       // number of frames)   }    @OnWebSocketMessage   public void onTextMethod(WebSocketConnection connection,                             Reader stream) {      // TEXT message received, and reported to your socket as a      // Reader. (can handle 1 message, regardless of size or       // number of frames).  Connection that message occurs      // on is reported as well.   }    @OnWebSocketMessage   public void onBinaryMethod(InputStream stream) {      // BINARY message received, and reported to your socket      // as a InputStream. (can handle 1 message, regardless      // of size or number of frames).   }    @OnWebSocketMessage   public void onBinaryMethod(WebSocketConnection connection,                               InputStream stream) {      // BINARY message received, and reported to your socket      // as a InputStream. (can handle 1 message, regardless      // of size or number of frames).  Connection that       // message occurs on is reported as well.   }

And for streaming writes, we plan to provide Writer and OutputStream implementations that simply wrap the provided WebSocketConnection.

  • Android Compatible Client Library

While Android is currently not Java 7 compatible, a modified websocket-client library suitable for use with Android is on our TODO list.

  • Support Java API for WebSocket API (JSR356)

We are actively tracking the work being done with this JSR group, it is coming, but is still some way off from being a complete and finished API (heck, the current EDR still doesn’t support extensions). Jetty 9.x will definitely support it, and we have tried to build our Jetty 9.x WebSocket API so that the the Java API for WebSockets can live above it.



小马歌 2014-06-10 11:55 发表评论
]]>
Nginx1.1.4+ 对后端机器的长连接特性 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409863.html小马歌小马歌Fri, 14 Feb 2014 07:35:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409863.html//www.ot7t.com.cn/xiaomage234/comments/409863.html//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409863.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/409863.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/409863.htmlnginx upstream keepalive connections

 

Nginx从 1.1.4 开始,实现了对后端机器的长连接支持,这是一个激动人心的改进,这意味着 Nginx 与后端机器的通信效率更高,后端机器的负担更低。

 

例如,对一个没有长连接支持的后端机器,会出现大量TIME_WAIT 状态的连接,使用以下命令验证之:

netstat -n | grep TIME_WAIT

 

经过查阅官方文档,其目前已经实现了http, fastcgi, memcache 协议的长连接支持。而之前的版本中仅支持memcache 协议。

 

1. 启用到 memcache 服务器的长连接 
在upstream 配置段中增加 keepalive N 指令即可: 
upstream memcached_backend {

    server 127.0.0.1:11211;

    server 10.0.0.2:11211;

     keepalive 32;

}

 

server {

    ...

    location /memcached/ {

        set $memcached_key $uri;

        memcached_pass memcached_backend;

    }

}

 

 

2.  启用fastcgi 长连接支持 
除了需要在upstream 中配置 keepalive N 外,还需要在 location 中增加 fastcgi_keep_conn on;

upstream fastcgi_backend {

    server 127.0.0.1:9000;

     keepalive 8;

}

 

server {

    ...

    location /fastcgi/ {

        fastcgi_pass fastcgi_backend;

         fastcgi_keep_conn on;

        ...

    }

}

 

3.  启用对后端机器HTTP 长连接支持

upstream http_backend {

    server 127.0.0.1:8080;

    keepalive 16;

}

 

server {

    ...

    location /http/ {

        proxy_pass //http_backend;

        proxy_http_version 1.1;

        proxy_set_header Connection "";

        ...

    }

}

 

注意:需要设置nginx 代理请求的 http 协议版本号为 1.1,  以及清除掉 Connection 请求header,  官方文档描述:

For HTTP, the proxy_http_version directive should be set to “ 1.1 ”  and the  “Connection ”  header field should be cleared .

 

The connections parameter should be set low enough to allow upstream servers to process additional new incoming connections as well. 

 

即是说:keepalive N 指令中 , N 的值应该尽可能设置小一些,以便后端机器可以同时接受新的连接。

 

在我负责的生产环境中,前端是nginx,  静态文件缓存使用 varnish,  使用长连接之后, varnish机器的连接数从 8000 多下降至 200 多,负载值也有明显降低。

 

但是针对fastcgi,  即后端机器是 php-fpm 服务时,在 nginx 日志中出现以下错误:

 upstream sent unsupported FastCGI protocol version: 0 while reading upstream 。

 

广泛搜集,目前还未解决之。如果您遇到同样的问题并解决之,请一定联系笔者信箱zhangxugg@163.com,  甚是感谢。



小马歌 2014-02-14 15:35 发表评论
]]>
nginx 502 Bad Gateway 错误解决办法 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/02/12/409784.html小马歌小马歌Wed, 12 Feb 2014 10:48:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/02/12/409784.html//www.ot7t.com.cn/xiaomage234/comments/409784.html//www.ot7t.com.cn/xiaomage234/archive/2014/02/12/409784.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/409784.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/409784.html一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现。以下是小编搜集整理的一些Nginx 502错误的排查方法,供参考:

  Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的。这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句 502 Bad Gateway,另外还不忘附上自己的大名。

Nginx 502的触发条件

  502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了 nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。我一般是全写上的:

proxy_next_upstream error timeout invalid_header http_500 http_503;

  不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆 stacktrace的错误信息,现在被502取代了。但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理 了……

503错误就可以保留,因为后端通常是apache resin,如果apache死机就是error,但resin死机,仅仅是503,所以还是有必要保留的。

解决办法

遇到502问题,可以优先考虑按照以下两个步骤去解决。

1、查看当前的PHP FastCGI进程数是否够用:

netstat -anpo | grep "php-cgi" | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

http  {
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
......

  php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了。

  如果这样修改了还解决不了问题,可以参考下面这些方案:

一、max-children和max-requests

  一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右。

  最近经?;岢鱿终庋那榭觯簆hp页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了。

  检查php-fpm的日志文件发现了一些线索。

Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200  Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″  Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll  Sep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587

  在这几句的前面,是1000多行的关闭children和开启children的日志。

  原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个 children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间 被关闭。

  在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

  解决问题很简单,增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

  打开 /usr/local/php/etc/php-fpm.conf调大以下两个参数(根据服务器实际情况,过大也不行)

<value name="max_children">5120</value>  <value name="max_requests">600</value>

  然后重启php-fpm。

二、增加缓冲区容量大小

  将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修 改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

三、request_terminate_timeout

  如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:

request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s

0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)问题解决了,执行很长时间也不会出错了。优化fastcgi中,还可以改改这个值5s 看看效果。

php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。



小马歌 2014-02-12 18:48 发表评论
]]>
Nginx proxy_cache 使用示例【转】 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/08/02/402315.html小马歌小马歌Fri, 02 Aug 2013 08:14:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/08/02/402315.html//www.ot7t.com.cn/xiaomage234/comments/402315.html//www.ot7t.com.cn/xiaomage234/archive/2013/08/02/402315.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/402315.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/402315.html原文出处://blog.chenlb.com/2010/04/nginx-proxy-cache.html

动态网站使用缓存是很有必要的。前段时间使用了 nginx proxy_stroe 来保存静态页面,以达到缓存的目的。当然 proxy stroe 用来做缓存是不够好的方案。

缓存这一块当然还有 squid 之类的独立缓存服务器。如果使用 nginx 为 web 服务器,还要加个 squid 来缓存,是觉得多了一个 http 请求层。幸好 nginx 0.7 有了 proxy_cache 来做这个缓存的事。

之前来有个 ncache 是新浪员工开发的 nginx ??椋ê孟裰荒茉?nginx 0.6 中编译无运行)。已经停止维护了,已经被加到 nginx 标准库里了。昨天还不知道 proxy_cache 就是 ncache 的功能时,还在努力匹配 ncahce,浪费了N多时间,最终没看到可以缓存。后来尝试 proxy_cache 才解决,且使用简单。

安装 Nginx 请看:安装 Nginx 配置负载均衡,如果没有 pcre 库,可以到//sourceforge.net/projects/pcre/files/ 下载(我用的是 8.02)。

nginx 0.7.65 默认安装就可以了。

安装好后开始匹配 proxy_cache,先准备后台服务器的文件,如是 time.jsp,内容:

  1. <%=new java.util.Date() %>  

conf/nginx.conf:

  1. user  nobody;  
  2. worker_processes  1;  
  3. error_log  logs/error.log;  
  4. pid        logs/nginx.pid;  
  5.   
  6. events {  
  7.     worker_connections  1024;  
  8.     use epoll;  
  9. }  
  10.   
  11. http {  
  12.     include       mime.types;  
  13.     default_type  application/octet-stream;  
  14.   
  15.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  16.                       '$status $body_bytes_sent "$http_referer" "$request_body" '  
  17.                       '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';  
  18.   
  19.     sendfile        on;  
  20.     keepalive_timeout  60;  
  21.   
  22.     proxy_cache_path /var/cache0 levels=1:2 keys_zone=pnc:100m inactive=2h max_size=10g;  
  23.     upstream backend {  
  24.         server 192.168.1.2:8080  weight=6;  
  25.         #server 192.168.1.3:8080  weight=4;  
  26.     }  
  27.   
  28.     server {  
  29.         listen       80;  
  30.         server_name  localhost;  
  31.   
  32.         access_log  logs/access.80.log  main;  
  33.   
  34.         location / {  
  35.             proxy_cache pnc;  
  36.             proxy_temp_path /var/nginx_temp;  
  37.             #proxy_cache_key "$request_uri$request_body";  
  38.             #proxy_cache_methods GET POST;  
  39.             proxy_cache_valid 200 304 1m;  
  40.             proxy_pass //backend;  
  41.         }  
  42.   
  43.         error_page   500 502 503 504  /50x.html;  
  44.         location = /50x.html {  
  45.             root   html;  
  46.         }  
  47.     }  
  48. }  

启动 nginx 后,打开浏览器,可以狂刷 Ctrl + F5,可以看到一样的页面。一分钟后再会一个新的页面。

是 proxy_cache_valid 200 304 1m; 告诉 nginx 后台返回的结果是 200 或 304 的响应,用 1m(分钟)的缓存。

proxy_cache_key 默认是 "$scheme$host$request_uri"。

proxy_cache_methods 默认是 GET HEAD。

当要缓存 post 请求后,要用 proxy_cache_methods POST 来打开。并且 proxy_cache_key 要对,post 的请求 query string 是在请求体内,所以加 $request_body 作为 key 的一部分。要用 post ,上面匹配去了注释就可以了。

这些匹配指令详情请看官方://wiki.nginx.org/NginxHttpProxyModule,中文版://wiki.nginx.org/NginxChsHttpProxyModule



小马歌 2013-08-02 16:14 发表评论
]]>
CentOS源码编译安装Nginx和tcp_proxy module - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398046.html小马歌小马歌Thu, 18 Apr 2013 09:38:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398046.html//www.ot7t.com.cn/xiaomage234/comments/398046.html//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398046.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/398046.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/398046.html到//nginx.org/en/download.html下载最新版本的Nginx并安装.
一 下载并安装pcre库ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
   tar zxvf pcre-8.30.tar.gz
   ./configure     make    make install
二 安装openssl 
   yum -y install openssl openssl-devel
三 下载tcp_proxy_module
到 https://github.com/yaoweibin/nginx_tcp_proxy_module 下载
四 安装nginx
export NGINX_VERSION=1.2.1
curl -O //nginx.org/downlad/nginx-$NGINX_VERSION.tar.gz
tar -xvzf nginx-$NGINX_VERSION.tar.gz
cd nginx-$NGINX_VERSION
patch -p1 < ../nginx_tcp_proxy_module/tcp.patch
./configure --add-module=../nginx_tcp_proxy_module/
sudo make && make install
 
启动nginx上时,服务无法启动,出现libpcre.so.1 not found的错误,解决方法如下:
先执行下述命令,查看
---#ldd $(which /usr/sbin/nginx)
显示如下:
    linux-vdso.so.1 =>  (0x00007fff7e9db000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe4629d0000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fe462799000)
    libpcre.so.1 => not found//果然没找到
    libz.so.1 => /lib64/libz.so.1 (0x00007fe462582000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fe4621e1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe462bfa000)
    libfreebl3.so => /lib64/libfreebl3.so (0x00007fe461f7e000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fe461d7a000)
执行如下:
 ----#cd /lib64
 ----#ln -s libpcre.so.0.0.1 libpcre.so.1
再次查看一下:
 ----#ldd $(which /usr/sbin/nginx)
显示已经ok了:
    linux-vdso.so.1 =>  (0x00007fff4d7ff000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb06f13e000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb06ef07000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb06ecda000)
    libz.so.1 => /lib64/libz.so.1 (0x00007fb06eac4000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fb06e723000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb06f368000)
    libfreebl3.so => /lib64/libfreebl3.so (0x00007fb06e4c0000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fb06e2bc000)
 
为websocket应用实现负载均衡 //cnodejs.org/topic/4f16442ccae1f4aa270010b3 
Reverse Proxy Web Sockets with Nginx and Socket.IO //www.letseehere.com/reverse-proxy-web-sockets


小马歌 2013-04-18 17:38 发表评论
]]>
为websocket应用实现负载均衡 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398047.html小马歌小马歌Thu, 18 Apr 2013 09:38:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398047.html//www.ot7t.com.cn/xiaomage234/comments/398047.html//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398047.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/398047.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/398047.html前言: 

websocket相信经常逛cnode社区的孩纸们都知道..具体API使用方式也再熟悉不过了..使用nodejs开发的websocket服务端也是品种繁多..github上总有你喜欢的..平时耍耍当然没问题..如果真要是承载一个生产环境服务的核心..总会有些问题需要你去解决. 

不可避免的问题: 

按照一个web请求占用线程数为参照..我们可以把nodejs称之为单线程语言..而java的servlet这种应该就是多线程语言了..我们可以想象在高并发情况下..单线程语言的运行风险还是蛮高的..毕竟如果一个请求出事那么整个线程(进程)就退出了..于是乎停止服务了..为了规避风险..我们常?;崾褂酶涸鼐饧际?.保证整个系统的对外正常服务.. 

解决方案: 

负载均衡方案目前来讲..用apache的也不多了吧..普遍的解决方案是使用nginx配置多个upstream.实现负载均衡..例子如下: 
http{ 
upstream http_sr {
server 192.168.0.2:8080;
server 192.168.0.3:8080;
}
server {
listen 80 ;
proxy_pass http_sr;
}
}

这样对于部署在192.168.0.2和3这两台机器上http服务..就通过这台nginx服务器实现了负载均衡...但是websocket的服务端nginx的http反向代理是不能支持的.从websocket的specs我们可以很明确的其实基于tcp协议的..http协议虽然也是基于tcp..它们都使用了tcp的握手方式..但是nginx的http_proxy_pass是不能支持websocket的.. 

于是我们可以寻根问主..让nginx支持tcp_proxy_pass..那websocket负载均衡的问题不就迎刃而解了..nginx有丰富的第三方扩展..一顿搜索在github上找到了yaoweibin老师的nginx_tcp_proxy_module 

  

二话不说下载此???.重新编译nginx(此过程略吧大家应该都懂) ..修改nginx配置文件加入下面conf: 
tcp { 
upstream websocket {
server 192.168.0.2:8080;
server 192.168.0.3:8080;
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 80;
proxy_pass websocket;
}
}

这个module的作者在description写到: 
 The motivation of writing these modules is Nginx's high performance and 
robustness. At first, I developed this module just for general TCP
proxy. And now, this module is frequently used in websocket reverse
proxying.

目前基本就是用来做websocket反向代理的..测试后确实是支持的..非常感谢module的开发者另外值得注意的是你要在nginx里同时配置tcp和http..那么它们是不能listen同一端口的..


小马歌 2013-04-18 17:38 发表评论
]]>
nginx_tcp_proxy_module - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398042.html小马歌小马歌Thu, 18 Apr 2013 09:19:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398042.html//www.ot7t.com.cn/xiaomage234/comments/398042.html//www.ot7t.com.cn/xiaomage234/archive/2013/04/18/398042.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/398042.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/398042.html

nginx_tcp_proxy_module 为 Nginx 增加对 TCP 的反向代理支持,提供连接有效性检测和状态监控。

配置示例:

upstream cluster {
    # simple round-robin
    server 127.0.0.1:3306;
    server 127.0.0.1:1234;

    check interval=3000 rise=2 fall=5 timeout=1000;

    #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;

    #check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    #check_http_send "GET / HTTP/1.0\r\n\r\n";
    #check_http_expect_alive http_2xx http_3xx;
}

add the feature of tcp proxy with nginx, with health check and status monitor — More...

//yaoweibin.github.com/nginx_tcp_proxy_module

Issues
#74may be a debug in ngx_tcp_upstream_check_broken_connection?by chenbk85  2013-04-17
#73reverse proxy tcp and http on the same portby beurdouche  2013-03-26
#72TCP error_logby splitice  2013-03-24
#31basic auth htpsswdby manguz  2013-03-21
#71upstream ssl suppoprt!by sleets  2013-03-13

master分支代码最近更新:2013-03-28



小马歌 2013-04-18 17:19 发表评论
]]>
nginx 高并发配置参数(转载) - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395009.html小马歌小马歌Fri, 01 Feb 2013 02:44:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395009.html//www.ot7t.com.cn/xiaomage234/comments/395009.html//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395009.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/395009.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/395009.html一、一般来说nginx 配置文件中对优化比较有作用的为以下几项:

1.  worker_processes 8;

nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。

2.  worker_cpu_affinity 00000001 0000001000000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一
个进程分配到多个cpu。

3.  worker_rlimit_nofile65535;

这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文
件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

现在在linux2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

查看linux系统文件描述符的方法:

[root@web001 ~]# sysctl -a | grep fs.file

fs.file-max = 789972

fs.file-nr = 510 0 789972

4.  useepoll;

使用epoll 的I/O 模型

(

补充说明:

与apache相类,nginx针对不同的操作系统,有不同的事件模型

     A)标准事件模型
     Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
     B)高效事件模型  
Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD2.0 和 MacOS X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
Epoll: 使用于Linux内核2.6版本及以后的系统。

/dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+(eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

       Eventport:使用于 Solaris 10. 为了防止出现内核崩溃的问题,有必要安装安全补丁。

)

5.  worker_connections65535;

每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

6.  keepalive_timeout60;

keepalive 超时时间。

7.  client_header_buffer_size4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 

分页大小可以用命令getconf PAGESIZE 取得。

[root@web001 ~]# getconf PAGESIZE 

4096

但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。

8.  open_file_cachemax=65535 inactive=60s;

这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

9.  open_file_cache_valid80s;

这个是指多长时间检查一次缓存的有效信息。

10.  open_file_cache_min_uses1;

open_file_cache 指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。


二、关于内核参数的优化:

net.ipv4.tcp_max_tw_buckets = 6000

timewait 的数量,默认是180000。

net.ipv4.ip_local_port_range = 1024 65000

允许系统打开的端口范围。

net.ipv4.tcp_tw_recycle = 1

启用timewait 快速回收。

net.ipv4.tcp_tw_reuse = 1

开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接。

net.ipv4.tcp_syncookies = 1

开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理。

net.core.somaxconn = 262144

web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。

net.core.netdev_max_backlog = 262144

每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

net.ipv4.tcp_max_orphans = 262144

系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_max_syn_backlog = 262144

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.ipv4.tcp_timestamps = 0

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

net.ipv4.tcp_synack_retries = 1

为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。

net.ipv4.tcp_syn_retries = 1

在内核放弃建立连接之前发送SYN 包的数量。

net.ipv4.tcp_fin_timeout = 1

如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些。

net.ipv4.tcp_keepalive_time = 30

当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时。


三、下面贴一个完整的内核优化设置:

vi /etc/sysctl.conf CentOS5.5中可以将所有内容清空直接替换为如下内容:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000

使配置立即生效可使用如下命令:
/sbin/sysctl -p

四、下面是关于系统连接数的优化

linux 默认值 open files 和 max user processes 为1024

#ulimit -n

1024

#ulimit –u

1024

问题描述: 说明 server 只允许同时打开 1024 个文件,处理 1024个用户进程

使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。

新装的linux 默认只有1024 ,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。

 

解决方法:

使用 ulimit –n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit-n 65535 ,-S 指soft ,-H 指hard)

有如下三种修改方式:

1. 在/etc/rc.local 中增加一行 ulimit -SHn 65535
2. 在/etc/profile 中增加一行 ulimit -SHn 65535
3. /etc/security/limits.conf最后增加:

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

具体使用哪种,在 CentOS 中使用第1 种方式无效果,使用第3 种方式有效果,而在Debian 中使用第2种有效果

 # ulimit -n

65535

# ulimit -u

65535

 

备注:ulimit 命令本身就有分软硬设置,加-H 就是硬,加-S 就是软默认显示的是软限制

soft 限制指的是当前系统生效的设置值。 hard 限制值可以被普通用户降低。但是不能增加。 soft 限制不能设置的比hard 限制更高。 只有 root 用户才能够增加 hard 限制值。


五、下面是一个简单的nginx 配置文件:

user www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 0001000000100000
01000000;
error_log /www/log/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;
events
{
use epoll;
worker_connections 204800;
}
http
{
include mime.types;
default_type application/octet-stream;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m
inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
fastcgi_temp_file_write_size 8k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_headerhttp_500;
open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/cssapplication/xml;
gzip_vary on;
server
{
listen 8080;
server_name backup.aiju.com;
index index.php index.htm;
root /www/html/;
location /status
{
stub_status on;
}
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
expires 30d;
}
log_format access '$remote_addr -- $remote_user [$time_local]"$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /www/log/access.log access;
}
}

六、关于FastCGI 的几个指令:

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2keys_zone=TEST:10minactive=5m;

这个指令为FastCGI 缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。

fastcgi_connect_timeout 300;

指定连接到后端FastCGI 的超时时间。

fastcgi_send_timeout 300;

向FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI 传送请求的超时时间。

fastcgi_read_timeout 300;

接收FastCGI 应答的超时时间,这个值是指已经完成两次握手后接收FastCGI 应答的超时时间。

fastcgi_buffer_size 4k;

指定读取FastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k。

fastcgi_buffers 8 4k;

指定本地需要用多少和多大的缓冲区来缓冲FastCGI 的应答。

fastcgi_busy_buffers_size 8k;

这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers 的两倍。

fastcgi_temp_file_write_size 8k;

在写入fastcgi_temp_path 时将用多大的数据块,默认值是fastcgi_buffers 的两倍。

fastcgi_cache TEST

开启FastCGI 缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU 负载,并且防止502 错误。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

为指定的应答代码指定缓存时间,如上例中将200,302 应答缓存一小时,301 应答缓存1 天,其他为1 分钟。

fastcgi_cache_min_uses 1;

缓存在fastcgi_cache_path 指令inactive 参数值时间内的最少使用次数,如上例,如果在5 分钟内某文件1次也没有被使用,那么这个文件将被移除。

fastcgi_cache_use_stale error timeout invalid_headerhttp_500;

不知道这个参数的作用,猜想应该是让nginx 知道哪些类型的缓存是没用的。以上为nginx 中FastCGI相关参数,另外,FastCGI 自身也有一些配置需要进行优化,如果你使用php-fpm来管理FastCGI,可以修改配置文件中的以下值:

<valuename="max_children">60</value>

同时处理的并发请求数,即它将开启最多60 个子线程来处理并发连接。

<valuename="rlimit_files">102400</value>

最多打开文件数。

<valuename="max_requests">204800</value>

每个进程在重置之前能够执行的最多请求数。



小马歌 2013-02-01 10:44 发表评论
]]>
Best Practices for Speeding Up Your Web Site - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394700.html小马歌小马歌Thu, 24 Jan 2013 06:16:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394700.html//www.ot7t.com.cn/xiaomage234/comments/394700.html//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394700.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/394700.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/394700.html阅读全文

小马歌 2013-01-24 14:16 发表评论
]]>
阿里云主机和linode的vps使用体会 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/11/08/391012.html小马歌小马歌Thu, 08 Nov 2012 05:29:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/11/08/391012.html//www.ot7t.com.cn/xiaomage234/comments/391012.html//www.ot7t.com.cn/xiaomage234/archive/2012/11/08/391012.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/391012.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/391012.html关于阿里云和linode的介绍,这里就不再赘述,不知道或者不了解可以百度一下,相关资料有很多,作为网站建设行业,服务器是不可缺少的一项基础设施,选择一款稳定的主机会给你省去很多不必要的麻烦,在这里将阿里云主机和linode的vps做以介绍。

阿里云主机和linode

1、linode vps使用体会

网站建设行业,必然少不了和备案打交道,而国内的备案手续和流程又是异常的繁琐,而且备案周期相对较长,因此,我们把企业这些网站都放在国外主机上。选择一款稳定的国外主机很重要,经过一番参考和对比,最终选择了linode的vps,在使用过程中,linode的表现也没有让我们失望,关键是稳定,服务器跑上大半年都不用重启,访问依然很流畅,也解决了需要备案的烦恼。

linode的管理后台是纯英文的,不过常用的英文单词我们都很熟悉,不会成为使用障碍,linode的管理后台是他们自己开发的,基本上在后台可以完成一切你需要的操作,开机、关机、重启、重装系统、备份、升级配置等等吧,一般我们也很少登陆后台,除了续费的时候,一般的操作就直接通过ssh管理。

2、阿里云主机使用体会

国内近两年也兴起了云主机的热潮,由于公司运营的另一个网站流量比较大,之前在国内是自己的服务器交由机房托管,但是由于读写次数非常频繁,几乎每隔一段时间就要更换硬盘,来回折腾倒数据甚是麻烦,最终决定选择试用一下阿里云的主机(主要是考虑阿里云和万网的特殊关系),试用后感觉速度和稳定性都还好,就转到了阿里云主机上。

阿里云主机的后台界面比较简单,使用起来很方便,但是通过后台重启服务器很慢,要等很久,所以需要重启的时候一般都用ssh重启,稳定性也比较好,但是感觉阿里云主机的磁盘性能不太乐观,还有就是阿里云主机的备案有限制,一台主机上最多只能绑定5个备案的域名,这样就不太适合网站建设行业,一台主机上只放5个企业网站太浪费了。

3、linode vps和阿里云主机对比

综合下来,究竟该选择使用阿里云还是linode呢?我个人的经验是:如果你是网站建设行业,并且有一定数量的企业客户,为了减少备案的麻烦,就选择放在linode上,稳定可靠,或者你的网站很难通过工信部的备案(比如博客、论坛等),那就也放在linode上;如果你是独立运营网站、流量较大,对国内访问速度要求较高,就选择阿里云主机,或者你的客户有具体需要,要求保证访问速度和稳定性、安全性,比如政府、学校、事业单位等,建议选择放在阿里云主机上。但是,无论选择那种主机,切记备份工作很重要,不要依赖官方的备份保证什么的,因为遇到一些不可抗力的因素时(如火山、地震、海啸等),数据一旦丢失,神仙也找不回来了,所以自己还是要定期备份数据并存储到相对安全的地方。

以上是我对两大主机运营商的使用体会,希望对网站建设行业相关人员带来一定的参考价值。

本文来自://www.sunfei.net

注:相关网站建设技巧阅读请移步到建站教程频道。



小马歌 2012-11-08 13:29 发表评论
]]>
大流量网站的底层系统架构 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/11/05/390813.html小马歌小马歌Mon, 05 Nov 2012 07:25:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/11/05/390813.html//www.ot7t.com.cn/xiaomage234/comments/390813.html//www.ot7t.com.cn/xiaomage234/archive/2012/11/05/390813.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/390813.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/390813.html动态应用,是相对于网站静态内容而言, 是指以c/c++、php、Java、perl、.net等 服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通 常与数据库系统、缓存系统、分布式存储系统等密不可分。

  大型动态应用系统平台主要是针对于大流 量、高并发网站建立的底层系统架构。大型网站的运行需要一个可靠、安全、可扩展、易维护的应用系统平台做为支撑,以保证网站应用的平稳运行。

  大型动态应用系统又可分为几个子系统:

  l Web前 端系统

  l 负 载均衡系统

  l 数 据库集群系统

  l 缓 存系统

  l 分 布式存储系统

  l 分 布式服务器管理系统

  l 代 码分发系统

  Web前端系统

  结构图:

  为了达到不同应用的服务器共享、避免单点故障、集中管理、统一配置等目的,不以应用划分服 务器,而是将所有服务器做统一使用,每台服务器都可以对多个应用提供服务,当某些应用访问量升高时,通过增加服务器节点达到整个服务器集群的性能提高,同 时使他应用也会受益。该Web前端系统基于Apache/Lighttpd/Eginx等 的虚拟主机平台,提供PHP程序运行环境。服务器对开发人员是透明的,不需要开发人员介入服务器管理

  负载均衡系统

  负载均衡系统分为硬件和软件两种。硬件负载均衡效率高,但是价格贵,比如F5等。软件负载均衡系统价格较低或者免费,效率较硬件负载均衡系统 低,不过对于流量一般或稍大些网站来讲也足够使用,比如lvs,nginx。大多数网站都是硬件、软件负载均衡系统并用。

  数据库集群系统

  结构图:

  由于Web前端采用了负载均衡集群结构提高了服务的有效性和扩展性,因此数据库必须也是高可靠的才能保证整个服务体系的高可靠性,如何构建一个高可靠的、可以提供大规模并发处理的数据库体系?

  我们可以采用如上图所示的方案:

  1) 使用 MySQL 数据库,考虑到Web应用的数据库读多写少的特点,我们主要对读数据库做了优化,提供专用的读数据库和写数据库,在应用程序中实现读操作和写操作分别访问不同的数据库。

  2) 使用 MySQL Replication 机制实现快速将主库(写库)的数据库复制到从库(读库)。一个主库对应多个从库,主库数据实时同步到从库。

  3) 写数据库有多台,每台都可以提供多个应用共同使用,这样可以解决写库的性能瓶颈问题和单点故障问题。

  4) 读数据库有多台,通过负载均衡设备实现负载均衡,从而达到读数据库的高性能、高可靠和高可扩展性。

  5) 数据库服务器和应用服务器分离。

  6) 从数据库使用BigIP做负载均衡。

  缓存系统

  缓存分为文件缓存、内存缓存、数据库缓存。在大型Web应用中使用最多且效率最高的是内存缓存。最常用的内存缓存工具是Memcachd。使用正确的缓存系统可以达到实现以下目标:

  1、 使用缓存系统可以提高访问效率,提高服务器吞吐能力,改善用户体验。

  2、 减轻对数据库及存储集服务器的访问压力

  3、Memcached服务器有多台,避免单点故障,提供高可靠性和可扩展性,提高性能。

  分布式存储系统

  结构图:

  WEB系统平台中的存储需求有下面两个特点:

  1) 存储量很大,经?;岽锏降ヌǚ衿魑薹ㄌ峁┑墓婺?,比如相册、视频等应用。因此需要专业的大规模存储系统。

  2) 负载均衡cluster中的每个节点都有可能访问任何一个数据对象,每个节点对数据的处理也能被其他节点共享,因此这些节点要操作的数据从逻辑上看只能是一个整体,不是各自独立的数据资源。

  因此高性能的分布式存储系统对于大型网站应用来说是非常重要的一环。(这个地方需要加入对某个分布式存储系统的简单介绍。)

  分布式服务器管理系统

  结构图:

  随着网站访问流量的不断增加,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,原来基于单机的服务器管理模式已经不能够满足我们的需求,新的需求必须能够集中式的、分组的、批量的、自动化的对服务器进行管理,能够批量化的执行计划任务。

  在分布式服务器管理系统软件中有一些比较优秀的软件,其中比较理想的一个是 Cfengine。它可以对服务器进行分组,不同的分组可以分别定制系统配置文件、计划任务等配置。它是基于C/S 结构的,所有的服务器配置和管理脚本程序都保存在Cfengine Server上,而被管理的服务器运行着 Cfengine Client 程序,Cfengine Client通过SSL加密的连接定期的向服务器端发送请求以获取最新的配置文件和管理命令、脚本程序、补丁安装等任务。

  有了Cfengine 这种集中式的服务器管理工具,我们就可以高效的实现大规模的服务器集群管理,被管理服务器和 Cfengine Server 可以分布在任何位置,只要网络可以连通就能实现快速自动化的管理。

  代码发布系统

  结构图: 

  随着网站访问流量的不断增加,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,为了满足集群环境下程序代码的批量分发和更新,我们还需要一个程序代码发布系统。

  这个发布系统可以帮我们实现下面的目标:

  1) 生产环境的服务器以虚拟主机方式提供服务,不需要开发人员介入维护和直接操作,提供发布系统可以实现不需要登陆服务器就能把程序分发到目标服务器。

  2) 我们要实现内部开发、内部测试、生产环境测试、生产环境发布的4个开发阶段的管理,发布系统可以介入各个阶段的代码发布。

  3) 我们需要实现源代码管理和版本控制,SVN可以实现该需求。

  这里面可以使用常用的工具Rsync,通过开发相应的脚本工具实现服务器集群间代码同步分发。



小马歌 2012-11-05 15:25 发表评论
]]>
nagios改用nginx+fast-cgi模式运行 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/07/17/383331.html小马歌小马歌Tue, 17 Jul 2012 09:47:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/07/17/383331.html//www.ot7t.com.cn/xiaomage234/comments/383331.html//www.ot7t.com.cn/xiaomage234/archive/2012/07/17/383331.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/383331.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/383331.html

现在apache用得越来越少了,大家都改用nginx。但有些东西还是比较依赖apache,如nagios。

想让nagios在nginx上运行,必需先让nginx支持perl和cgi解析的功能,需要用到fcgi-perl,安装方式参见我的上一篇blog:

在nginx上配置使用bugzilla

在这里就不多说了。

现在帖上perl的fast-cgi起来后,nginx的配置:

   server {
        listen       80;
        server_name  monitor.xxxx.com;

        root   /data1/www/monitor.xxxx.com;
        index  index.php index.html index.htm;

        access_log /data1/app/log/nginx/monitor.xxxx.com.log  combined;
        error_log  /data1/app/log/nginx/error-monitor.xxxx.com.log notice;

        allow 10.0.0.0/8;
        deny all;

        location ~ \.php$ {

            root  /data1/www/monitor.xxxx.com;

            fastcgi_pass   unix:/data1/app/tmp/php-cgi.sock;
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }

        location /nagios/ {

            alias /usr/share/nagios/;
            index index.html index.htm index.php;

            auth_basic "Nagios Access";
            auth_basic_user_file htpasswd.users;

            location ~ \.php$ {
                root /usr/share;
                fastcgi_pass   unix:/data1/app/tmp/php-cgi.sock;
                fastcgi_index  index.php;
                include        fastcgi.conf;
            }

        }

        location ~ .*\.(pl|cgi)$ {
            rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;

            auth_basic "Nagios Access";
            auth_basic_user_file htpasswd.users;

            gzip off;
            include fastcgi_params;
            fastcgi_pass  127.0.0.1:8999;
            fastcgi_index index.cgi;
            fastcgi_param SCRIPT_FILENAME  /usr/lib64/nagios/cgi$fastcgi_script_name;
            fastcgi_param AUTH_USER $remote_user;
            fastcgi_param REMOTE_USER $remote_user;

        }


   }

 

然后重新生成认证文件htpasswd.users放在nginx的conf目录。重启nginx服务便可。

生成认证文件使用:

htpasswd -c htpasswd.users nagiosadmin

特别注意下面两个参数,一定要加上:

            fastcgi_param AUTH_USER $remote_user;
            fastcgi_param REMOTE_USER $remote_user;

否则进入nagios会提示没有认证。



小马歌 2012-07-17 17:47 发表评论
]]>
解决nginx access日志中400 bad request 错误 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/07/17/383329.html小马歌小马歌Tue, 17 Jul 2012 09:45:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/07/17/383329.html//www.ot7t.com.cn/xiaomage234/comments/383329.html//www.ot7t.com.cn/xiaomage234/archive/2012/07/17/383329.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/383329.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/383329.html

在access.log中有大量400错误,并以每天几百M的速度增加,占用大量空间.
tail -f /opt/nginx/logs/access.log

    116.236.228.180 - - [15/Dec/2010:11:00:15 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:15 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:15 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:15 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:15 +0800] "-" 400 0 "-" "-"
    119.97.196.7 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    119.97.196.7 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    219.243.95.197 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"
    116.236.228.180 - - [15/Dec/2010:11:00:16 +0800] "-" 400 0 "-" "-"

网上大把的文章说是HTTP头/Cookie过大引起的,可以修改nginx.conf中两参数来修正.

    client_header_buffer_size 16k;
          large_client_header_buffers 4 32k;

修改后

    client_header_buffer_size 64k;
         large_client_header_buffers 4 64k;

没有效果,就算我把nginx0.7.62升到最新的0.8.54也没能解决.
在官方论坛中nginx作者提到空主机头不会返回自定义的状态码,是返回400错误.
//forum.nginx.org/read.php?2,9695,11560

最后修正如下
改为原先的值

    client_header_buffer_size 16k;
         large_client_header_buffers 4 32k;

关闭默认主机的日志记录就可以解决问题

    server {
    listen *:80 default;
    server_name _;
    return 444;
    access_log   off;
         }

 

 

本文来自://blog.c1gstudio.com/archives/1153



小马歌 2012-07-17 17:45 发表评论
]]>
Apache 2.4 Faster Than Nginx? - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/02/29/370949.html小马歌小马歌Tue, 28 Feb 2012 16:38:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/02/29/370949.html//www.ot7t.com.cn/xiaomage234/comments/370949.html//www.ot7t.com.cn/xiaomage234/archive/2012/02/29/370949.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/370949.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/370949.htmlSome reports came out recently after Apache 2.4 was released, saying it’s “as fast, and even faster than Nginx”. To check it out if it’s true, I ran a benchmark by myself. Here are the benchmark results.

9K



It turned out that it’s a false claim. Apache 2.4 is actually much slower than Nginx!

The benchmark was run on the same Linux box (localhost), to avoid possible network affection. I used ab (ApacheBench) as the benchmark client. Apache listened on port 80 and Nginx listened on port 81. In the whole benchmark process, Apache was stressed first then Nginx. There was a 60 seconds sleep between each test, which was taken by five times per concurrency (from 100 to 1000). I gave up the tests with higher concurrencies because Apache was so unstable with concurrency greater than 1000 that there would be some failures. While Nginx was very stable without problems.

I’ve tried my best to fully “unleash the power of Apache”:
1) configured with apr-1.4.6 and apr-util-1.4.1, using the fastest atomic API:

$ ./configure --prefix=/home/shudu/apache --with-included-apr \ --enable-nonportable-atomics=yes

2) least modules were enabled:

$ apache/bin/httpd -M Loaded Modules:  core_module (static)  so_module (static)  http_module (static)  mpm_event_module (static)  authz_core_module (shared)  filter_module (shared)  mime_module (shared)  unixd_module (shared)

3) MaxRequestWorkers was raised to 800 and ServerLimit to 32.

Nginx was just compiled with its default options:

$ ./configure --prefix=/home/shudu/bench/nginx

The common features of Apache and Nginx:
1) Sendfile on.
2) KeepAlive off.
3) AccessLog off.

The configuration files of Apache and Nginx are as followings:

# Apache 2.4.1 ServerRoot "/home/shudu//bench/apache"   KeepAlive Off   ServerLimit 32 MaxRequestWorkers 800   Listen 80 ServerName localhost   LoadModule authz_core_module modules/mod_authz_core.so LoadModule filter_module modules/mod_filter.so LoadModule mime_module modules/mod_mime.so LoadModule unixd_module modules/mod_unixd.so   <IfModule unixd_module> User shudu Group shudu </IfModule>   ServerAdmin you@example.com   <Directory />     AllowOverride none     Require all denied </Directory>   DocumentRoot "/home/shudu/bench/apache/htdocs" <Directory "/home/shudu/bench/apache/htdocs">     Options Indexes FollowSymLinks     AllowOverride None     Require all granted </Directory>   ErrorLog "logs/error_log" LogLevel warn   <IfModule mime_module>     TypesConfig conf/mime.types     AddType application/x-compress .Z     AddType application/x-gzip .gz .tgz </IfModule>   EnableSendfile on
# Nginx-1.0.12 user  shudu users; worker_processes  2;   events {     worker_connections  10240;     accept_mutex_delay  100ms; }   http {     include             mime.types;     default_type        application/octet-stream;       sendfile            on;     tcp_nopush          on;       keepalive_timeout   0;       access_log off;       server {         listen          81;         server_name     localhost;           location / {             root        html;             index       index.html index.htm;         }     } }

My Ubuntu-10.04 box:

$ uname -a Linux shudu-desktop 2.6.32-38-generic #83-Ubuntu SMP Wed Jan 4 11:13:04 UTC 2012 i686 GNU/Linux
$ grep "model\ name" /proc/cpuinfo  model name	: Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz model name	: Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz
$ free -m              total       used       free     shared    buffers     cached Mem:          1995       1130        864          0         80        341 -/+ buffers/cache:        708       1286 Swap:         2491          0       2491
$ cat /etc/security/limits.conf root soft nofile 65535 root hard nofile 65535 shudu soft nofile 65535 shudu hard nofile 65535

Comments are welcome :)



小马歌 2012-02-29 00:38 发表评论
]]>
隐藏nginx apache和php的版本信息不显示 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/02/27/370852.html小马歌小马歌Mon, 27 Feb 2012 08:06:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/02/27/370852.html//www.ot7t.com.cn/xiaomage234/comments/370852.html//www.ot7t.com.cn/xiaomage234/archive/2012/02/27/370852.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/370852.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/370852.htmlweb server避免一些不必要的麻烦,可以把apache和php的版本信息不显示

隐藏 Apache 版本信息

/etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf

ServerTokens ProductOnly
ServerSignature Off

重启 apache
现在 http 头里面只看到:
Server: Apache

=====================

nginx

#vi nginx.conf
在http 加上 server_tokens off;

如下:

http {
……省略配置
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
server_tokens off;
…….省略配置
}

=======================

隐藏 PHP 版本
php.ini

expose_php On
改成
expose_php Off

重启apache后,php版本在http头中隐藏了。

详解 :

为了防止某些别有用心的家伙窥视我们的服务器,应该做些什么.
我们来看一下相关的2个参数,分别为ServerTokens和ServerSignature,通过控制这2个阀门应该就能起到一些作用,比如我们可以在配置文件中这么写:
ServerTokens Prod
ServerSignature Off

ServerTokens
用 于控制服务器是否相应来自客户端的请求,向客户端输出服务器系统类型或内置??榈戎匾南低承畔?。在主配置文件中提供全局控制默认阀值为"Full" (ServerTokens Full),所以,如果你的Linux发行版本没有更改过这个阀值的话,所有与你的系统有关的敏感信息都会向全世界公开。比如RHEL会将该阀值更改 为"ServerTokens OS",而Debian依然使用默认的"Full"阀值
以apache-2.0.55为例,阀值可以设定为以下某项(后面为相对应的Banner Header):
Prod >>> Server: Apache
Major >>> Server: Apache/2
Minor >>> Server: Apache/2.0
Minimal >>> Server: Apache/2.0.55
OS >>> Server: Apache/2.0.55 (Debian)
Full (or not specified) default >>> Server: Apache/2.0.55 (Debian) PHP/5.1.2-1+b1 mod_ssl/2.0.55 OpenSSL/0.9.8b

ServerSignature
控制由系统生成的页面(错误信息,mod_proxy ftp directory listing等等)的页脚中如何显示信息。

可在全局设置文件中控制,或是通过.htaccess文件控制
默认为"off"(ServerSignature Off),有些Linux发行版本可能会打开这个阀门,比如Debian在默认的虚拟主机上默认将这个阀门设置为开放
全局阀门的阀值会被虚拟主机或目录单位的配置文件中的阀值所覆盖,所以,必须确保这样的事情不应该发生
可用的阀值为下面所示:
Off (default): 不输出任何页脚信息 (如同Apache1.2以及更旧版本,用于迷惑)
On:输出一行关于版本号以及处于运行中的虚拟主机的ServerName (2.0.44之后的版本,由ServerTokens负责是否输出版本号)
EMail: 创建一个发送给ServerAdmin的"mailto"

注意*上述关于如何设置2个阀门从而尽量减少敏感信息泄露的方法,并不会使你的服务器真的更安全,如果你现在使用的版本比较旧,请务必尽快将系统升级,降低被蠕虫攻击的风险。

 

隐藏server信息

cd /usr/local/src/nginx-0.5.35/src/core/
[root@zyatt core]# cat nginx.h
/*
* Copyright (C) Igor Sysoev
*/
#ifndef _NGINX_H_INCLUDED_
#define _NGINX_H_INCLUDED_
#define NGINX_VERSION      "1.0"
#define NGINX_VER          "LPKWS/" NGINX_VERSION
#define NGINX_VAR          "LPKWS"
#define NGX_OLDPID_EXT     ".oldbin"
#endif /* _NGINX_H_INCLUDED_ */
测试效果
C:\curl-7.18.0>curl.exe -I 211.100.11.122/info.php

HTTP/1.1 200 OK
Server: LPKWS/1.0
Date: Tue, 11 Mar 2008 04:53:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.4

 

还有更彻底的编译安装

修改src/core/nginx.h

#define NGINX_VERSION "1.0.5"

#define NGINX_VER "nginx/" NGINX_VERSION

#define NGINX_VAR "NGINX"


修改src/http/ngx_http_header_filter_module.c48-49
static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: nginx" CRLF;


修改src/http/ngx_http_special_response.c

staticu_char ngx_http_error_tail[]="<hr><center>nginx</center>"CRLF

"</body>"CRLF

"</html>"CRLF

;


嘿嘿,接下来就编译安装吧!不过修改源码后还有1个地方要修改哦,Nginx的FastCGI配置文件fastcgi.conf

fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

常用Web Server版本名称:

Microsoft-IIS
GWS或GFE
Apache

Lighttpd

 

 

 

1. Lighttpd 1.4.20
src/response.c:108 改为:
buffer_append_string_len(b, CONST_STR_LEN("Server: jufukeji"));
输出 Header:
HTTP/1.1 404 Not Found
Content-Type: text/html
Content-Length: 345
Date: Mon, 12 Jan 2009 13:54:02 GMT
Server: jufukeji

2. Nginx 0.7.30
src/http/ngx_http_header_filter_module.c:48-49 改为:
static char ngx_http_server_string[] = "Server: jufukeji" CRLF;
static char ngx_http_server_full_string[] = "Server: jufukeji" CRLF;
输出 Header:
HTTP/1.1 200 OK
Server: jufukeji
Date: Mon, 12 Jan 2009 14:01:10 GMT
Content-Type: text/html
Content-Length: 151
Last-Modified: Mon, 12 Jan 2009 14:00:56 GMT
Connection: keep-alive
Accept-Ranges: bytes

3. Cherokee 0.11.6
cherokee/version.c:93 添加:
ret = cherokee_buffer_add_str (buf, "jufukeji");
return ret;
输出 Header:
HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=15
Date: Mon, 12 Jan 2009 14:54:39 GMT
Server: jufukeji
ETag: 496b54af=703
Last-Modified: Mon, 12 Jan 2009 14:33:19 GMT
Content-Type: text/html
Content-Length: 1795

4. Apache 2.2.11
server/core.c:2784 添加:
ap_add_version_component(pconf, "jufukeji");
return;
输出 Header:
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2009 14:28:10 GMT
Server: jufukeji
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: "1920edd-2c-3e9564c23b600"
Accept-Ranges: bytes
Content-Length: 44
Content-Type: text/html

5. Squid 3.0 STABLE 11
src/globals.cc:58 改为:
const char *const full_appname_string = "jufukeji";
输出 Header:
HTTP/1.0 400 Bad Request
Server: jufukeji
Mime-Version: 1.0
Date: Mon, 12 Jan 2009 15:25:15 GMT
Content-Type: text/html
Content-Length: 1553
Expires: Mon, 12 Jan 2009 15:25:15 GMT
X-Squid-Error: ERR_INVALID_URL 0
X-Cache: MISS from 'cache.hutuworm.org'
Via: 1.0 'cache.hutuworm.org' (jufukeji)
Proxy-Connection: close

6. Tomcat 6.0.18
java/org/apache/coyote/http11/Constants.java:56 和 java/org/apache/coyote/ajp/Constants.java:236 均改为:
ByteChunk.convertToBytes("Server: jufukeji" + CRLF);
输出 Header:
HTTP/1.1 200 OK
Server: jufukeji
ETag: W/"7857-1216684872000"
Last-Modified: Tue, 22 Jul 2008 00:01:12 GMT
Content-Type: text/html
Content-Length: 7857
Date: Mon, 12 Jan 2009 16:30:44 GMT

7. JBoss 5.0.0 GA
a. tomcat/src/resources/web.xml:40 改为
jufukeji
b. 下载 JBoss Web Server 2.1.1.GA srctar (//www.jboss.org/jbossweb/downloads/jboss-web/)
java/org/apache/coyote/http11/Constants.java:56 和 java/org/apache/coyote/ajp/Constants.java:236 均改为:
ByteChunk.convertToBytes("Server: jufukeji" + CRLF);
将编译所得 jbossweb.jar 覆盖 JBoss 编译输出文件:
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/all/deploy/jbossweb.sar/jbossweb.jar
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/standard/deploy/jbossweb.sar/jbossweb.jar
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/default/deploy/jbossweb.sar/jbossweb.jar
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/web/deploy/jbossweb.sar/jbossweb.jar
输出 Header:
HTTP/1.1 200 OK
Server: jufukeji
X-Powered-By: jufukeji
Accept-Ranges: bytes
ETag: W/"1581-1231842222000"
Last-Modified: Tue, 13 Jan 2009 10:23:42 GMT
Content-Type: text/html
Content-Length: 1581
Date: Tue, 13 Jan 2009 10:30:42 GM



小马歌 2012-02-27 16:06 发表评论
]]>
用cacti 以图表方式 展示nginx 状态统计图 【转】 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/12/15/366452.html小马歌小马歌Thu, 15 Dec 2011 08:37:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/12/15/366452.html//www.ot7t.com.cn/xiaomage234/comments/366452.html//www.ot7t.com.cn/xiaomage234/archive/2011/12/15/366452.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/366452.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/366452.html//forums.cacti.net/about26458.html

Scripts and templates for nginx. 

Nginx - //nginx.net/ 

Provide graphing nginx clients statistics (active, reading, writing, waiting) and nginx socket statistics (accepts, handled, requests). It's a formal devision used only for graphs usability. 

For use do next steps: 

1. Enable nginx http_stub_status_module at configure stage (if requared). 

2. Enable stub status. Add to nginx.conf (in any server context): 

Code:
location /nginx_status {
   stub_status on;
   # disable access_log if requared
   access_log   off;
   #allow XX.YY.AA.ZZ;
   #allow YY.ZZ.JJ.CC;
   #deny all;
}


Restart nginx.

3.

Code:
cp get_nginx_clients_status.pl <path_cacti>/scripts/
cp get_nginx_socket_status.pl <path_cacti>/scripts/
chmod 0755 <path_cacti>/scripts/get_nginx_socket_status.pl
chmod 0755 <path_cacti>/scripts/get_nginx_clients_status.pl


4. Check that it's work. Run

Code:
get_nginx_clients_status.pl //nginx.server.tld/nginx_status


and see that returned the same string:

Code:
nginx_accepts:113869 nginx_handled:113869 nginx_requests:122594


5. Import to cacti cacti_graph_template_nginx_clients_stat.xml and cacti_graph_template_nginx_sockets_stat.xml. 

6. Add nginx graphs to your hosts. 

P.S. Sorry for my english :)


Attachments:
 cacti-nginx.tar.gz [5.15 KiB] 
Downloaded 6371 times 


小马歌 2011-12-15 16:37 发表评论
]]>
webServer nginx_optimize - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366138.html小马歌小马歌Mon, 12 Dec 2011 06:12:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366138.html//www.ot7t.com.cn/xiaomage234/comments/366138.html//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366138.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/366138.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/366138.html
使用 Nginx 提升网站访问速度 

//www.ibm.com/developerworks/cn/web/wa-lo-nginx/

刘 柄成 (javayou@gmail.com), 软件工程师, 广州市摩网信息技术有限公司 
简介: 本文主要介绍如何在 Linux 系统上安装高性能的 HTTP 服务器 —— Nginx、并在不改变原有网站结构的条件下用 Nginx 来提升网站的访问速度。
刘柄成一直使用 J2EE/J2ME 从事移动互联网方面的开发。DLOG4J 的作者,您可以通过 Java 自由人网站来跟他联系,网址是://www.javayou.com ,另外他的邮件地址是 javayou@gmail.com。

nginx怎么加expire头

//blog.csdn.net/love__coder/archive/2010/09/02/5859820.aspx

     nginx怎么对网站的图片、js和css添加过期头呢?

     在nginx配置文件server配置下,添加如下配置:

  server {

 location ~* ^.+\.(jpg|jpeg|gif|png|bmp)$ {
        access_log /data/logs/image.log;
        root '/usr/opt/nginx/html/www1';
        expires 30d;
        break;
    }

 

    location ~* ^.+\.(js|css)?${
       access_log /data/logs/jsandcss.log;    
       root '/usr/opt/nginx/html/www1';
       expires 30d;
    }

    }

     keyword:nginx expire

 

Apache/Nginx Cache Last-Modified、Expires和Etag相关工作原理

//www.yanghengfei.com/archives/524/

 

使用ETag和expires 调优web 服务器性能

正确使用Etag和Expires标识处理,可以使得页面更加有效被Cache。

在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下:

HTTP/1.1 200 OK

Date: Tue, 03 Mar 2009 04:58:40 GMT

Content-Type: image/jpeg

Content-Length: 83185

Last-Modified: Mon, 22 Nov 2010 16:29:24 GMT

Cache-Control: max-age=2592000


Expires: Thu, 02 Apr 2009 05:14:08 GMT

Etag: "xok.la-961AA72-4CEA99B4415628″
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应并记录相关记录属性标记文件没有发生改动,服务器端返回304,直接从缓存中读?。?/p>

HTTP/1.x 304 Not Modified

Date: Tue, 03 Mar 2009 05:03:56 GMT

Content-Type: image/jpeg

Content-Length: 83185

Last-Modified: Mon, 22 Nov 2010 16:29:24 GMT

Cache-Control: max-age=2592000

Expires: Thu, 02 Apr 2009 05:14:08 GMT

Etag: "xok.la-961AA72-4CEA99B4415628″
其中Last-Modified、Expires和Etag是标记页面缓存标识

一、Last-Modified、Expires和Etag相关工作原理

1、Last-Modified

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记 (Http Reponse Header)此文件在服务期端最后被修改的时间,格式类似这样:

Last-Modified: Mon, 22 Nov 2010 16:29:24 GMT
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过:

If-Modified-Since: Mon, 22 Nov 2010 16:29:24 GMT
如果服务器端的资源没有变化,则自动返回 HTTP 304 (NotChanged.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类 似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

注:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求

2、Etag工作原理

HTTP 协议规格说明定义ETag为”被请求变量的实体标记” (参见14.19)。简单点即服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:

Etag: "xok.la-961AA72-4CEA99B4415628″
客户端的查询更新格式是这样的:

If-None-Match: "xok.la-961AA72-4CEA99B4415628″
如果ETag没改变,则返回状态304。

即:在客户端发出请求 后,Http Reponse Header中包含 Etag: “xok.la-961AA72-4CEA99B4415628″

标识,等于告诉Client端,你拿到的这个的资源有表示 ID:xok.la-961AA72-4CEA99B4415628。当下次需要发Request索要同一个 URI的时候,浏览器同时发出一个If-None-Match报头( Http RequestHeader)此时包头中信息包含上次访问得到的Etag: “xok.la-961AA72-4CEA99B4415628″标识。

If-None-Match: "xok.la-961AA72-4CEA99B4415628"
,这样,Client端等于Cache了两份,服务器端就会比对2者的etag。如果If- None-Match为False,不返回200,返回304 (Not Modified) Response。

3、Expires

给出的 日期/时间后,被响应认为是过时。如Expires: Thu, 02 Apr 2009 05:14:08 GMT

需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客 户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。

4、Last-Modified和Expires

Last- Modified标识能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而且要和Expires一起用。而Expires标识却使得浏览器干脆连 HTTP请求都不用发,比如当用户F5或者点击Refresh按钮的时候就算对于有Expires的URI,一样也会发一个HTTP请求出去,所 以,Last-Modified还是要用的,而 且要和Expires一起用。

5、 Etag和Expires

如果服务器端同时设置了Etag和Expires 时,Etag原理同样,即与Last-Modified/Etag对应的HttpRequest Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和WebServer发出的 Last-Modified,Etag值完全一样;在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和 Etag之后,服务器才能返回304.

6、Last-Modified和Etag

Last-Modified 和ETags请求的http报头一起使用,服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改,来决定文件是否继续缓存

过程如下:

1. 客户端请求一个页面(A)。

2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。

3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。

4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。

5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

注:

1、Last- Modified和Etag头都是由Web Server发出的Http Reponse Header,Web Server应该同时支持这两种头。

2、Web Server发送完Last-Modified/Etag头给客户端后,客户端会缓存这些头;

3、客户端再次发起相同页面的请求时,将分别发送与Last-Modified/Etag对应的Http RequestHeader:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和 WebServer发出的Last-Modified,Etag值完全一样;

4、 通过上述值到服务器端检查,判断文件是否继续缓存;

二、Apache、 Lighttpd和Nginx中针配置Etag和Expires,有效缓存纯静态如css/js/pic/页面/流媒体等文件。

A、Expires

A.1、 Apache Etag

使用Apache的mod_expires ??槔瓷柚?,这包括控制应答时的Expires头内容和Cache-Control头的max-age指令

ExpiresActive On

ExpiresByType image/gif "access plus 1 month"

ExpiresByType image/jpg "access plus 1 month"

ExpiresByType image/jpeg "access plus 1 month"

ExpiresByType image/x-icon "access plus 1 month"

ExpiresByType image/bmp "access plus 1 month"

ExpiresByType image/png "access plus 1 month"

ExpiresByType text/html "access plus 30 minutes"

ExpiresByType text/css  "access plus 30 minutes"

ExpiresByType text/txt  "access plus 30 minutes"

ExpiresByType text/js   "access plus 30 minutes"

ExpiresByType application/x-javascript   "access plus 30 minutes"

ExpiresByType application/x-shockwave-flash     "access plus 30 minutes"

<ifmodule mod_expires.c>

<filesmatch "\.(jpg|gif|png|css|js)$">

ExpiresActive on

ExpiresDefault "access plus 1 year"

</filesmatch>

</ifmodule>
当设置了expires后,会自动输出Cache-Control 的max-age 信息

具体关于 Expires 详细内容可以查看Apache官方文档。

在这个时间段里,该文件的请求都将直接通过缓存服务器获取,

当然如果需要忽略浏览器的刷新请求(F5),缓存服务器squid还需要使用 refresh_pattern 选项来忽略该请求

refresh_pattern -i \.gif$ 1440 100% 28800 ignore-reload

refresh_pattern -i \.jpg$ 1440 100% 28800 ignore-reload

refresh_pattern -i \.jpeg$ 1440 100% 28800 ignore-reload

refresh_pattern -i \.png$ 1440 100% 28800 ignore-reload

refresh_pattern -i \.bmp$ 1440 100% 28800 ignore-reload

refresh_pattern -i \.htm$ 60 100% 100 ignore-reload

refresh_pattern -i \.html$ 1440 50% 28800 ignore-reload

refresh_pattern -i \.xml$ 1440 50% 28800 ignore-reload

refresh_pattern -i \.txt$ 1440 50% 28800 ignore-reload

refresh_pattern -i \.css$ 1440 50% 28800 reload-into-ims

refresh_pattern -i \.js$ 60 50% 100 reload-into-ims

refresh_pattern . 10 50% 60
有关Squid中Expires的说明,请参考Squid官方中refresh_pattern介 绍。

A.2、Lighttpd Expires

和Apache一样Lighttpd设置expire也要先查看是否支持了mod_expire模 块,

下面的设置是让URI中所有images目录下的文件1小时后过期;

expire.url = ( "/images/" => "access 1 hours" )
下面是让作用于images目录及其子目录的文件;

$HTTP["url"] =~ "^/images/" {
 
expire.url = ( "" => "access 1 hours" )
 
}
也可以指定文件的类型;

$HTTP["url"] =~ "\.(jpg|gif|png|css|js)$" {
 
expire.url = ( "" => "access 1 hours" )
 
}
具体参考Lighttpd官方Expires解释

A.3、Nginx中Expireslocation ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires 30d;

}

location ~ .*\.(js|css)?$

{

expires 1h;

}
这类文件并不常修改,通过 expires 指令来控制其在浏览器的缓存,以减少不必要的请求。 expires 指令可以控制 HTTP 应答中的” Expires “和” Cache-Control “的头标(起到控制页面缓存的作用)。其他请参考Nginx中Expires

B.1、Apache中Etag设置
在Apache中设置Etag的支持比较简单,只用在含有静态文件的目录中建立一个文件.htaccess, 里面加入:

FileETag MTime Size
这样就行了,详细的可以参考Apache的FileEtag文档页

B.2、 Lighttpd Etag
在Lighttpd中设置Etag支持:

etag.use-inode: 是否使用inode作为Etag

etag.use-mtime: 是否使用文件修改时间作为Etag

etag.use-size: 是否使用文件大小作为Etag

static-file.etags: 是否启用Etag的功能

第四个参数肯定是要enable的, 前面三个就看实际的需要来选吧,推荐使用修改时间

B.3、 Nginx Etag

Nginx中默认没有添加对Etag标识.Igor Sysoev的观点”在对静态文件处理上看不出如何Etag好于Last-Modified标识。”

Note:

Yes, it's addition,and it's easy to add, however, I do not see howETag is better than Last-Modified for static files. -Igor Sysoev

A nice short description is here:

//www.mnot.net/cache_docs/#WORK

It looks to me that it makes some caches out there to cache theresponse from the origin server more reliable as in rfc2616(ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt) is written.
3.11 Entity Tags 13.3.2 Entity Tag Cache Validators 14.19 ETag

当然也有第三方nginx- static-etags ??榱?,请参考

https://github.com/mikewest/nginx-static-etags

三、对于非实时交互动态页面中Expires和Etag处理

对数据更新并不频繁、如tag分类归档等等,可以考虑对其cache。简单点就是在非实时交互的动 态程序中输出expires和etag标识,让其缓存。但需要注意关闭session,防止http response时http header包含session id标识;

3.1、Expires

如expires.php

<?php
 
header('Cache-Control: max-age=86400,must-revalidate');
 
header('Last-Modified: ' .gmdate('D, d M Y H:i:s') . ' GMT' );
 
header("Expires: " .gmdate ('D, d M Y H:i:s', time() + '86400′ ). ' GMT');
 
?>
以上信息表示该文件自请求后24小时后过期。

其他需要处理的动态页面直接调用即可。

3.2、Etag

根据Http返回状态来处理。当返回304直接从缓 存中读取

如etag.php

>


cache();

echo date("Y-m-d H:i:s");

function cache()

{

$etag = "//xok.la";

if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag)

{

header('Etag:'.$etag,true,304);

exit;

}

else header('Etag:'.$etag);

}

?>


本文来自: E点废墟(www.xok.la)

详细出处参考://xok.la/2010/11/apache_nginx_cache_last-modified%e3%80%81expires_etag.html

 

varnish,squid,apache,nginx缓存文件比较

//blog.51yip.com/server/1032.html

一,测试环境

1,硬件是奔腾双核,机子三年前买的。系统是archlinux

2,测试varnish和squid的时候,web服务用的apache

3,测试apache的时候,启动了5个进程,不过随着压力的增加,进程会增加的。

4,测试nginx的时候,启动了十个nginx进程,20个php-cgi进程

 

5,varnish,squid,nginx用的是反向代理的形势,也就是说访问图片的时候,要先透过缓存工具

二,测试

1,varnish

[root@BlackGhost bin]# /usr/local/bin/webbench -c 100 -t 20 //127.0.0.1:8080/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET //127.0.0.1:8080/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
100 clients, running 20 sec.

Speed=476508 pages/min, 47258114 bytes/sec.
Requests: 158836 susceed, 0 failed.

varnish的缓存效率命中率真的好高,看下图:

varnish

varnish

访问了这么次,没有缓存只有一次,效率真的很高。

2,squid

[root@BlackGhost bin]# /usr/local/bin/webbench -c 100 -t 20 //localhost:9000/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET //localhost:9000/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
100 clients, running 20 sec.

Speed=133794 pages/min, 7475018 bytes/sec.
Requests: 44598 susceed, 0 failed.

从测试效果来说,squid挺让我失望的,在测试前,我心里是这样估计的,缓存最好的是 varnish,其次是squid,然后nginx,最后是apache,现在呢,squid是最差的。后来我看了一下log文件,发现正常情况下,缓存 和没有缓存的比率不是1:2,如果在高压力下,缓存和没有缓存的比率更小。

3,apache

[root@BlackGhost conf]# /usr/local/bin/webbench -c 100 -t 20 //localhost/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET //localhost/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
100 clients, running 20 sec.

Speed=160890 pages/min, 15856005 bytes/sec.
Requests: 53630 susceed, 0 failed.

4,nginx

[root@BlackGhost conf]# /usr/local/bin/webbench -c 100 -t 20 //localhost:10000/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET //localhost:10000/00/01/RwGowEtWvcQAAAAAAAAWHH0Rklg81.gif
100 clients, running 20 sec.

Speed=304053 pages/min, 30121517 bytes/sec.
Requests: 101351 susceed, 0 failed.

从上面的测试结果我们可以发现,varnish > nginx > apache > squid,我想这个结果,根大家预期的结果有点出入,因为squid做老牌文件缓存工具怎么会这么差呢,squid的命中率低,我在网上查了一下,很多 人都是这样的,这个可能根个人配置有关系,也许真正的高手,才能让squid发挥最大功力。



小马歌 2011-12-12 14:12 发表评论
]]>
影响Cache的几个HTTP头信息 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366139.html小马歌小马歌Mon, 12 Dec 2011 06:12:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366139.html//www.ot7t.com.cn/xiaomage234/comments/366139.html//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366139.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/366139.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/366139.html

注:本篇是关于http头信息cache的一些说明,理论行较强,但是很有用,不管是开发还是运维都得了解,如果还没有研究到这一块的朋友看起来觉得会比较枯燥。

转载于://hi.baidu.com/feilala_fly/blog/item/29b9f200f26c5f03738b6521.html

Http的Cache机制总共有4个组成部分:

Cache-Control、Last-Modified(If-Modified-Since)、Etag(If-None-Match) 、Expires

服务器响应头:Last-Modified,Etag
浏览器请求头:If-Modified-Since,If-None-Match

服务器发出Etag,Last-Modified头后,下次浏览器再进行同样的请求,则会发出If-None-Match,If-

Modified-Since头,而后服务器根据这些信息来判断是否需要发送数据,如果没有更新,服务器就简单的

发送一个304状态告诉浏览器用缓存就OK了,不用下载数据了,从而节约了带宽。

Last-Modified / If-Modified-Since

Last-Modified是响应头,If-Modified-Since是请求头。Last-Modified把Web组件的最后修改时间告诉客

户端,客户端在下次请求此Web组件的时候,会把上次服务端响应的最后修改时间作为If-Modified-Since

的值发送给服务器,服务器可以通过这个值来判断是否需要重新发送,如果不需要,就简单的发送一个

304状态码,客户端将从缓存里直接读取所需的Web组件。如果有更新,返回HTTP 200和更新的页面内容,

并且携带新的”ETag”和”LastModified”。

    使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。

ETag / If-None-Match

ETag是响应头,If-None-Match是请求头。Last-Modified / If-Modified-Since的主要缺点就是它只能精确到秒的级别,一旦在一秒的时间里出现了多次修改,那么Last-Modified / If-Modified-Since是无法体现的。相比较,ETag / If-None-Match没有使用时间作为判断标准,而是使用一个特征串。Etag把Web组件的特征串告诉客户端,客户端在下次请求此Web组件的时候,会把上次服务端响应的特征串作为If-None-Match的值发送给服务端,服务端可以通过这个值来判断是否需要从重新发送,如果不需要,就简单的发送一个304状态码,客户端将从缓存里直接读取所需的Web组件。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。

 

当服务器发出响应的时候,可以通过两种方式来告诉客户端缓存请求:

第一种是Expires,比如:Expires: Sun, 16 Oct 2016 05:43:02 GMT在此日期之前,客户端都会认为缓存是有效的。

不过Expires有缺点,比如说,服务端和客户端的时间设置可能不同,这就会使缓存的失效可能并不能精确的按服务器的预期进行。

第二种是Cache-Control,比如:Cache-Control: max-age=3600

这里声明的是一个相对的秒数,表示从现在起,3600秒内缓存都是有效的,这样就避免了服务端和客户端时间不一致的问题。

但是Cache-Control是HTTP1.1才有的,不适用与HTTP1.0,而Expires既适用于HTTP1.0,也适用于HTTP1.1,所以说在大多数情况下同时发送这两个头会是一个更好的选择,当客户端两种头都能解析的时候,会优先使用Cache-Control基础知识

         1) 什么是”Last-Modified”? 

         在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(Http Reponse Header)此文件在服务期端最后被修改的时间,格式类似这样: 

        Last-Modified: Fri, 12 May 2006 18:53:33 GMT

         客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过: 

        If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT

         如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。 
:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,Apache会认为是个非法请求

         2) 什么是”Etag”? 

         HTTP 协议规格说明定义ETag为“被请求变量的实体值” (参见 —— 章节 14.19)。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式: 

        ETag: "50b1c1d4f775c61:df3"

         客户端的查询更新格式是这样的: 

        If-None-Match: "50b1c1d4f775c61:df3"

         如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。本人测试Etag主要在断点下载时比较有用。
        
       Last-Modified和Etags如何帮助提高性能?
         聪明的开发者会把Last-Modified 和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。 
         过程如下:
                 1. 客户端请求一个页面(A)。 
                 2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。 
                 3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。 
                 4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。 
                 5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

注:
1、Last-Modified和Etag头都是由Web Server发出的Http Reponse Header,Web Server应该同时支持这两种头。
2、Web Server发送完Last-Modified/Etag头给客户端后,客户端会缓存这些头;
3、客户端再次发起相同页面的请求时,将分别发送与Last-Modified/Etag对应的Http Request Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和Web Server发出的Last-Modified,Etag值完全一样;
4、通过上述值到服务器端检查,判断文件是否继续缓存;

 

关于Etag和Last-Modified网上还有更精辟的解释

1、关于Last-Modified

HTTP的Response中还会有另外一个Header叫Last-Modified,比如

“Last-Modified: Thu, 06 Apr 2006 21:17:12 GMT”,

浏览器访问一个URI得到这样的Resposne之后,就知道这个资源最后一次的修改时间,下次需要再次获得这个资源的时候,会发一个Request给Server,不过这个Request中有一条

“If-Unmodified-Since: Thu, 06 Apr 2006 21:17:12 GMT”,

如果在Server端在这个日期之后对这个资源进行了修改,就会照常返回这个资源给Client端,但是如果没有修改,就会返回一个304 (Not Modified) Response而不返回资源,告诉Client端:“这个资源从上次给你之来从来没改过,你放心用你Cache中的好了。” 一个304 Response比一个静态资源通常小多了,这样就节省了网络带宽。

 

2、Last-Modified和Expires的区别

让我们回过头来比较一下Expires和Last-Modified这两个东西,似乎Last-Modified比不上Expires,因为虽然它能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而Expires却使得浏览器干脆连HTTP请求都不用发,岂不痛快!那还要Last- Modified这个物体干什么?理想状况的确是这样,不过当用户在IE或者Firefox里面按F5或者点击Refresh按钮的时候(不是在URL栏里重新输入一遍URL然后回车),就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是要用的,而且要和Expires一起用。 

3、Etag

除了Last-Modified,HTTP Response中还可能有另外一个Header: ETag,使得Server上的静态资源有点“版本控制”的味道,假如HTTP Response中包含

ETag: "abcdefg1234:0001"

等于告诉Client端,你拿到的这个版本的资源有个ID,叫做abcdefg1234:0001,下次需要发Request索要同一个URI的时候,在Request里面加一条

If-None-Match: "abcdefg1234:0001"

好,Server 端做了一些修改,下次这个Client再来了一个请求,但是这时候资源已经改了,所以返回这个新资源,还有新的tag “ETag: "abcdefg4567:0001"”(这个etag我是胡写的),这样,Client端等于Cache了两份,在需要索要这个资源的时候,可以包含这样的Header: “If-None-Match: "abcdefg1234:0001" "abcdefg4567:0001"”,这样,即使Server端头脑发热,把这个资源Roll back回原来的版本,依然会返回304 (Not Modified) Response,因为它知道Client端Cache着以前的版本呢,这点功能是Last-Modifed/If-Not-Modified没法做到的。 

4、Etag的弊端

不过ETag/If-None-Match这点功能实在是个鸡肋,首先,Server端的资源不大可能Roll Back,更重要的是,有可能造成Client Performance下降。对于只有一个Server的网站,没什么问题,但是现在稍微上点规模的网站都需要Scale Out,也就是说需要前端一个Load Balancer,后面接多台Server来处理请求,俗称Cluster,既然是Cluster,那么每个请求到底返回什么结果应该和分配到哪个 Server无关,不过这个ETag可能就坏事了。假如用户的第一次请求分配给Server A,返回“ETag: "abcdefg1234:0001"”,但是第二次请求分配给了Server B,Server B上这个资源和Server A上的一模一样,但是计算出这个资源的ETag是"abcdefg1234:0002",这下麻烦了,虽然内容一样,但是ETag不匹配,还是浪费了带宽把资源发送了一遍,冤枉??!而事实上,不同Server上的ETag很有可能不同,对于Apache,ETag的计算考虑了inode,对于 IIS,ETag考虑了metabase的修改版本,要保证不同server上的这些信息一致,有点小难。不过不是有Last-Modified/If- Not-Modified吗?Server端看到If-Modified-Since,对照一下时间对得上,不管If-None-Match,可以直接发回304(Not Modified)呀,很不幸,RFC2616对这种情况做了规定,如果既有If-None-Match又有If-Modified-Since,除非两者不冲突,不然不会返回304。

 

所以说ETag就是一个害人精,按照Yahoo的建议,别费劲想办法同步不同Server上的ETag了,干脆就把ETag删除得了(缺省,Apache和 IIS都是有ETag的),我Sniff了一下Yahoo的若干网页返回HTTP Response,的确没有ETag,人家的确是知行合一。

对于Apache,在httpd.conf或者.htaccess中加一行就搞定了:

5、Apache中的Etag设置
补充:
Apache默认开启Etag,可以使用FileEtag来设置

FileETag none|INode|MTime|Size|All

从apache的实现中http_etag.c我们可以发现,Apache的Etag包括了Inode|Mtime|Size这些因素。

对于IIS 6,可就有点费劲了,首先,似乎没有办法通过Config来把ETag去掉,查了很多资料,问了很多人,似乎能够去掉ETag的办法只有写一个ISAPI Filter来弄,Sniff了一下Microsoft的几个网页的结果显示ETag都稳当当的存在,估计目前真的没有什么好方法。

只好退而取其次,保证不同Server上的ETag一致了。 IIS对Etag的计算算法是ETag = {Filetimestamp:ChangeNumber}, Filetimestamp保持一致没什么问题,ChangeNumber是metabase的change number,就有点难保证Cluster中每个Server都一样了,所以,干脆就把它设成固定值好了,这个连接告诉我们该怎么办,很可惜,没有找到彻底删除ETags的配置。

当然转载于此方便以后自己查阅?。。?!



小马歌 2011-12-12 14:12 发表评论
]]>
让symfony运行在nginx上的完美配置 【转】 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366130.html小马歌小马歌Mon, 12 Dec 2011 03:37:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366130.html//www.ot7t.com.cn/xiaomage234/comments/366130.html//www.ot7t.com.cn/xiaomage234/archive/2011/12/12/366130.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/366130.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/366130.html

配置的重点在server这个node上,其他用nginx默认配置就行,这里就只写出server那一块的配置。因为symfony需要一些php $_SERVER里的变量来做路由,但是nginx赋给php的$_SERVER值并不是完全正确的,我也是查了不少资料才调好的,希望能对想让symfony在nginx上跑的同学有所帮助


http {
  ...
  server {
    listen      80; #nginx的端口
    server_name localhost; #网站网址,这里以localhost为例
    root        /path/to/root; #根目录路径
    chareset    utf-8;
    location /sf/ { #如果url匹配"/sf/"
      alias /path/to/symfony/data/web/sf/; #访问/sf下面的资源所在的目录
    }
    location ~ ^/.+\.php(/.*)?$ { #如果匹配类似/frontend_dev.php/*这样的
      set $script $fastcgi_script_name; #像/frontend_dev.php这样的url,直接把$fastcgi_script_name赋值给$script
      if ($document_uri ~ ^(.+\.php)(/.*)) { #如果又匹配/frontend_dev.php/article/1这样的
        set $script    $1; #把frontend_dev.php赋值给$script
        set $path_info $2; #把/article/1赋值给$path_info,如果用nginx默认的配置,$_SERVER['path_info']会不正确而导致symfony找不到正确的路由
      }
      fastcgi_pass  127.0.0.1:9000; #php-cgi服务
      #下面开始给php的$_SERVER相关变量赋值,不写对都有可能运行不了symfony
      include       fastcgi_params; #这里面有很多nginx默认给php的$_SERVER赋的环境变量值,
                                    #如果你想要把这句放后面的话,下面已经赋过值的记得注释掉,否则又被覆盖回原来的错误值
      fastcgi_param SCRIPT_FILENAME $document_root$script;
      fastcgi_param SCRIPT_NAME     $script;
      fastcgi_param PATH_INFO       $path_info;
      fastcgi_param DOCUMENT_URI    $document_uri;
      
    }
    location / { #当前面的规则都不匹配,就运行这个(剩下的url肯定都匹配/)
      if (-f $request_filename) { #如果资源(像css,js这样的文件)和请求的url是匹配的,也就是说能根据url直接找到
        expires max; #那就永不过期
        break;       #并且不往下执行了
      }
      #否则得话都给他rewrite到index.php上去
      rewrite .* /index.php last;
    }
  }
}
关于path_info部分还有更简单的写法,而且是官方例子,参见我另外一篇博客。

另外配置symfony等单一入口框架也有更好的例子,参见我新写的文章



小马歌 2011-12-12 11:37 发表评论
]]>
MoinMoin 与 Nginx, fastcgi 与 uwsgi 的配置【转】 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/12/07/365792.html小马歌小马歌Wed, 07 Dec 2011 09:47:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/12/07/365792.html//www.ot7t.com.cn/xiaomage234/comments/365792.html//www.ot7t.com.cn/xiaomage234/archive/2011/12/07/365792.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/365792.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/365792.html给自己架了个Wiki //wiki.apt-blog.net作为自己的知识管理工具。虽然这个博客本来就是工具之一,也累积了快两年了,但经常碰到有些小东西,不值得为之写篇博客,很有用,但用完就忘记。个人wiki适合做写细小的笔记,当累积一定的时候还可以整理成博客。

Wiki我选择了用Python的MoinMoin,一定程度上受CPYUG社区 ZoomQuiet 大妈的推荐影响,首次试用感觉非常impresive,所以就定了。再加上 GraphViz 工具的支持,实在的强大。

在vps上服务,肯定是无视apache的,内存有限。之前架设过用来上Twitter奶瓶腿,是Nginx + php-cgi的方案,nginx是必须的。

Python跟web前端的架构方式有太多选择了,五花八门,MoinMoin的发行包里面都提供了moin.cgi moin.scgi moin.ajp moin.fcgi moin.wsgi等多种启动方式。MoinMoin里面全部通过内置的flup作为中间件提供这些接口,目前我仅尝试使用了fastcgi和wsgi。

虽然解压了moin的源码包就可以直接运行里面的wikiserver.py来本地访问了,但在服务器上通常是由nginx/lighttpd等服务来综合转发。php的话是通过spawn-fcgi启动一些php-cgi的进程,服务器接受到动态的请求就通过本地socket跟php-cgi通讯,返回的结果展现回给客户。php-cgi是使用FastCGI协议的。

MoinMoin 源码当中wiki/server/moin.fcgi就是一个类似php-cgi功能的fastcgi服务,类似地可以使用spawn-fcgi来启动moin.fcgi,作为后端的处理进程。

Running MoinMoin Wiki with Nginx via FastCGI and Flup该文章很形象解释了fastcgi的角色,以及提供了一段很方便的服务脚本来启动spawn-fcgi。

Client ----> Nginx Web Frontend -----------+                                            | fastcgi_pass                                           \|/                             +-------------------------+               moin.fcgi     | spawn-fcgi-moin.socket  | spawn-fcgi ---------------> |           or            |                             |     localhost:port      |                             +-------------------------+ 

但是文章当中的nginx配置不完整,而且复杂了,这是我的配置:

server {         listen   80; ## listen for ipv4         server_name  wiki.apt-blog.net;   access_log  /var/log/nginx/wiki.apt-blog.net.access.log;         error_log   /var/log/nginx/wiki.apt-blog.net.error_log;   location / {                 include fastcgi_params;                 fastcgi_param PATH_INFO $fastcgi_script_name;                 fastcgi_param SCRIPT_NAME /;                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;                 if (!-f $request_filename) {                         fastcgi_pass unix:/var/run/spawn-fcgi-moin.socket;                 }         } }

当然那文章中的配置有考虑对静态文件直接由nginx服务,不通过flup这一层,有一定优化,这里省去了这些。其实增多一个/moin_static193(据版本号不同而不同)的location即可,可参考后面使用uwsgi做服务时候的配置。

文章还提到wikiconfig.py里面一个fix_script_name变量,是1.9版本新加入的,需要xxx.com/wiki这样访问的童鞋就不用像以前版本那样要在nginx配置里面写一大堆东西了。

Fastcgi就这么多,不算太复杂。Fastcgi虽然很流行,但弊端不少,首先是速度,在一台虚拟机上测试,用ab居然跑出每秒20个请求的速度……虽然平均下来还是有5、60次,但真的,唉。php-cgi还支持产生多个工作进程以并行和均衡请求,提高效率,fastcgi似乎就没这样的东西了。

刚好这天observer专栏杂记写了一篇配置Nginx+uwsgi更方便地部署python应用,当中也提到fcgi和 mod_python的各种不便,然后介绍了uwgi,高性能、多应用。

uwgi充当了python解析器的角色,使用wsgi的接口和Python程序交互,这个过程中做了优化,和上层nginx之间则设计了更加轻量的协议。nginx0.8.40以后官方默认带了uwgi的协议???,所以使用很方便。

uwgi的文档有些简略,但是重点都是在wiki/Example里面了。 MoinMoin在uwgi的配置在其中一句带过:

/usr/bin/uwsgi -s /tmp/moin.sock --wsgi-file wiki/server/moin.wsgi -M -p 4

uwgi的-w参数是把某个py文件作为module,import使用,但是wsgi文件不被认识,所以新版里面多了这么个--wsgi-file参数。但是如果是多站点呢!

nginx配置的虚拟主机里面的uwsgi_param UWSGI_SCRIPT参数会让uwgi按??榈既朊?,相当于命令行里面的-w,但是moinmoin的moin.wsgi文件,不是py结尾,只能用--wsgi-file参数。扫了一圈uwgi的wiki/ExampleRunOnNginx,都没提到这个问题,倒是在这里提到在旧版的uwgi当中没有--wsgi-file参数,需要把wsgi文件改名成py结尾来导入,好吧,确实那样成功了。

至于性能,一开始我发现uwgi占的内存也不少,一个worker时候就占了20M多的内存,所以没开更多的工作进程;Fastcgi也差不多,然后用Apache Benchmark测试,好像两者区别不大。于是看了下fcgi vs. gunicorn vs. uWSGI的测评,才发现uwgi要开多个worker进程才有性能!于是开了8个,性能出来了,秒请求马上就上千! 显然是uwgi打开了多个进程,充分利用了机器的CPU,还做了均衡请求。

最后,我的Wiki使用uwgi后的nginx配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
server {     server_name  wiki.apt-blog.net;     access_log  /var/log/nginx/wiki.apt-blog.net.access.log;     error_log   /var/log/nginx/wiki.apt-blog.net.error_log;     location / {         include uwsgi_params;         #uwsgi_pass 127.0.0.1:9096;         uwsgi_pass unix:///tmp/uswgi.sock;         uwsgi_param UWSGI_PYHOME /usr/local/lib/moinmoin;         uwsgi_param UWSGI_CHDIR /var/local/wiki-moinmoin/server;         uwsgi_param UWSGI_SCRIPT moin_wsgi;     }     location /moin_static193/ {         alias /usr/local/lib/moinmoin/lib/python2.6/site-packages/MoinMoin/web/static/htdocs/;     } }

完整配置指南:

#安装 sudo -s add-apt-repository ppa:nginx/stable add-apt-repository ppa:uwsgi/release apt-get update apt-get install nginx uwsgi-python python-virtualenv   #组件配置 cat >/etc/uwsgi-python/apps-enabled/uwsgi.xml << EOF <uwsgi>   <limit-as>256</limit-as>   <processes>6</processes>   <memory-report/>   <vhost/>   <no-site/> </uwsgi> EOF   cat >/etc/nginx/sites-enabled/moinmoin << EOF server {     listen   80;     access_log  /var/log/nginx/wiki.access_log;     error_log   /var/log/nginx/wiki.error_log;   client_max_body_size 64;     server_name wiki.mydomian.com;     location / {                 include uwsgi_params;                 uwsgi_pass unix:///var/run/uwsgi-python/uwsgi/socket;                 uwsgi_param UWSGI_PYHOME /var/www/moinmoin/python-home/;                 uwsgi_param UWSGI_CHDIR /var/www/moinmoin/;                 uwsgi_param UWSGI_SCRIPT moin_wsgi;                 uwsgi_param UWSGI_SCHEME $scheme;                 uwsgi_param REMOTE_USER $remote_user;         } } EOF   #Python环境预备 mkdir /var/www/moinmoin virtualenv /var/www/moinmoin/python-home cd /tmp wget http://static.moinmo.in/files/moin-1.9.3.tar.gz tar xvfz moin-1.9.3.tar.gz source /var/www/moinmoin/python-env/bin/activate cd /tmp/moin-1.9.3 python setup.py install deactivate   #MoinMoin环境 cp -r /tmp/moin-1.9.3/wiki /var/www/moinmoin cd /var/www/moinmoin/wiki cp config/wikiconfig.py wikiconfig.py cp server/moin.wsgi moin_wsgi.py sed -i '/# a2)/isys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))'   #可选 rm -rf config server   #重启 /etc/init.d/nginx restart /etc/init.d/uwsgi-python restart

 

tags: 
posted in PythonUnix/Linux by BOYPT

Follow comments via the RSS Feed | Leave a comment | Trackback URL



小马歌 2011-12-07 17:47 发表评论
]]>
Nginx+perl的web框架(Npweb )【转】 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/12/07/365764.html小马歌小马歌Wed, 07 Dec 2011 06:53:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/12/07/365764.html//www.ot7t.com.cn/xiaomage234/comments/365764.html//www.ot7t.com.cn/xiaomage234/archive/2011/12/07/365764.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/365764.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/365764.html

简介:
  这是一套运行在nginx + perl环境下的的web框架,可以像java的servlet那样的写服务或简单网页。

 入门步骤:

  1. 安装nginx时增加perl??椴问?,使nginx支持perl???。
  2. nginx.conf里配置一个perl的??槁肪?,配置npweb服务入口。
  3. 写一个helloworld,即完成了npweb的试用。
  4. 具体操作请看相关文章。

 适用业务:

  1. 可以用来做memcache的web接口
  2. 可以用来做mysql数据库的web接口
  3. 可以用来做ajax数据接口
  4. 可以用来做xml接口
  5. 一切简单的高效的接口都可以用这个来开发 

----------------------------------------------------------------------------------------------------------------------

Npweb入门示例

如果按步骤来做并且不出问题,那么你将体验到npweb的乐趣。

第一步:安装nginx,以下是安装脚本,如果安装正常就进入第二步。

 

准备目录

mkdir -p /opt/src/nginx

mkdir -p /opt/modules/nginx-0.7.65

cd /opt/src/nginx

 

准备依赖包

yum install gcc -y

yum install pcre-devel -y

yum install openssl-devel -y

yum install zlib-devel -y

 

准备依赖程序

wget //github.com/gnosek/nginx-upstream-fair/tarball/master

tar -xzvf gnosek-nginx-upstream-fair-2131c73.tar.gz

mv gnosek-nginx-upstream-fair-2131c73 /opt/modules/

 

下载nginx

wget //nginx.org/download/nginx-0.7.65.tar.gz

tar -xzvf nginx-0.7.65.tar.gz

cd nginx-0.7.65

 

配置

./configure --prefix=/opt/modules/nginx-0.7.65 \

         --with-http_stub_status_module \

         --with-http_perl_module \

         --with-http_addition_module \

         --with-http_realip_module \

         --with-http_sub_module \

         --add-module=/opt/modules/gnosek-nginx-upstream-fair-2131c73

 

安装

make

make install

第二步:部署npweb框架

Npweb框架非常简洁,只有一个文件(Action.pm),只要将这个文件置于一个能让nginx有权限访问内部文件的文件夹即可。

         这里我们将框架部署到/opt/npweb。

第三步:编写hello.pm,并将文件放置在/opt/npweb_app目录下。

/opt/npweb_app目录是你开发的web程序的目录,其中需要放置一个lib目录以保存自定义的一些pm???,在示例中的RequestUtil就是其中的一个???。

文件内容如下:

 

package hello; # 此处很关键,一定要与文件名保持一致?。。。。。。?!

use RequestUtil; # 此处引入了一个外部???/span>

 

sub doExecute {

         ($r) = @_;

         $r->send_http_header("text/html");

 

         # 取得参数的 Map------------------------------------------------------

         my %param = RequestUtil::params( $r->args );

 

         # 获得具体参数

         my $w = $param{'w'};

 

         # 回显

         $r->print("hellow " . $w);

}

文件结尾必需加这个,perl语法规定的。

1;

第四步:配置nginx.conf,这一步是很关键的,主要是将框架和webapp配置到nginx下,以达到访问功能的作用。

 

#user  nobody;

#worker_processes  1;

worker_processes 2;

 

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

 

#pid        logs/nginx.pid;

 

worker_rlimit_nofile 65535;

events {

        use epoll;

        worker_connections 65535;

}

 

http {

 

        include       mime.types;

        default_type  application/octet-stream;

 

        server_names_hash_bucket_size 128;

        client_header_buffer_size 32k;

        large_client_header_buffers 4 32k;

        client_max_body_size 8m;

 

        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

        #                  '$status $body_bytes_sent "$http_referer" '

        #                  '"$http_user_agent" "$http_x_forwarded_for"';

 

        #access_log  logs/access.log  main;

 

        sendfile        on;

        tcp_nopush     on;

 

        keepalive_timeout  0;

 

        gzip on;

        gzip_min_length  1k;

        gzip_buffers     4 16k;

        gzip_http_version 1.0;

        gzip_comp_level 2;

        gzip_types       text/plain application/x-javascript text/css application/xml;

        gzip_vary on;

        # 此处开始配置

        perl_modules  /opt/npweb; #框架的目录

        perl_require  Action.pm; #框架的入口

 

        server{

                # 此处配置框架的设置

                set $CONTEXT_PATH '/perl'; # uri的访问路径,如:// test.perl.nginx /perl

                set $APPLICATION_PATH '/opt/npweb_app/'; # web服务的路径,在该路径下需要放置一个lib目录,以放置一些自自定???。

 

                listen 80;

 

                server_name test.perl.nginx;

                location /perl { # 此处需与$CONTEXT_PATH保持一致

                        perl Action::execute; # 此处如此配置,不用更改

                }

        }

 

}

第五步:访问//test.perl.nginx/perl/hello?w=world,如果网页上回显了您输入的参数,那么恭喜您,您的第一个npweb程序成功了。

针对第五步的补充:需要将test.perl.nginx指向你所部署的服务器IP。推荐使用Windows Hosts Editor。



小马歌 2011-12-07 14:53 发表评论
]]>
淘宝Web服务器 Tengine - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/12/05/365609.html小马歌小马歌Mon, 05 Dec 2011 09:26:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/12/05/365609.html//www.ot7t.com.cn/xiaomage234/comments/365609.html//www.ot7t.com.cn/xiaomage234/archive/2011/12/05/365609.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/365609.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/365609.html

淘宝Web服务器 Tengine

淘宝网现在已经将其服务器平台软件Tengine 开源,Tengine基于Nginx,针对大流量网站需求增加了很多功能特性和性能优化。以下沿引项目主页上的特性介绍:

  • 继承Nginx-1.0.10的所有特性;
  • 组合多个CSS、JavaScript文件的访问请求变成一个请求;
  • 支持管道和syslog形式的日志和抽样;
  • 自动根据CPU数目设置亲缘性;
  • 监控系统的负载和资源占用从而对系统进行?;?;
  • 显示对运维人员更友好的出错信息,便于定位出错机器;
  • 更强大的访问速度限制???;
  • backtrace???,程序崩溃的时候可以显示出错的调用栈

淘宝Web服务器 Tengine

Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。  其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。


 

官方网站://www.open-open.com/lib/view/home/1322869904827



小马歌 2011-12-05 17:26 发表评论
]]>
nginx + fpm php 输出 无法获取内容长度,导致客户端无法处理分块传输的解决办法 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2011/11/17/364085.html小马歌小马歌Thu, 17 Nov 2011 06:59:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2011/11/17/364085.html//www.ot7t.com.cn/xiaomage234/comments/364085.html//www.ot7t.com.cn/xiaomage234/archive/2011/11/17/364085.html#Feedback2//www.ot7t.com.cn/xiaomage234/comments/commentRss/364085.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/364085.html
对于一些客户端,需要自己解析http协议的,一般不支持chunked解码,这时,可以在php输出里 加一个header('Content-Length: length' ) 

可以覆盖nginx的默认行为,计算内容长度可以用php自带的strlen 方法。

四川福利彩票快乐12 2011-11-17 14:59 发表评论
]]>