Nginx模块fastcgi_cache的几个注意点

  categories:nginx资料  tags:  author:

在web项目中,大家都已经非常熟悉其架构流程了。都说Cache是万金油,哪里不舒服抹哪里。这些流程中,几乎每个环节都会进行cache。 从浏览器到webserver,到cgi程序,到DB数据库,会进行浏览器cache,数据cache,SQL查询的cache等等。对于fastcgi 这里的cache,很少被使用。去年年底,我对nginx的fastcgi_cache进行摸索使用。在我的测试过程中,发现一些WIKI以及网络上没被提到的注意点,这里分享一下。

从浏览器到数据库的流程图

这里是我的NGinx配置信息

01
02
03
04
05
06
07
08
09
10
11
12
13
#增加调试信息
add_header X-Cache-CFC "$upstream_cache_status - $upstream_response_time";
fastcgi_temp_path /dev/shm/nginx_tmp;
#cache设置
fastcgi_cache_path   /dev/shm/nginx_cache  levels=1:2 keys_zone=cfcache:10m inactive=50m;
fastcgi_cache_key "$request_method://$host$request_uri";
fastcgi_cache_methods GET HEAD;
fastcgi_cache   cfcache;
阅读全文

srcache_nginx redis 构建缓存系统应用一例

  categories:nginx资料  tags:,   author:

redis是一种高效的key-value存储。srcache_nginx模块相关参数介绍,可以参见《memc_nginx+srcache_nginx+memcached构建透明的动态页面缓存》。

下面举一例应用,看配置:

upstream redis {
server 127.0.0.1:6380;
keepalive 512;
}server {
listen       80 backlog=1024 default;
server_name  www.ttlsa.com;
index index.html index.htm index.php;
root  /data/wwwroot/www.ttlsa.com/webroot;

location / {
set $flag 0;
if ($uri ~ /thumb/[0-9]+_160.jpg$){
set $flag “${flag}1″;
}
if ($arg_unitid =

阅读全文

使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

  categories:nginx资料  tags:  author:

Nginx的Memc和SR Cache模块

缓存策略的改进

为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统。众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的成熟,越来越多的系统开始转型为LNMP(Linux+Nginx+MySQL+PHP with fpm),这是因为Nginx采用基于事件机制的I/O多路复用思想设计,在高并发情况下其性能远远优于默认采用prefork模式的Apache,另外,相对于Apache,Nginx更轻量,同时拥有大量优秀的扩展模块,使得在Nginx上可以实现一些美妙的功能。

传统上,PHP中使用memcache的方法是使用php-memcache或php-memached扩展操作Memcache,然而在Nginx上有构建更高效缓存机制的方法,本文将首先介绍这种机制,然后介绍具体的操作步骤方法,最后将对这种机制和传统的PHP操作memcache的性能进行一个benchmark。

我们知道,Nginx的核心设计思想是事件驱动的非阻塞I/O。

Nginx被设计为可以配置I/O多路复用策略,在Unix系统中传统的多路复用是采用select或poll,但是这两个方法的问题是随着监听 socket的增加,性能会下降,因为在linux内核中是采用轮询的方式判断是否可以触发事件,换句话说算法的复杂度为O(N),而在较新的linux 内核中引入了复杂度为O(1)的epoll,因此Nginx在Linux下默认采用epoll,而在FreeBSD下默认采用kqueue作为I/O策 略。

即便是这样,传统的缓存策略仍可能造成效率低下,因为传统上是通过PHP操作memcache的,要执行PHP代码,Nginx就必然要和FastCGI 通信,同时也要进入PHP的生命周期,因此SAPI、PHP Core和Zend Engine的一系列逻辑会被执行。更糟糕的是,fpm和PHP可能会阻塞,因此破坏了Nginx的非阻塞性。(原文中此处表述有误,fastcgi与 nginx进行同步通信,但并不会破坏nginx i/o的非阻塞性,多谢agentzh给予指正)下图展示了在memcache命中时整个处理过程。

可以看到,即使Memcache命中,还是要进入PHP的生命周期。我们知道,目前很多互联网应用都使用RESTful规范进行设计,在RESTful应 用下,普遍使用uri和查询参数作为缓存的key,因此一种更高效的缓存策略是Nginx直接访问Memcache,并用$uri和$args等 Nginx内置变量设定缓存key规则,这样,当缓存命中时,Nginx可以跳过通过fastcgi和PHP通信的过程,直接从memcache中获取数 据并返回。memc-nginx和srcache-nginx正是利用这种策略提高了缓存的效率。下图是这种高效缓存策略的示意图(当memcache命 中时)。

模块介绍

memc-nginxsrcache-nginx模 块均为前淘宝工程师agentzh(章亦春)开发。其中memc模块扩展了Nginx标准的memcache模块,增加了set、add、delete等 memcache命令,而srcache则是为location增加了透明的基于subrequest的缓存层。两者配合使用,可以实现上一节提到的高效 缓存机制。关于两个模块的详细信息可以参考它们Nginx官网的wiki(memc wikisrcache wiki)页。

安装及配置

下面以LNMP环境介绍如何使用这两个模块构建缓存层。

因为Nginx并不支持模块动态加载,所以要安装新的模块,必须重新编译Nginx。首先下载两个模块(memc下载地址,srcache下载地址),另外,为了发挥出缓存的最大性能,建议将memcache的upstream配置为keep-alive,为了支持upstream的keep-alive需要同时安装http-upstream-keepalive-module。… 阅读全文

安装OpenResty

  categories:nginx资料  tags:  author:

OpenResty,也被称为“ngx_openresty”,是一个基于Nginx的核心Web应用程序服务器,它包含了大量的第三方的Nginx模块和大部分系统依赖包。 OpenResty不是Nginx的分支,它只是一个软件包。主要有章亦春维护。
为什么是OpenResty?

OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。

通过众多进行良好设计的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。

OpenResty 致力于将你的服务器端应用完全运行于 Nginx 服务器中,充分利用 Nginx 的事件模型来进行非阻塞 I/O 通信。不仅仅是和 HTTP 客户端间的网络通信是非阻塞的,与MySQL、PostgreSQL、Memcached、以及 Redis 等众多远方后端之间的网络通信也是非阻塞的。

因为 … 阅读全文

https安装(2)nginx配置

  categories:nginx资料  tags:  author:

原创文章,转载请指明出处并保留原文url地址

现在网络完全越来越受到重视, 因此https也是大势所趋, 以往nginx都是工作在http方式下, 其实nginx在https下工作也挺好的。 这里将分步骤的逐步实现一套采用nginx, haproxy, keepalived实现的https系统, 并且系统没有单点故障, 基本适应中小系统的安全需要。

1. Nginx https安装    这个文章主要是安装支持https的nginx, 源代码装过程

2. https安装(2)nginx配置   (本文)继承上一个文章, 记录配置过程, 然后实现https服务

3. 两台nginx实现https负载均衡  介绍通过haproxy实现两个nginx的负载均衡, 解决nginx的单点故障

 

前一篇文章   Nginx https安装

1. 配置nginx服务器

进入nginx的安装目录

nginx-config

[root@iig conf]# cat nginx.conf

worker_processes  1;
events {
    worker_connections  
阅读全文

Nginx https安装

  categories:nginx资料  tags:,   author:

原创文章,转载请指明出处并保留原文url地址

现在网络完全越来越受到重视, 因此https也是大势所趋, 以往nginx都是工作在http方式下, 其实nginx在https下工作也挺好的。 这里将分步骤的逐步实现一套采用nginx, haproxy, keepalived实现的https系统, 并且系统没有单点故障, 基本适应中小系统的安全需要。

1. Nginx https安装    (本文)这个文章主要是安装支持https的nginx, 源代码装过程

2. https安装(2)nginx配置   继承上一个文章, 记录配置过程, 然后实现https服务

3. 两台nginx实现https负载均衡  介绍通过haproxy实现两个nginx的负载均衡, 解决nginx的单点故障

 

下面用到的几个文件, 已经下载好, 可以直接使用

openssl-0.9.8y.tar

pcre-8.33.tar

zlib-1.2.8.tar

1. Nginx的优点

Nginx作为WEB服务器,Nginx处理静态文件、索引文件、自动索引的效率非常高。

Nginx作为代理服务器,Nginx可以实现无缓存的反向代理,提高网站的性能

Nginx作为负载均衡服务器,内部可以支持PHP、也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载;

Nginx在性能方面:Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。

Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起… 阅读全文

安装nginx时源代码安装PCRE libtool: unrecognized option `-DHAVE_CONFIG_H’

  categories:nginx资料  author:

源代码安装 nginx中 遇到 需要pcre的 提示信息, 采用yum install pcre成功后, 再次 运行linux的编译程序,还是有问题.

因此采用源代码安装 pcre

下载地址如下:

http://www.pcre.org/  里面有详细信息.

下载后, tar xzvf 进行解压缩

tar xzvf pcre-8.21.tar.gz

然后进入目录  ./configure  配置

然后  make

获取如下错误信息

libtool: link: ranlib .libs/libpcreposix.a
libtool: link: ( cd “.libs” && rm -f … 阅读全文

Nginx源代码分析-基本数据结构

  categories:nginx资料  tags:  author:

在Nginx中对array、list、queue、RB tree和hash表进行了实现,这些结构所涉及的内存管理都是在内存池中进行,源代码都位于src/core目录下。

Array

相对来说,数组是Nginx中最简单的数据结构,它是在内存池中分配的,与语言原生的数组相比,增强了功能,使用时可把它当做变长的,不必担心越界访问。通过ngx_array_t结构体描述了数组的结构信息。

为方便描述,称ngx_array_t结构体为数组的头(header),为数组元素分配的连续空间为数组的体(body)。

其结构如下图所示:

clip_image001

其中elts指向的是数组真实数据的存放位置,nelts是指数组中已经填充的元素个数,size是元素的大小,nalloc是分配的数组空间可容纳的元素数,pool指向的是数组内存所在的内存池。

数组操作比较简单,共有5个函数,

  • 创建ngx_array_create:其过程是首先分配空间给一个ngx_array_t结构体(即header),然后分配n*size大小的空间供数组中元素存放,之后初始化header,并返回它的首地址。
  • 初始化ngx_array_init:它与创建相比,只少了第一个步骤。
  • 销毁ngx_array_destroy:它并不是真正地释放数组所占用空间(内存池中的内存释放由内存池统一进行),而是有条件地更新内存池信息。(条件是:数组空间在内存池已用空间的最后位置)
  • ngx_array_push:这也并不是真正地往数组中添加一个元素,而只是向数组请求划分出一个元素大小的空间并返回。此过程分两种情况,
    • 如果数组body中还有空闲,则把第一个可填充元素的位置返回;
    • 如果数组body已满,并且
      • 数组body在内存池已用空间的最后位置,且紧挨数组body之后还有足够的空间存放元素,则由内存池划分紧挨body的一个元素空间给body。
      • 否则,在内存池中分配原数组body两倍大小的空间,并把原数组中的元素复制到新空间,并更新数组的结构信息(header)。
  • ngx_array_push_n:同上面一样,这也只是向数组请求划分出n个元素大小的空间并返回,过程大同小异。

瞧下array的使用(这段代码在ngx_hash.c中,在下面分析hash表时会见到ngx_hash_key_t 结构,可见ngx_array_push只是返回可填充元素的位置,具体内容还得再调用之后赋值:

01ngx_array_t   curr_names;
02ngx_hash_key_t       *name;
03if (ngx_array_init(&curr_names, hinit->temp_pool, nelts,
04                       sizeof(ngx_hash_key_t))
05        != NGX_OK)
06{
07    return NGX_ERROR;
阅读全文

Nginx返回411错误

  categories:nginx资料  author:

来源:互联网

今天提交一个form的时候遇到一个411错误, 当时我就孤陋寡闻, 第一次见到411, 查了一下然后就囧了, 是nginx直接把请求给弹回来了. 深入的查一下之后发现这个问题还是非常容易引起的, 于是我当时很奇怪的是在之前的开发中难道从来没有遇到过? 话说也是不良习惯造成的问题, 生产环境测试环境都没有nginx, 唯独产品服务器上是, 糟糕吧.

引发411的原因

nginx给出的官方解释有三种情况会引发nginx弹411回去

  1. client sent invalid “Content-Length” header
  2. client sent … method without “Content-Length” header
  3. client sent “Transfer-Encoding: chunked” header

我的场景是这样的, 用httpclient4(java)去调用一个api服务, 这个api使用的server正是nginx, 使用multipart提交图片文件的时候因为它忽略或省略了文件的真正的长度, 所以(通过firebug发现)在request header里就压根没有Content-Length. 那显然符合上面的第二种情况.

改代码

然后我尝试通过修改代码来解决,

阅读全文

用Nginx url重写及NuSphere环境调试windows live writer客户端

  categories:nginx资料  author:

原创文章,转载请指明出处并保留原文url地址

1. PhpED调试问题概述

前面我们介绍了基于NuSphere系统调试wordpress博客程序, 我们通过在浏览器的地址栏中的url中添加特定调试参数,来启动PhpED调试模式, 来调试wordpress的php脚本。详情参见:

基于NuSphere环境调试wordpress系统

Windows live writer是一个专用的blog客户端软件, 相关信息参见:

http://www.iigrowing.cn/tag/live-writer

Windows live writer(简称:wlw)写博客非常方便, 但是对他工作过程还是有些模糊, 若想做些调整等就有些困难了。因此考虑从整体上考虑调试wlw同wordpress工作过程的念头, 这样才有了前面的两篇文章, 关于php开发环境, 基于NuSphere环境调试wordpress系统的文章的出现。

但是,前面两篇文章并没有彻底解决全部问题, 仅仅解决了php的基础调试环境, 调试网页的环境等。 若是调试wlw的工作过程是做不到的。理由如下:

调试php需要一个debug参数, 这个参数无法在wlw中输入, 即使输入了也不好用, 仅仅是第一次调用存在,后续调用中wlw并没有提供输入这个参数的机会, 因此后续操作都不能成功调试了。

如何解决这个问题?

解决这个问题的关键就是,给每个wlw的请求自动添加一个动态调试的参数,必须是自动添加, 因为你没有机会修改wlw的调用。

根据这个就考虑到我们需要一个代理服务器,准确是反向代理(这里有篇反向代理的文章)服务器, 通过wlw将请求首先发送给方向代理服务器, 反向代理服务器将请求在转发给后端的wordpress系统, 在反向代理转发的同时, 顺便添加一个动态调试的参数,这样就可以解决了php调试的目的了。

因此调用过程如下: … 阅读全文



快乐成长 每天进步一点点