Điểm:1

Varnish với auth cơ bản trả về 401

lá cờ us

Tôi đã thử định cấu hình Varnish trên máy chủ có xác thực Basic Auth bằng cách sử dụng các giải pháp sau:

nhưng nó không giúp được gì. Nhật ký Varnish vẫn hiển thị lỗi 401:

varnishlog -g raw -i Backend_health

         0 Backend_health - mag2.default Vẫn ốm 4--X-R- 0 5 10 0,001574 0,000000 HTTP/1.1 401 Trái phép

Cấu hình Varnish của tôi (phiên bản 4.0):

vcl 4.0;

tiêu chuẩn nhập khẩu;
# Phiên bản Varnish tối thiểu là 4.0
# Để giảm tải SSL, hãy chuyển tiêu đề sau vào máy chủ proxy hoặc bộ cân bằng tải của bạn: 'X-Forwarded-Proto: https'

phụ trợ mặc định {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 600 giây;
    .thăm dò = {
        .url = "/health_check.php";
        .thời gian chờ = 2s;
        .khoảng cách = 5s;
        .cửa sổ = 10;
        .ngưỡng = 5;
   }
}

thanh lọc acl {
    "máy chủ cục bộ";
}

phụ vcl_recv {
    if (! req.http.Authorization ~ "ZGV2OmRldg=") cơ bản {
    return(synth(401, "Restricted"));
    }

    if (req.method == "PURGE") {
        if (client.ip !~ thanh lọc) {
            return (synth(405, "Phương thức không được phép"));
        }
        # Để sử dụng tiêu đề X-Pool để tẩy vecni trong quá trình triển khai tự động, hãy đảm bảo rằng tiêu đề X-Pool
        # đã được thêm vào phản hồi trong cấu hình máy chủ phụ trợ của bạn. Điều này được sử dụng, ví dụ, bởi
        # capistrano-magento2 đá quý để xóa nội dung cũ khỏi véc ni trong quy trình triển khai của nội dung đó.
        if (!req.http.X-Magento-Tags-Pattern && !req.http.X-Pool) {
            return (synth(400, "Yêu cầu tiêu đề X-Magento-Tags-Pattern hoặc X-Pool"));
        }
        nếu (req.http.X-Magento-Tags-Pattern) {
          ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
        }
        nếu (req.http.X-Pool) {
          ban("obj.http.X-Pool ~ " + req.http.X-Pool);
        }
        return (synth(200, "Đã thanh lọc"));
    }

    nếu (req.method != "NHẬN" &&
        req.method != "HEAD" &&
        req.method != "PUT" &&
        req.method != "POST" &&
        req.method != "TRACE" &&
        req.method != "TÙY CHỌN" &&
        req.method != "XÓA") {
          /* Non-RFC2616 hoặc CONNECT lạ. */
          trở lại (ống);
    }

    # Chúng tôi chỉ xử lý GET và HEAD theo mặc định
    if (req.method != "GET" && req.method != "HEAD") {
        trở về (vượt qua);
    }

    # Bỏ qua giỏ hàng và thanh toán
    nếu (req.url ~ "/checkout") {
        trở về (vượt qua);
    }

    # Bỏ qua yêu cầu kiểm tra sức khỏe
    nếu (req.url ~ "/pub/health_check.php") {
        trở về (vượt qua);
    }

    # Đặt trạng thái sử dụng thời gian gia hạn ban đầu
    đặt req.http.grace = "không";

    # bình thường hóa url trong trường hợp tên miền và sơ đồ HTTP hàng đầu
    đặt req.url = regsub(req.url, "^http[s]?://", "");

    # thu thập tất cả cookie
    std.collect(req.http.Cookie);

    # Bộ lọc nén. Xem https://www.varnish-cache.org/trac/wiki/FAQ/Compression
    if (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") {
            # Không có điểm nào trong việc nén những thứ này
            bỏ đặt req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            đặt req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") {
            đặt req.http.Accept-Encoding = "xả hơi";
        } khác {
            # thuật toán chưa biết
            bỏ đặt req.http.Accept-Encoding;
        }
    }

    # Xóa tất cả các tham số nhận tiếp thị để giảm thiểu các đối tượng bộ đệm
    if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=" ) {
        đặt req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=[- _A-z0-9+()%.]+&?", "");
        đặt req.url = regsub(req.url, "[?|&]+$", "");
    }

    # Bộ nhớ đệm tệp tĩnh
    if (req.url ~ "^/(pub/)?(media|static)/") {
        # Các tệp tĩnh không nên được lưu vào bộ nhớ cache theo mặc định
        trở về (vượt qua);

        # Nhưng nếu bạn sử dụng một vài ngôn ngữ và không sử dụng CDN, bạn có thể kích hoạt các tệp tĩnh lưu vào bộ nhớ đệm bằng cách nhận xét dòng trước đó (#return (pass);) và bỏ ghi chú 3 dòng tiếp theo
        #unset req.http.Https;
        #unset req.http.X-Forwarded-Proto;
        #unset req.http.Cookie;
    }

     # Các yêu cầu GraphQL đã xác thực không được lưu vào bộ đệm theo mặc định
    if (req.url ~ "/graphql" && req.http.Authorization ~ "^Bearer") {
        trở về (vượt qua);
    }

bỏ đặt req.http.Authorization;
    trả lại (băm);
}

phụ vcl_hash {
    nếu (req.http.cookie ~ "X-Magento-Vary=") {
        hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
    }

    nếu (req.url ~ "/graphql") {
        gọi process_graphql_headers;
    }

    # Để đảm bảo người dùng http không nhìn thấy cảnh báo ssl
    nếu (req.http.X-Forwarded-Proto) {
        hash_data(req.http.X-Forwarded-Proto);
    }
    
}

quy trình phụ_graphql_headers {
    nếu (req.http.Store) {
        hash_data(req.http.Store);
    }
    if (req.http.Content-Tiền tệ) {
        hash_data(req.http.Content-Tiền tệ);
    }
}

phụ vcl_backend_fetch {
    # xác thực với quản trị viên:quản trị viên
    đặt bereq.http.Authorization = "ZGV2OmRldg cơ bản ==";
}

phụ vcl_backend_response {

    đặt beresp.grace = 3d;

    if (beresp.http.content-type ~ "văn bản") {
        đặt beresp.do_esi = true;
    }

    if (bereq.url ~ "\.js$" || beresp.http.content-type ~ "text") {
        đặt beresp.do_gzip = true;
    }

    nếu (beresp.http.X-Magento-Debug) {
        đặt beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
    }

    # bộ đệm chỉ phản hồi thành công và lỗi 404
    if (beresp.status != 200 && beresp.status != 404) {
        đặt beresp.ttl = 0s;
        đặt beresp.uncacheable = true;
        trả lại (giao);
    } elsif (beresp.http.Cache-Control ~ "riêng tư") {
        đặt beresp.uncacheable = true;
        đặt beresp.ttl = 86400s;
        trả lại (giao);
    }

    # xác thực nếu chúng tôi cần lưu vào bộ nhớ cache và ngăn cài đặt cookie
    if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) {
        bỏ đặt beresp.http.set-cookie;
    }

   # Nếu trang không thể lưu trong bộ nhớ cache thì bỏ qua véc ni trong 2 phút dưới dạng Hit-For-Pass
   nếu (beresp.ttl <= 0s ||
       beresp.http.Surrogate-control ~ "no-store" ||
       (!beresp.http.Surrogate-Control &&
       beresp.http.Cache-Control ~ "no-cache|no-store") ||
       beresp.http.Vary == "*") {
       # Đánh dấu là Hit-For-Pass trong 2 phút tiếp theo
        đặt beresp.ttl = 120s;
        đặt beresp.uncacheable = true;
    }

    trả lại (giao);
}

phụ vcl_deliver {
    nếu (resp.http.X-Magento-Debug) {
        nếu (resp.http.x-véc ni ~ " ") {
            đặt resp.http.X-Magento-Cache-Debug = "HIT";
            đặt resp.http.Grace = req.http.grace;
        } khác {
            đặt resp.http.X-Magento-Cache-Debug = "MISS";
        }
    } khác {
        hủy đặt resp.http.Age;
    }

    # Không cho phép trình duyệt lưu trữ các tệp không tĩnh.
    if (resp.http.Cache-Control !~ "private" && req.url !~ "^/(pub/)?(media|static)/") {
        đặt resp.http.Pragma = "no-cache";
        đặt resp.http.Expires = "-1";
        đặt resp.http.Cache-Control = "no-store, no-cache, must-validate, max-age=0";
    }

    bỏ đặt resp.http.X-Magento-Debug;
    bỏ đặt resp.http.X-Magento-Tags;
    bỏ đặt resp.http.X-Powered-By;
    bỏ đặt resp.http.Server;
    bỏ đặt resp.http.X-Varnish;
    hủy đặt resp.http.Via;
    bỏ đặt resp.http.Link;
}

phụ vcl_hit {
    nếu (obj.ttl >= 0s) {
        # Lượt truy cập trong khoảng thời gian TTL
        trả lại (giao);
    }
    if (std.healthy(req.backend_hint)) {
        if (obj.ttl + 300s > 0s) {
            # Lượt truy cập sau khi hết hạn TTL, nhưng trong thời gian gia hạn
            đặt req.http.grace = "bình thường (máy chủ khỏe mạnh)";
            trả lại (giao);
        } khác {
            # Đánh sau TTL và hết hạn gia hạn
            trả lại (lấy);
        }
    } khác {
        # máy chủ không khỏe, truy xuất từ ​​bộ đệm
        đặt req.http.grace = "không giới hạn (máy chủ không lành mạnh)";
        trả lại (giao);
    }
}

phụ vcl_synth {
  nếu (resp.status == 401) {
    đặt resp.status = 401;
    đặt resp.http.WWW-Authenticate = "Cơ bản";
    trả lại (giao hàng);
  }
}
Điểm:1
lá cờ in

Vấn đề bạn đang gặp phải là chương trình phụ trợ của bạn cũng yêu cầu Xác thực cơ bản. Khi đầu dò kiểm tra sức khỏe của bạn đang thăm dò phần phụ trợ, nó sẽ trả về một HTTP/1.1 401 trái phép bởi vì bạn đã không cung cấp tiêu đề ủy quyền.

Chúng tôi có thể khắc phục điều này bằng cách gửi tiêu đề yêu cầu tùy chỉnh trong thăm dò phụ trợ của bạn.

Đây là mã VCL:

phụ trợ mặc định {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 600 giây;
    .thăm dò = {
        .yêu cầu =
            "HEAD /health_check.php HTTP/1.1"
            "Ủy quyền: Cơ bản ZGV2OmRldg="
            "Máy chủ: máy chủ cục bộ"
            "Kết nối: đóng"
            "Tác nhân người dùng: Đầu dò sức khỏe Varnish";
        .thời gian chờ = 2s;
        .khoảng cách = 5s;
        .cửa sổ = 10;
        .ngưỡng = 5;
   }
}

Như bạn có thể thấy, chúng tôi đang gửi yêu cầu HTTP sau tới chương trình phụ trợ của bạn:

HEAD /health_check.php HTTP/1.1
Ủy quyền: Basic ZGV2OmRldg=
Máy chủ: máy chủ cục bộ
Kết nối: đóng
User-Agent: Varnish Health Probe

Chúng tôi đang thực hiện một CÁI ĐẦU gọi chứ không phải là một ĐƯỢC, bởi vì chúng tôi không quan tâm đến tải trọng, chúng tôi chỉ quan tâm đến mã trạng thái.

Tôi cũng giả sử ZGV2OmRldg cơ bản= là giá trị ủy quyền phù hợp được yêu cầu bởi chương trình phụ trợ của bạn.

Giả định cuối cùng mà tôi đang đưa ra là chương trình phụ trợ của bạn sẽ phản hồi thành công yêu cầu có Máy chủ: máy chủ cục bộ tiêu đề.

Nhìn thấy https://www.varnish-software.com/developers/tutorials/vcl-backend-probe-basic-authentication/ để có hướng dẫn phù hợp với trường hợp sử dụng của bạn.

Major Kuprich avatar
lá cờ us
Cảm ơn bạn rất nhiều vì đã mô tả đầy đủ, giờ đây Varnish được định cấu hình đúng với BasicAuth :)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.