Nén trong Drupal 7


7

Tôi đang chạy Drupal (phiên bản mới nhất 7.22) trên Apache 2.2 và tôi cũng đã cài đặt Varnish (mô-đun và proxy). Trong Apache, tôi đã vô hiệu hóa mô-đun mod_deflate. Đọc trên web, có vẻ như các tùy chọn trên trang hiệu suất trong Drupal (tổng hợp css, js) không nên nén các tệp css và js. Tuy nhiên, duyệt trang web của tôi và kiểm tra các tiêu đề http, tôi thấy rằng tôi đang nhận được "Mã hóa nội dung: gzip". Nhìn vào .htaccess (mặc định), tôi thấy rằng có một số quy tắc viết lại để lưu trữ các tệp được nén vào các máy khách có thể đọc chúng. Vì vậy, tôi đoán đây là nơi mà các tiêu đề "Mã hóa nội dung: gzip" đến từ. Ngoài ra, khi tôi cho phép nén các trang được lưu trong bộ nhớ cache trên trang cài đặt hiệu suất trong drupal, tôi thấy rằng ngay cả html của trang tôi đang yêu cầu (chỉ là người dùng ẩn danh) được nén lại.

1) Thực hiện các tùy chọn "Tổng hợp và nén các tệp CSS." và "Tổng hợp các tệp JavaScript." thực sự nén các tập tin tổng hợp hay chỉ là .htaccess làm cho chúng có vẻ như được nén? Sử dụng các công cụ phát triển chrome, các tệp dường như được nén. Tuy nhiên, kiểm tra chúng bằng addon thanh công cụ dành cho nhà phát triển trong firefox, (Thông tin -> Xem kích thước tài liệu) chúng không được báo cáo là đã nén (trong khi tệp html luôn được báo cáo như vậy, ngay cả khi tôi truy cập dưới dạng người dùng được xác thực!)

2) Nếu chúng thực sự được nén, quá trình nén diễn ra ở đâu? Tôi có thể kiểm soát mức độ nén, vv bằng cách nào đó?

3) Tôi luôn nhận được "MISS" X-Drupal-Cache. Tôi không quan tâm lắm vì tôi đã cài đặt Varnish. Tuy nhiên, vì tôi không nhấn vào bộ đệm, tại sao tôi lại trả lại một tệp html đã nén (không có trong bộ đệm)?

4) Có bất kỳ cơ hội nào mà mô-đun Varnish làm rối tung mọi thứ không? Tôi đang truy cập trang web bằng https để chắc chắn rằng Varnish bị bỏ qua, trong mọi trường hợp.

5) Nếu tôi bật mod_deflate, tôi có nên giữ nguyên phần đó của .htaccess không? Tôi hiểu rằng mod_deflate không cho phép giải nén, nhưng nếu nén tốt hơn thì sao?

6) Ngoài ra, nếu drupal tự nén các tệp css, js và html, thì điểm nào cho phép mod_deflate cho các tệp này?

Đây là phần có liên quan của tệp .htaccess của tôi để tham khảo:

  <IfModule mod_headers.c>
    # Serve gzip compressed CSS files if they exist and the client accepts gzip.
    RewriteCond %{HTTP:Accept-encoding} gzip
    RewriteCond %{REQUEST_FILENAME}\.gz -s
    RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

    # Serve gzip compressed JS files if they exist and the client accepts gzip.
    RewriteCond %{HTTP:Accept-encoding} gzip
    RewriteCond %{REQUEST_FILENAME}\.gz -s
    RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

    # Serve correct content types, and prevent mod_deflate double gzip.
    RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
    RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header set Content-Encoding gzip
      # Force proxies to cache gzipped & non-gzipped css/js files separately.
      Header append Vary Accept-Encoding
    </FilesMatch>
  </IfModule>

Câu trả lời:


3

Một khởi đầu:

1) Có.

Lưu ý: Nếu tôi thực sự muốn biết những gì đang diễn ra, tôi sử dụng fiddler (Windows).

2) Xem hàm drupal_build_css_cache () trong common.inc (dòng 3603). Bạn không thể ảnh hưởng đến cấp độ nhưng bạn có thể ảnh hưởng đến việc nó có nén hay không với biến 'css_gzip_compression', xem default.sinstall.php dòng 432.

BTW: Bạn không muốn ảnh hưởng đến mức nén: để nén một lần, sử dụng nhiều trường hợp, nén tối đa luôn là tốt nhất. Thời gian chuyển và thời gian giải nén tại máy khách là tuyến tính với kích thước tài liệu nén. Vì vậy, lần truy cập hiệu suất tăng nhẹ 1 lần sẽ tiết kiệm rất nhiều hoạt động mạng và xử lý phía máy khách trong tương lai.

3) -

4) -

5) Nén sẽ tốt hơn vì nó chỉ được thực hiện một lần và nó sẽ được thực hiện tốt hơn so với mod_deflate sẽ nén theo từng yêu cầu và do đó sẽ sử dụng mức nén thấp hơn. Tôi không biết nhiều về mod_deflate, nhưng tôi đoán rằng nếu đã có tiêu đề Mã hóa nội dung cho biết nội dung được nén, mod_deflate không nên chạm vào nó. Nhưng tôi đã có trường hợp tôi nhận được một tệp sao lưu được nén hai lần, vì vậy mod_deflate có thể không thông minh và nên được yêu cầu rõ ràng để làm như vậy.

6) Không có điểm nào, nhưng có thể có các yêu cầu khác, đặc biệt là các yêu cầu động, tức là các trang không lưu trong bộ nhớ cache. Lưu ý rằng chỉ css và js tổng hợp và các trang được lưu trong bộ nhớ cache (biến 'page_compression') được nén bởi Drupal. Các trang không lưu trong bộ nhớ cache không được nén bởi Drupal.


0

Để tóm tắt những gì tôi đã tìm thấy cho đến nay và câu trả lời của fietserwin.

1) Những tùy chọn làm nén. Không có vấn đề gì bạn đã đọc ở nơi khác. Tôi đã trải qua một số lỗi trong trình theo dõi lỗi drupal và có một vài lỗi (ví dụ như cuộc thảo luận này cho d8 ) thảo luận về việc thực sự tách hành vi này với các tùy chọn khác nhau trong cài đặt Hiệu suất trong drupal. Ngoài ra, bạn có thể kiểm tra nó bằng Chromium devtools hoặc bảng điều khiển Firefox Network (không thông qua cột kích thước, nhưng bằng cách kiểm tra các tiêu đề phản hồi cho Mã hóa nội dung: gzip) và chuyển đổi các tùy chọn có sẵn để tổng hợp css / js trong drupal. Thanh công cụ dành cho nhà phát triển dường như bị hỏng hoặc tôi không thể hiểu nó làm gì.

Bạn có thể có tổng hợp nhưng không nén bằng cách đặt các biến css_gzip_compression và js_gzip_compression thành FALSE (xem fietserwin).

2) Quá trình nén xảy ra trong mã php. Để biết thêm chi tiết, hãy xem câu trả lời của fietswin. Đánh giá câu trả lời của anh ấy về mức độ nén, tôi đoán rằng php (ít nhất là cho drupal) nén ở mức nén tối đa. Lưu ý rằng việc nén bằng php và không phụ thuộc vào máy chủ web là phổ biến đối với nhiều ứng dụng php khác, ví dụ owncloud, flyspray, v.v.

3) Điều này hơi lạ và vẫn chưa tìm ra lý do tại sao nó xảy ra. Tôi nghĩ rằng nó phải làm với các mô-đun véc ni. Tôi không nói vecni chính nó, vì tôi đang chạy vecni 2 không có hỗ trợ nén ). Nó chỉ xảy ra khi tôi truy cập trang web thông qua véc ni (nghĩa là khi tôi truy cập nó bằng https, bỏ qua véc ni, trang không được lưu vào bộ nhớ cache và không được nén). Và nếu tôi bật tùy chọn "Nén trang được lưu trong bộ nhớ cache". Vì vậy, tôi đoán là mô-đun vecni chiếm hoàn toàn cơ chế lưu trữ của drupal nhưng vẫn sử dụng các tùy chọn này để đặt hành vi (nén, trọn đời, v.v.) của bộ đệm véc-ni.

Vì tôi không thể tìm thấy thêm thông tin nào về điều này và tôi đã đặt mod_deflate thành gzip tất cả các tệp html, tôi đã tắt tùy chọn này để ngăn các trang được lưu trong bộ nhớ cache được nén hai lần. Có thể có một kiểm tra hoặc sth, như với css / js, để ngăn chặn điều này nhưng tôi chưa tìm thấy.

4) câu hỏi lỗi thời

5) Nén phải xảy ra trong drupal, không phải trong apache. Ở đó, nó chỉ xảy ra một lần (trong một thời gian). Vì vậy, đoạn trích .htaccess ở trên nên được giữ nguyên. Những gì nó làm là:

RewriteCond %{HTTP:Accept-encoding} gzip #if the client can handle compression
RewriteCond %{REQUEST_FILENAME}\.gz -s #and if the (aggregated css file already exists
RewriteRule ^(.*)\.css $1\.css\.gz [QSA] #serve the compressed file instead

# The same for js files
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

# Do no actual rewriting but set the no-gzip apache variable to inform apache not to compress the already compressed files.
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

Vì vậy, phần này nên được giữ nguyên để tận dụng một cách an toàn toàn bộ cơ chế. Việc nén, như đã nói ở trên, có lẽ là tốt nhất có thể.

6) Để thêm vào câu trả lời của fietserwin, có thể có các ứng dụng khác đang chạy trên máy chủ. Nói chung, chỉ cần kích hoạt nén cho css và js trong apache, và htaccess của drupal sẽ ngăn chặn việc nén kép.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.