Điểm:0

Varnish đôi khi (tối đa ~5% yêu cầu) kích hoạt err_too_many_redirects, chạy trong docker kết hợp với plesk cho wordpress

lá cờ tf

Chúng tôi đã làm theo các hướng dẫn này https://support.plesk.com/hc/en-us/articles/115001888894-Does-Plesk-support-Varnish- và đã có thể làm cho nó hoạt động 'đúng cách', nó phục vụ trang wordpress thông qua lớp sơn bóng và tốc độ thật đáng kinh ngạc. Tất cả đều ổn, nhưng robot thời gian hoạt động của chúng tôi thỉnh thoảng báo cáo thời gian ngừng hoạt động ngắn (rất không đều, nhưng từ 1 đến 8 lần một ngày trong khoảng thời gian <5 phút, vào các thời điểm khác nhau trong ngày).

Sau một số thử nghiệm khác nhau, chúng tôi nhận thấy có sự cố với url wp-admin, chúng tôi kết luận rằng sự cố này xảy ra do DirectoryIndex của chúng tôi (là index.html theo mặc định), chúng tôi đã giải quyết vấn đề này bằng cách thêm 'DirectoryIndex index.php ' thành 'Chỉ thị bổ sung của Apache' đã giải quyết vấn đề đó.

Một điều có vẻ thú vị đối với chúng tôi là khi chúng tôi thay đổi cách phục vụ PHP(FPM), nó sẽ ảnh hưởng đến lỗi tương tự. Khi chúng tôi phân phối thông qua NGINX, chúng tôi cũng sẽ nhận được err_too_many_redirects, nếu chúng tôi phân phối nó qua Apache thì nó hoạt động 95% thời gian.

Tôi đã thêm một số nhật ký (varnishncsa) bên dưới, khi phản hồi tiêu đề cho biết 301, đó là khi chúng tôi đang ở trong vòng lặp:

172.17.0.1 - - [11/Jan/2022:13:54:55 +0000] "HEAD http://[the varnish domain]/ HTTP/1.0" 200 0 "https://[the varnish domain]" " Mozilla/5.0+(tương thích; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

172.17.0.1 - - [11/Jan/2022:13:56:51 +0000] "NHẬN http://[the varnish domain]/ HTTP/1.0" 200 11184 "-" "-"

172.17.0.1 - - [11/Jan/2022:13:58:31 +0000] "HEAD http://[the varnish domain]/ HTTP/1.0" 301 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/56.0.2924.76 Safari/537.36"

172.17.0.1 - - [11/Jan/2022:13:58:32 +0000] "HEAD http://[the varnish domain]/ HTTP/1.0" 301 0 "http://[the varnish domain]" " Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/56.0.2924.76 Safari/537.36"

Sau đó, chúng tôi đăng nhập sau 8 lần: 172.17.0.1 - - [11/Jan/2022:13:58:32 +0000] "HEAD http://[the varnish domain]/ HTTP/1.0" 301 0 "https://[the varnish domain]/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/56.0.2924.76 Safari/537.36"

Sau đó: 172.17.0.1 - - [11/Jan/2022:13:58:34 +0000] "NHẬN http://[the varnish domain]/ HTTP/1.0" 301 238 "-" "Mozilla/5.0 (X11; Linux x86_64 ) AppleWebKit/537.36 (KHTML, như Gecko) HeadlessChrome/96.0.4664.110 Safari/537.36"

Rồi 7 lần: 172.17.0.1 - - [11/Jan/2022:13:59:55 +0000] "HEAD http://[the varnish domain]/ HTTP/1.0" 301 0 "https://[the varnish domain]" " Mozilla/5.0+(tương thích; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

Sau đó 22 lần: 172.17.0.1 - - [11/Jan/2022:14:00:17 +0000] "NHẬN http://[the varnish domain]/ HTTP/1.0" 301 238 "https://[the varnish domain]" " Mozilla/5.0+(tương thích; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

Rồi ngay sau đó mọi thứ có vẻ ổn trở lại.

Cập nhật: kiểm tra nhật ký

@ thijs-feryn đã chỉ ra một điều thú vị khiến chúng tôi kết luận rằng chúng tôi đã bác bỏ một lý thuyết cũ quá sớm. Vì chúng tôi cảm thấy chắc chắn rằng X-Forwarded-Proto đã được thông qua, bởi vì nó nằm trong 'cấu hình tiêu đề apache bổ sung' của chúng tôi.

Tuy nhiên, sau khi đọc kỹ phản hồi của anh ấy, chúng tôi đã biết rằng bằng cách nào đó, X-Forwarded-Proto không được thông qua mọi yêu cầu (ít nhất là không phải trên những yêu cầu bị hỏng). Anh ấy chỉ ra rằng [another varnish domain] dường như đã vượt qua kỷ lục này một cách tốt đẹp trong một yêu cầu tương tự.

Sau khi so sánh cẩn thận các cấu hình, chỉ có một điều nổi bật đối với chúng tôi, đó là miền được ưu tiên trong plesk cho [miền véc ni khác] được đặt thành 'Không' và cho [miền véc ni] được đặt thành [miền véc ni miền].

Vì vậy, chúng tôi đã truy cập www.[the varnish domain] trong trình duyệt của mình và điều đó dường như gây ra sự cố. Chúng tôi cũng đã chuyển 'Miền ưa thích' thành 'Không' ở đây và bây giờ www.[the varnish domain] chuyển hướng đến [the varnish domain] tốt.

giả thuyết

Có vẻ như chuyển hướng riêng của plesk bỏ qua 'Chỉ thị bổ sung cho HTTP' và do đó 'Vary: X-Forwarded-Proto' không được thêm vào. Chúng tôi sẽ theo dõi vấn đề này và sẽ sớm đăng bản cập nhật khi chúng tôi hoàn toàn tin tưởng rằng đây là nguyên nhân.

Điểm:0
lá cờ in

Vấn đề có thể liên quan đến việc thiếu nhận thức về giao thức khi nói đến bộ nhớ đệm. Một điều khá điển hình là một yêu cầu HTTP lẽ ra phải được chuyển hướng đến một yêu cầu HTTPS sẽ kết thúc trong bộ đệm, giúp chuyển hướng vô điều kiện người dùng đến phiên bản HTTPS, ngay cả khi họ thực sự yêu cầu một phiên bản HTTPS.

Có nhiều cách khác nhau để khắc phục điều này tùy thuộc vào loại máy chủ web bạn đang sử dụng.

đầu ra véc ni

Nhưng trước khi chúng ta có thể đi đến kết luận, tôi muốn xem một số dầu bóng đầu ra.

Tôi muốn xem đầu ra của lệnh sau khi vòng lặp chuyển hướng diễn ra:

varnishlog -g request -q "ReqUrl eq '/'"

Giả định là sự cố cũng xảy ra trên trang chủ mà chúng tôi đã thêm dưới dạng truy vấn VSL vào dầu bóng chỉ huy.

tôi nhận thấy của bạn vecni đầu ra, nhưng tiếc là nó quá hạn chế về đầu ra. dầu bóng tốt hơn rất nhiều để gỡ lỗi trong khi vecni Chỉ là.

Kiểm tra giả thuyết

Nếu vòng lặp chuyển hướng thực sự do thiếu nhận thức về giao thức gây ra, chúng ta có thể kích hoạt sự cố như sau:

  • Chạy varnishadm ban obj.status "!=" 0 để làm trống bộ đệm
  • Gọi URL HTTP đơn giản của trang web để đảm bảo phiên bản này được lưu vào bộ đệm
  • Gọi URL HTTPS của trang web để kiểm tra xem bạn có bị kẹt trong vòng lặp chuyển hướng hay không

Khắc phục sự cố

Nếu tất cả các phép thử cộng lại và giả thuyết được chứng minh, thì giải pháp thực sự khá đơn giản.

Nếu bạn đang sử dụng Apache làm máy chủ web, bạn có thể thêm nội dung sau vào .htaccess tập tin:

SetEnvIf X-Forwarded-Proto "https" HTTPS=on
Tiêu đề nối thêm Khác nhau: X-Forwarded-Proto

Nếu không, bạn cũng có thể thêm đoạn mã sau vào tệp VCL của mình:

phụ vcl_backend_response {
    if(beresp.http.Vary) {
        if(beresp.http.Vary !~ "X-Forwarded-Proto") {
            đặt beresp.http.Vary = đặt beresp.http.Vary + ", X-Forwarded-Proto";
        }
    } khác {
        đặt beresp.http.Vary = "X-Forwarded-Proto";
    }
}

Thêm X-Forwarded-Proto đến Thay đổi tiêu đề sẽ đảm bảo rằng Varnish tạo các đối tượng riêng biệt trong bộ đệm cho HTTP và cho HTTPS.

Tôi cũng cho rằng proxy TLS của bạn thực sự gửi một X-Forwarded-Proto tiêu đề.

Cập nhật: kiểm tra nhật ký

Sau một số bình luận qua lại, tôi đã nhận được một số nhật ký sâu sắc qua https://Pastebin.com/QzPh1r5R đó giải thích những gì đang xảy ra.

Trong ** << BeReq >> 951078 bạn có thể nhìn thấy X-Forwarded-Proto: http tiêu đề. Điều này có nghĩa là yêu cầu đã được gửi thông qua một yêu cầu HTTP đơn giản. Loại yêu cầu này sẽ dẫn đến chuyển hướng 301 và nó thực hiện theo các dòng nhật ký sau:

-- Giao thức Beresp HTTP/1.1
-- BerespStatus 301
-- BerespReason đã di chuyển vĩnh viễn
-- BerespHeader Ngày: Thứ năm, ngày 13 tháng 1 năm 2022 08:55:17 GMT
-- Máy chủ BerespHeader: Apache
-- Vị trí BerespHeader: https://[the varnish domain]/
-- Độ dài nội dung BerespHeader: 238
-- Kiểu nội dung BerespHeader: text/html; bộ ký tự = iso-8859-1
-- TTL RFC 120 10 0 1642064118 1642064118 1642064117 0 0 có thể lưu vào bộ đệm

Quá trình chuyển hướng không chỉ diễn ra mà còn được lưu vào bộ nhớ cache trong 120 giây. Thật thú vị khi thấy rằng không có Thay đổi: X-Forwarded-Proto tiêu đề.

Vào một thời gian sau, các * << Yêu cầu >> 951080 giao dịch bật lên trong nhật ký. Chúng tôi thấy các tiêu đề yêu cầu sau:

- ReqHeader X-Forwarded-Proto: https
- ReqHeader Host: [another varnish domain]

Vì vậy, đây là một yêu cầu HTTPS cho một miền Varnish khác và vì lý do nào đó, nó dẫn đến một lần truy cập bộ đệm trả về một Thay đổi tiêu đề:

- RespHeader Vary: Mã hóa chấp nhận,Cookie,X-Forwarded-Proto
- VCL_cuộc gọi HIT
- Lượt 886585 90003.966201 10.000000 0.000000

Bạn không chỉ nhìn thấy lần truy cập mà còn có thể kết luận rằng đối tượng đã được đưa vào bộ nhớ cache theo giao dịch 886585.

Mặc dù thật tốt khi có một Thay đổi tiêu đề, cái này chứa Bánh quy giá trị nguy hiểm.Điều này có nghĩa là một đối tượng riêng biệt sẽ được lưu trữ trong bộ đệm cho mọi giá trị cookie có thể được trình bày cho Varnish. Điều này là khá nguy hiểm, vì vậy hãy loại bỏ Bánh quy từ Thay đổi tiêu đề và gắn bó với Khác nhau: Chấp nhận-Mã hóa, X-Forwarded-Proto.

Giao dịch cuối cùng tôi xem xét là * << Yêu cầu >> 951082. Nó có một X-Forwarded-Proto: https tiêu đề yêu cầu và sẽ không dẫn đến chuyển hướng 301, nhưng rất tiếc là có.

Các Đánh thẻ hiển thị một số thông tin thú vị:

- Lượt 951078 82.391648 10.000000 0.000000

Đối tượng bị tấn công, ban đầu được chèn vào bộ nhớ cache theo giao dịch 951078. Nếu bạn chú ý, đó là cái đầu tiên chúng tôi đề cập. Giao dịch này là giao dịch chỉ HTTP dẫn đến chuyển hướng 301.

Và đó chính xác là đối tượng được trả về. Vì vậy, mặc dù bạn đang yêu cầu nội dung HTTPS, nhưng bạn vẫn bị chuyển hướng và đó là cách bạn kết thúc trong vòng lặp vô tận.

Nếu bạn nhìn vào phản hồi được trả về bởi giao dịch 951082, bạn không nhìn thấy Thay đổi tiêu đề:

- RespProtocol HTTP/1.1
- Phản hồi Trạng thái 301
- RespReason Đã di chuyển vĩnh viễn
- RespHeader Ngày: Thứ Năm, ngày 13 tháng 1 năm 2022 08:55:17 GMT
- Máy chủ RespHeader: Apache
- Vị trí RespHeader: https://[the varnish domain]/
- Độ dài nội dung của RespHeader: 238
- Kiểu nội dung RespHeader: text/html; bộ ký tự = iso-8859-1
- RespHeader X-Varnish: 951082 951078
- Người đại diện Tuổi: 37
- RespHeader Via: 1.1 véc ni (Varnish/7.0)

Phần kết luận: Hãy đảm bảo rằng X-Forwarded-Proto được thêm vào của bạn Thay đổi tiêu đề. Nó sẽ ngăn chặn việc bị mắc kẹt trong vòng lặp chuyển hướng.

lá cờ tf
Trước hết, cảm ơn bạn đã trả lời chi tiết của bạn. Tôi đã thử làm theo các bước được mô tả trong 'Kiểm tra giả thuyết' và tạo nhật ký của thử nghiệm đó bằng cách sử dụng varnishlog (tôi đã tải nhật ký này lên https://pastebin.com/hxtp8gX9). Tôi liên tục đăng nhập thông qua varnishlog như bạn đã mô tả và tôi sẽ đăng nhật ký khi sự cố xảy ra. >SetEnvIf X-Forwarded-Proto "https" HTTPS=on Tiêu đề nối thêm Khác nhau: X-Forwarded-Proto Là trong 'cấu hình apache bổ sung' của tôi, về bản chất cũng giống như việc thêm nó vào tệp .htaccess.
Thijs Feryn avatar
lá cờ in
@RemcovanGrinsven Hãy cập nhật cho tôi, Remco. Mong được ghi nhật ký đàng hoàng khi có sự cố xảy ra.
lá cờ tf
Cảm ơn bạn đã quan tâm của bạn.Tôi đã có thể ghi lại một khoảnh khắc ngừng hoạt động trong nhật ký sơn dầu, bạn có thể tìm thấy phiên bản ngắn của nhật ký tại đây: https://pastebin.com/QzPh1r5R Tôi đã tải nhật ký đầy đủ lên https://we.tl/t-wDfhPo57in (Nếu bạn thích một trang web khác, Chúng tôi sẽ tải nó lên đó) nhưng như vậy là rất nhiều nhật ký. Mong được nghe ý kiến ​​của bạn.
Thijs Feryn avatar
lá cờ in
@RemcovanGrinsven Tôi nghĩ rằng tôi đã tìm thấy nó. Tôi đã cập nhật phản hồi của mình và thêm kết luận của mình. Có một cái nhìn.
lá cờ tf
Cảm ơn bạn rất nhiều vì đầu vào của bạn. Dựa trên thông tin đầu vào của bạn, chúng tôi có thể tìm thấy điều gì đó đáng ngờ. Chúng tôi hiện đang thử nghiệm một giải pháp khả thi (Tôi đã cập nhật bài đăng gốc của mình để biết thêm chi tiết).
lá cờ tf
Sự cố đã không xảy ra trong suốt cả ngày cuối tuần, đó có thể là một sự trùng hợp lớn hoặc có thể an toàn để kết luận rằng sự cố đã được giải quyết ngay bây giờ. Tôi sẽ chấp nhận thông tin đầu vào của bạn dưới dạng giải pháp cho những người khác có thể có thứ gì đó tương tự. Đầu vào của bạn rất sâu sắc!

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