Điểm:0

Varnish không mở kết nối phụ trợ

lá cờ us

Làm cách nào tôi có thể kết nối bộ chứa Varnish với bộ chứa PHP-FPM + NGINX? Docker bắt đầu chính xác, trang web hoạt động nhưng nhật ký phụ trợ trống.

Phần phụ trợ hoạt động bình thường (trả về trạng thái HTTP 200).

varnishlog -g raw -i Backend_health

0 Backend_health - mặc định Vẫn khỏe mạnh 4---X-RH 7 5 10 0,048069 0,065633 "HTTP/1.1 200 OK"

Từ vùng chứa http (nginx) tôi thấy yêu cầu trong nhật ký docker.

nhật ký docker http

[10/Sep/2021:17:24:01 +0000] "GET /health_check.php HTTP/1.1" 200 5 "-" "-"

Nhưng kết nối phụ trợ không mở kết nối, nhật ký trống, được xác minh qua: vecnilog -i backendopen chỉ huy. Tôi đã thử giải pháp từ trang web này nhưng không hoạt động: Php+Nginx+Varnish trên docker-compose, ubuntu18.

docker-compose.yml

http:
    xây dựng:
    bối cảnh: docker/http
    container_name: http
    cổng:
       - 80:80
       - 443:443
    phụ thuộc:
       - php
    khối lượng:
        - ./project:/var/www/project

php:
    xây dựng:
        ngữ cảnh: docker/php
    container_name: php
    working_dir: /var/www/project
    khối lượng:
        - ./project:/var/www/project

    
Sơn dầu:
    xây dựng:
    bối cảnh: docker/véc ni
    container_name: vecni
    cổng:
       - 6081:6081
       - 6082:6082

Cấu hình VCL:

vcl 4.0;

tiêu chuẩn nhập khẩu;

phụ trợ mặc định {
    .host = "http";
    .port = "80";
    .first_byte_timeout = 600 giây;
    .thăm dò = {
        #.url = "/health_check.php";
        .yêu cầu =
                    "NHẬN /health_check.php HTTP/1.1"
                    "Máy chủ: http"
                    "Kết nối: đóng";
        .thời gian chờ = 2s;
        .khoảng cách = 5s;
        .cửa sổ = 10;
        .ngưỡng = 5;
   }
}

thanh lọc acl {
    "http";
}

phụ vcl_recv {
    nếu (req.restarts > 0) {
        đặt req.hash_always_miss = true;
    }

    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);
    }

    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"));
    }

    # Để đả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);
    }
    

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

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_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
            quay lại (khởi động lại);
        }
    } 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);
    }
}

Điểm:0
lá cờ in

thử chạy varnishlog -g request -q "ReqUrl eq '/'" để xem điều gì đang xảy ra khi yêu cầu trang chủ.

Nếu bạn thực hiện lệnh này khi bộ đệm trống, chúng ta sẽ thấy nỗ lực của Varnish để kết nối với phần phụ trợ.

Vui lòng chia sẻ đầu ra VSL tại đây và tôi sẽ hỗ trợ.

CẬP NHẬT

tôi nhận thấy trong bạn docker-compose.yml tập tin mà bạn http container được cấu hình để xử lý lưu lượng trên các cổng 80 & 443.

Vấn đề

Các Sơn dầu container đang lắng nghe trên các cổng 6081 & 6082. Trừ khi bạn đang trực tiếp định tuyến lưu lượng đến cổng 6081 rõ ràng là Varnish không nhận được bất kỳ yêu cầu nào.

Giải pháp

Vui lòng đảm bảo rằng bộ chứa Varnish của bạn cũng lắng nghe lưu lượng truy cập đến trên cổng 80. Trong VCL của bạn, bạn có thể trỏ đến cổng 80 trên http thùng đựng hàng.

Nhưng khi tiếp xúc với các cổng, bạn có thể muốn chuyển tiếp http cảng container 80 đến 8080. Điều này sẽ tránh xung đột với Varnish đang ở cảng 80 cũng.

Bạn cũng có thể trực tiếp chạy chính thức hình ảnh vecni thay vì tự xây dựng một cái.

Đây là hướng dẫn về cách chạy và định cấu hình hình ảnh Docker chính thức: https://www.varnish-software.com/developers/tutorials/running-varnish-docker/

chấm dứt TLS

cảng hiện tại 443 được liên kết với bạn http thùng đựng hàng. Nếu bạn có thể xử lý việc chấm dứt TLS ở đó và ủy quyền các yêu cầu HTTPS cho Varnish, điều đó tốt.

Nếu không, bạn có thể chạy một thùng chứa Hitch thực hiện chấm dứt TLS cho bạn.

Major Kuprich avatar
lá cờ us
Nhật ký vẫn trống: https://i.imgur.com/GFcDXEo.png Tôi đã thử cập nhật phần .probe thành: a) xóa phần .request và bỏ ghi chú .url b) cập nhật máy chủ trong phần .request thành ánh xạ cục bộ của tôi từ tệp/etc/hosts (IP, tên máy chủ) Nhưng không thành công. :( Tái bút Xin lưu ý rằng tôi đang sử dụng Magento2 CMS bên trong các thùng chứa này.
Major Kuprich avatar
lá cờ us
Đã thử cập nhật docker-compose.yml để chuyển tiếp cổng 80 sang 8080 trong bộ chứa http. Thay đổi cổng cho Varnish thành 80. Tình trạng phụ trợ bị ốm: 404 Không tìm thấy. Phần phụ trợ mở không mở, bất kỳ nhật ký nào không hoạt động. :( Kiểm tra cấu hình mới, vui lòng: https://pastebin.com/BYi1cHgM
Thijs Feryn avatar
lá cờ in
@MajorKuprich Tôi e rằng bạn đã chuyển tiếp các cổng sai thứ tự. Bạn đã chọn `6081:80` nhưng nó phải là `80:6081`. Điều tương tự cũng áp dụng cho `80:8080` nên là `8080:80`. Hy vọng rằng sẽ giúp. Nếu bạn có thể truy cập bộ chứa `http` qua cổng `8080` và bạn có thể mô phỏng lỗi 404, thì bạn có thể sửa lỗi đó và làm cho toàn bộ hoạt động.

Đă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.