ウェブアクセラレータで502・504エラーをキャッシュさせる方法

さくらのクラウド ウェブアクセラレータで502(Bad Gateway)や504(Gateway Timeout)をキャッシュさせる方法です。

キャッシュできないコンテンツにアクセスが多発したり、キャッシュできるコンテンツであっても
サーバの高負荷によりオリジンサーバが502(Bad Gateway)や504(Gateway Timeout)を返すことがあります。

通常、nginxなどのエラー応答にはCache-Controlヘッダが付与されていないため、キャッシュされないため、 オリジンサーバへの負荷が継続することになります。

そのため、nginxの設定でエラー応答にCache-Controlヘッダを付与することで、ウェブアクセラレータで キャッシュさせることで、オリジンサーバへの負荷を軽減することができます。

オリジンにnginxを使っており、upstreamにAppサーバ等がある場合を想定しています。

nginxの設定

    location / {
        error_page 502 = @webaccel_handle_504;
        error_page 504 = @webaccel_handle_504;
        # 省略
    }
    location @webaccel_handle_502 {
        add_header Cache-Control "s-maxage=30" always;
        return 502;
    }
    location @webaccel_handle_504 {
        add_header Cache-Control "s-maxage=30" always;
        return 504;
    }

上記の設定により、nginxが502または504のエラーレスポンスを返す場合、Cache-Control ヘッダに s-maxage=30 を 付与することで、ウェブアクセラレータに30秒間キャッシュさせることができます。

これにより、一時的なエラーもキャッシュしてオリジンサーバへの負荷を軽減することが期待されます。

memo

  • error_page の応答など、エラー時にもadd_headerを付与する場合は、alwaysを付与する必要があります。