Warning: Redis::connect(): connect() failed: Connection refused in /var/www/admclub.com/wp-content/object-cache.php on line 418
解决Nginx+Memcache下出现502错误的问题 | _站长俱乐部站长俱乐部

解决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烦恼了!

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>