Ploneの前面にVarnishを使用しています。Ploneがダウンしたり、内部エラーが発生した場合に備えて、CSSスタイルと画像を含むユーザーフレンドリーな静的HTMLページを表示したいと思います。(「サーバーは更新中のページです」)
これを行うようにVarnishを構成するにはどうすればよいですか?
これを行うもう1つの簡単な方法は、ニスに付属しているstdvmodを使用することです。異なるステータスコードに対して複数の応答が必要な場合に備えて、構成の外部にエラーメッセージを表示するのが好きなので、これが私の好ましい方法です。
import std;
sub vcl_error {
set obj.http.Content-Type = "text/html; charset=utf-8";
synthetic std.fileread("/path/to/file.html");
return (deliver);
}
vlc_errorで提供される合成ページをカスタマイズできます。default.vcl構成ファイルは、有名な「Guru Meditation」エラーページ(ああ、素晴らしいAmigaの時代)を提供することによって、これを行う方法をすでに示しています。
カスタマイズの例:
sub vcl_error {
set obj.http.Content-Type = "text/html; charset=utf-8";
synthetic {"
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Sorry, server under maintainance - My Website"</title>
<style src="css/style.css"></style>
</head>
<body>
<h1>The server is being updated</h1>
<p>Please check back later. Meanwhile, here's a picture of a rabbit with a pancake on its head:</p>
<img src="img/wabbit.jpg" alt="awwwww!" />
</body>
</html>
"};
return (deliver);
}
現時点では、Varnish4でこれを行うのにあまり役に立ちません。
これが私が最終的に得たものです:
sub vcl_backend_error {
set beresp.http.Content-Type = "text/html; charset=utf-8";
synthetic(std.fileread("/var/www/errors/500.html"));
return (deliver);
}
詳細については、4.0ドキュメントへのアップグレードを参照してください。
静的ファイルからエラーページを配信したい場合は、vcl_error()を少しのCコードでオーバーライドできます。
sub vcl_error {
set obj.http.Content-Type = "text/html; charset=utf-8";
C{
#include <stdio.h>
#include <string.h>
FILE * pFile;
char content [100];
char page [10240];
char fname [50];
page[0] = '\0';
sprintf(fname, "/var/www/error/index.html", VRT_r_obj_status(sp));
pFile = fopen(fname, "r");
while (fgets(content, 100, pFile)) {
strcat(page, content);
}
fclose(pFile);
VRT_synth_page(sp, 0, page, "<!-- XID: ", VRT_r_req_xid(sp), " -->", vrt_magic_string_end);
return (deliver);
}C
}