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