这两天虽然很忙,但是由于某些情况需要折腾一个反向代理服务器。解决了我一个困扰了很久的问题——为什么nginx不能检测后面php-fpm或者hhvm运行的状态;如果php-fpm或者hhvm挂了为什么nginx的fastcgi_cache_use_stale的参数不起作用?
我一直想当php-fpm或者hhvm挂掉的时候nginx能够提供cache的旧页面,但是fastcgi_cache_use_stale的参数似乎不起作用,今天仔细地读了一个nginx的文档。为了实现这个目的,我们需要用的是fastcgi_cache_use_stale 中 error这个参数,然而error这个参数的说明中提到了一句话
The
errorparameter also permits using a stale cached response if a FastCGI server to process a request cannot be selected.
仔细一想,如果你直接在fastcgi_pass使用unix://接口,直接将server弄上去,还需要什么selected?换个意思说,使用这个参数,你就必须使用 upstream 定义你的FastCGI server。尝试了一下,果然如此。
以下是配置的例子
upstream hhvm-server{
server unix:/var/lib/hhvm/hhvm.sock;
server unix:/var/lib/php/php-fpm.sock;
}
这里是结合了fastcgi_cache_use_stale 的配置
location ~ \.php$ {
fastcgi_pass hhvm-server;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on;
include fastcgi_params;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
fastcgi_cache fastcgicache;
fastcgi_cache_valid 200 301 302 403 404 2s;
fastcgi_cache_min_uses 1;
fastcgi_cache_key "$request_uri";
fastcgi_cache_use_stale error timeout http_500 http_503;
}
注意,fastcgi_cache_use_stale 和 proxy_cache_use_stale 相比,少了两个错误提示,一个是502,一个是504
location / {
proxy_pass https://backend_ssl;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect https://$proxy_host:$proxy_port/ https://$host/;
proxy_connect_timeout 1s;
proxy_cache proxycache;
proxy_cache_valid 200 301 302 403 404 2s;
proxy_cache_min_uses 1;
proxy_cache_key $scheme$host$request_uri;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}
注意这里的 proxy_connect_timeout,十分重要,要是后端关机了,这个就是连接的等待时间。
