使用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模块同理):
PHP方法:
说明一下:
^/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烦恼了!