解决Nginx+Memcache下出现502错误的问题

使用Nginx+Memcache模块(HttpMemcachedModule或NginxHttpMemcModule)进行加速静态内容真是无敌的选择!

在Memcache模块正常运行的情况下,Nginx可以直接从Memcache内存中读取内容并直接显示,根本占用不硬盘IO,飞快得很!

但是,有时候Memcache却会因故或无故地停止运行了!这时候Nginx将会抛出502错误信息,很烦人。解决这个问题基本也不难。原理就是使用Nginx的error_page 502转向技术。当出现这个错误的时候,把502错误转向一个@目的来处理。

我们一般使用Nginx+Memcache的时候会使用

error_page 404 = @view404;

来处理当Nginx从Memcached内存中取不到内容时,而转向实际内容的处理程序(可以是php或直接读硬盘中的内容)。如何使用Nginx+Memcache加速网页,可以查看我之前写的文章。

那么不难理解,当502出现时,我们可以使用这个技术来处理502问题。那就是转向一个不使用Memcache的PHP程序或者直接改为从硬盘读取,我贴一下正在使用的样例(我是使用国人修改HttpMemcachedModule的NginxHttpMemcModule模块,功能更丰富,标准版的HttpMemcachedModule模块同理):

location ~* ^/app_(\d+)\.html {

set $memc_cmd 'get';

set $memc_key $uri$is_args$args;

memc_flags_to_last_modified on;

memc_pass mem_backend;

  

error_page 404 = @view404;

error_page 502 = @view502;

  

}

location @view404 {

root          /var/www/apk24.com;

rewrite ^/app_(\d+)\.html /viewapp.php?id=$1&k=$memc_key last;

}

  

location @view502 {

root          /var/www/apk24.com;

rewrite ^/app_(\d+)\.html /viewapp.php?id=$1 last;

}

PHP方法:

function save_cache($html){

    if($_SESSION['adminid']>0 || $_REQUEST['k']==''){return $html;}//不缓存管理员的查看

    $key = $_REQUEST['k'];

    $memcache2 = new Memcache;

    $memcache2->addServer('127.0.0.1', 11211);

    $memcache2->set($key,$html,0, 24*3600 );

    return $html;

说明一下:

^/app_(\d+)\.html是一个伪静态规则,其实指向一个PHP程序:viewapp.php
在这个PHP程序中,只有当$_REQUEST['k']有值时才会读写Memcache。一般情况下,K是有值的。而当Nginx出现502时,也就是当Memcached停止运行后,Nginx检测到这个错误并转发给  error_page 502 = @view502; 接着@view502又rewrite重定向给view.php,此时,只是传递ID,而没有k,所以PHP程序不会处理Memecached的运行情况,只会接一般的程序来处理。好了,要的就是这个结果,在没有Memcached运行的下依然能使网站正常运行,当你把Memcached处理好了,启动Memcached后,网站又自动启用Memcached了!

好了,以后不用因为502烦恼了!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/84abbbbdd2d5894799d9ac2594a54186.html