Trang lỗi 503 tùy chỉnh với Varnish


Câu trả lời:


13

Câu hỏi thường gặp về Varnish gợi ý sử dụng vcl_error cho việc này (và đó là cách tôi đã thực hiện):

Đây là VCL mặc định cho trang lỗi:

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>"} obj.status " " obj.response {"</title>
            </head>
            <body>
                <h1>Error "} obj.status " " obj.response {"</h1>
                <p>"} obj.response {"</p>
                <h3>Guru Meditation:</h3>
                <p>XID: "} req.xid {"</p>
                <address><a href="http://www.varnish-cache.org/">Varnish</a></address>
            </body>
        </html>
    "};
    return(deliver);
}

nếu bạn muốn có một phiên bản tùy chỉnh, chỉ cần ghi đè chức năng trong cấu hình của bạn và thay thế đánh dấu trong syntheticcâu lệnh.

Nếu bạn muốn có đánh dấu khác nhau cho các mã lỗi khác nhau, bạn cũng có thể thực hiện điều đó khá dễ dàng:

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";
    if (obj.status == 404) {
        synthetic {"
            <!-- Markup for the 404 page goes here -->
        "};
    } else if (obj.status == 500) {
        synthetic {"
            <!-- Markup for the 500 page goes here -->
        "};
    } else {
        synthetic {"
            <!-- Markup for a generic error page goes here -->
        "};
    }
}

Điều này không hoạt động trong VCL 4.0 - nếu bạn sử dụng vcl 4.0 thì hãy xem câu trả lời bên dưới
Philipp

18

Lưu ý rằng các câu trả lời trên là dành cho Varnish 3. Vì câu hỏi không chỉ định thông tin phiên bản, có vẻ như đây là thời điểm thích hợp để đưa câu trả lời cho Phiên bản 4 vì nó đã thay đổi.

Hy vọng rằng điều này sẽ cứu mọi người khỏi việc đọc các câu trả lời ở trên và đưa vcl_error vào V4 VCL của họ :)

Được xây dựng VCL cho Varnish 4.0

sub vcl_synth {
    set resp.http.Content-Type = "text/html; charset=utf-8";
    set resp.http.Retry-After = "5";
    synthetic( {"<!DOCTYPE html>
<html>
  <head>
    <title>"} + resp.status + " " + resp.reason + {"</title>
  </head>
  <body>
    <h1>Error "} + resp.status + " " + resp.reason + {"</h1>
    <p>"} + resp.reason + {"</p>
    <h3>Guru Meditation:</h3>
    <p>XID: "} + req.xid + {"</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>
"} );
    return (deliver);
}

Cũng lưu ý rằng nếu bạn muốn đưa ra một lỗi từ bên trong VCL của mình, bạn không còn sử dụng chức năng 'lỗi' nữa, thay vào đó bạn sẽ làm:

return (synth(405));

Ngoài ra, 413, 417 và 503 lỗi từ phụ trợ được tự động định tuyến thông qua chức năng này.


Xin lưu ý rằng điều này sẽ không nắm bắt được "lỗi tìm nạp phụ trợ". Để chụp chúng, bạn cũng phải tạo một sub vcl_backend_error, như bạn có thể thấy trong serverfault.com/a/665917/102757serverfault.com/a/716767/102757
lucaferrario
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.