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