2012-01-19 19 views
32

Tôi có một trang web (với ESI) sử dụng proxy ngược Symfony2 để lưu vào bộ nhớ đệm. Phản hồi trung bình là khoảng 100ms. Tôi đã cố gắng cài đặt Varnish trên máy chủ để dùng thử. Tôi theo sau guide from Symfony cookbook từng bước, xóa mọi thứ trong thư mục cache nhưng thư mục http_cache vẫn được tạo khi tôi dùng thử. Vì vậy, tôi đã tìm tôi có thể thử nhận xét ra $kernel = new AppCache($kernel); từ app.php. Điều đó làm việc khá tốt. http_cache không được tạo ra nữa và bởi varnishstat, Varnish dường như làm việc:Làm thế nào để thiết lập đúng Varnish cho các trang Symfony2?

12951   0.00   0.08 cache_hitpass - Cache hits for pass 
1153   0.00   0.01 cache_miss - Cache misses 

Đó là ra khoảng 14000 yêu cầu, vì vậy tôi nghĩ mọi chuyện rồi sẽ ổn thôi. Nhưng sau khi vang lên, tôi phát hiện ra những phản hồi được nâng lên ~ 2 giây.

Apache chạy trên cổng 9000 và Varnish trên 8080. Vì vậy, tôi đang sử dụng chế độ xem echoping -n 10 -h http://servername/ X.X.X.X:8080.

Tôi không biết điều gì có thể sai. Có bất kỳ cài đặt bổ sung cần thiết để sử dụng Varnish với Symfony2? Hay tôi đơn giản làm điều gì đó sai?


Theo yêu cầu, đây là số default.vcl của tôi với các sửa đổi mà tôi đã thực hiện cho đến thời điểm này.

tôi thấy 2 vấn đề với cấu hình mặc định Varnish của:

  • nó không yêu cầu bộ nhớ cache với cookie (và tất cả mọi người trong ứng dụng của tôi đã phiên giao)
  • nó bỏ qua Cache-Control: no-cache tiêu đề

Vì vậy, tôi đã thêm điều kiện cho những trường hợp này vào cấu hình của tôi và nó hoạt động khá tốt ngay bây giờ (~ 175 req/s lên từ ~ 160 với proxy ngược S2 - nhưng thành thật mà nói, tôi mong đợi nhiều hơn một chút). Tôi chỉ không có ý tưởng làm thế nào để kiểm tra xem đó là tất cả các thiết lập ok, vì vậy bất kỳ đầu vào được chào đón.

Hầu hết các trang có bộ nhớ cache khác nhau theo cookie, với s-maxage 1200. ESI chung bao gồm không khác nhau theo cookie, với s-maxage khá thấp (bài viết, danh sách bài viết). Các trang hồ sơ người dùng không được lưu trữ ở tất cả (no-cache) và tôi không thực sự chắc chắn liệu ESI có bao gồm những trang này thậm chí được lưu trữ bởi Varnish hay không. Chỉ có ESI khác nhau theo cookie là tiêu đề với thông tin cụ thể của người dùng (trên 100% số trang).

Mọi thứ trong bài đăng này là Varnish 3.X cụ thể (Cá nhân tôi đang sử dụng 3.0.2).

Ngoài ra, sau vài tuần đào sâu vào điều này, tôi thực sự không biết mình đang làm gì nữa, vì vậy nếu bạn thấy điều gì đó lạ trong cấu hình, hãy cho tôi biết.

enter image description here

+0

5 xu dựa trên kinh nghiệm gần đây của tôi. Nó hoàn toàn phụ thuộc vào cấu hình Vasnish ​​và đặc biệt là bạn có đủ bộ nhớ cho nó hay không. Bạn có thể vui lòng hiển thị 'sub vcl_recv',' sub vcl_fetch' và 'backend'? –

+0

Cập nhật bài đăng gốc với cấu hình. Một điều khác mà tôi nghĩ đến là cookie của người dùng (và có thể là các cookie theo dõi). Mọi yêu cầu trên trang của chúng tôi đều có chúng. Nhưng tôi không hiểu tại sao varnishstat nói rằng nó đang lưu lại 90% yêu cầu. Chúng tôi không bao giờ gặp vấn đề với họ khi chúng tôi sử dụng proxy ngược Symfony2. –

+0

Tôi có 'vcl_recv' tương tự trên thiết lập của mình, mặc dù tôi cũng có những dòng này:' set req.http.X-Forwarded-Port = "80"; đặt req.http.X-Forwarded-Proto = "http"; ' –

Trả lời

1

Nếu đó là toàn bộ cấu hình của bạn, vcl_recv được cấu hình hai lần.

Trong các trang bạn muốn lưu vào bộ nhớ cache, bạn có thể gửi tiêu đề bộ nhớ đệm không? Điều này sẽ có ý nghĩa nhất, vì hình ảnh có thể đã có các tiêu đề bộ nhớ đệm apache của bạn và logic ứng dụng quyết định các trang có thể được lưu trong bộ nhớ cache thực sự, nhưng bạn cũng có thể buộc điều này trong véc ni.

Bạn có thể sử dụng một vcl_recv như thế này:

# Called after a document has been successfully retrieved from the backend. 
sub vcl_fetch { 

    # set minimum timeouts to auto-discard stored objects 
    # set beresp.prefetch = -30s; 
    set beresp.grace = 120s; 

    if (beresp.ttl < 48h) { 
     set beresp.ttl = 48h;} 

    if (!beresp.cacheable) 
     {pass;} 

    if (beresp.http.Set-Cookie) 
     {pass;} 

    # if (beresp.http.Cache-Control ~ "(private|no-cache|no-store)") 
    # {pass;} 

    if (req.http.Authorization && !beresp.http.Cache-Control ~ "public") 
     {pass;} 

} 

này một bộ nhớ đệm, trong véc ni, chỉ yêu cầu được thiết lập cacheable. Ngoài ra, hãy lưu ý rằng cấu hình của bạn không lưu trữ các yêu cầu với cookie.

+0

Vâng, tôi nghĩ toàn bộ vấn đề là với cookie. Tôi sẽ cập nhật các câu hỏi sau ngày hôm nay với một số thông tin và phát triển hơn. –

+0

Ah crap, không nhận thấy tôi đã đăng 2 lần recv thay vì recv và tìm nạp>< –

+0

Đã chỉnh sửa OP với nhiều thông tin hơn dưới dòng. –

18

Tôi ngạc nhiên rằng điều này chưa có câu trả lời thực sự đầy đủ trong 10 tháng. Đây có thể là một trang thực sự hữu ích.

Bạn chỉ ra cho mình rằng:

  • Varnish không yêu cầu bộ nhớ cache với cookie
  • Varnish bỏ qua Cache-Control: no-cache tiêu đề

Điều đầu tiên là, thực hiện tất cả mọi người trong ứng dụng của bạn cần một phiên? Nếu không, không bắt đầu phiên, hoặc ít nhất là trì hoãn bắt đầu phiên cho đến khi nó thực sự cần thiết (tức là họ đăng nhập hoặc bất kỳ điều gì).

Nếu bạn vẫn có thể lưu vào bộ nhớ cache các trang khi người dùng đăng nhập, bạn cần phải thật sự cẩn thận khi bạn không phục vụ người dùng trang dành cho người khác. Nhưng nếu bạn định làm điều đó, hãy chỉnh sửa vcl_recv() để tách cookie phiên cho các trang mà bạn muốn lưu vào bộ nhớ cache.

Bạn có thể dễ dàng nhận Varnish để xử lý chỉ thị không có bộ nhớ cache trong vcl_fetch() và thực tế bạn đã làm điều đó.

Một vấn đề khác mà tôi thấy là Symfony bởi bộ mặc định max-age 0, có nghĩa là họ sẽ không bao giờ được lưu trữ bởi logic mặc định trong vcl_fetch

Tôi cũng nhận thấy rằng bạn đã thiết lập cổng trong Varnish tới:

backend default { 
    .host = "127.0.0.1"; 
    .port = "80"; 
} 

Bản thân bạn cho biết Apache đang chạy trên cổng 9000, vì vậy điều này dường như không khớp. Bạn thường đặt Varnish để nghe trên cổng mặc định (80) và thiết lập Varnish để tìm kiếm phần phụ trợ trên cổng 9000 hoặc bất cứ thứ gì.

Các vấn đề liên quan