it-swarm-vi.tech

Các bước để tối ưu hóa WordPress trong tải trọng máy chủ?

Bên cạnh việc cài đặt W3 Total Cache hoặc một plugin bộ đệm khác, tôi có thể thực hiện các bước nào để đảm bảo rằng chủ đề và trang web của tôi chạy nhanh nhất có thể.

80
Paul Sheldrake

Bạn có thể cài đặt WordPress trên Nginx. Có một số tài nguyên để trợ giúp:

Một số thông tin hiệu suất từ ​​liên kết cuối cùng đó (có vẻ là một thiết lập khác một chút so với các liên kết khác):

Vì vậy, tôi quyết định đặt proxy trước wordpress vào bộ đệm tĩnh càng nhiều càng tốt. TẤT CẢ lưu lượng không xác thực được cung cấp trực tiếp từ bộ đệm của tệp nginx, nhận một số yêu cầu (chẳng hạn như tạo nguồn cấp RSS) từ 6 trang/giây đến 7000+ trang/giây. Ôi. Nginx cũng xử lý việc ghi nhật ký và gzipping, để lại các lỗi phụ trợ nặng nề hơn để làm những gì họ làm tốt nhất: chỉ phục vụ các trang wordpress động khi cần.

...

Trên nginx - nó rất hiệu quả. Tôi không bao giờ thấy nó sử dụng nhiều hơn 10 đến 15 meg RAM và một đốm CPU, ngay cả dưới tải nặng nhất của chúng tôi. Đồ thị gang tay của chúng tôi không nói dối: chúng tôi giảm một nửa yêu cầu bộ nhớ, tăng gấp đôi thông lượng mạng gửi đi và hoàn toàn san bằng tải của chúng tôi. Chúng tôi về cơ bản không có vấn đề gì kể từ khi chúng tôi thiết lập điều này.

31
Travis Northcutt

Đặt thời hạn phía máy khách cho những thứ như css, hình ảnh, JavaScript, v.v. không cần tải xuống lại cho mỗi lượt xem trang. Điều này, cho đến nay, đã tạo ra sự khác biệt lớn nhất cho thời gian tải trang web của tôi. Tải xuống nhanh nhất là tải xuống chưa từng xảy ra ...

# BEGIN Expire headers
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 7200 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 2592000 seconds"
  ExpiresByType text/javascript "access plus 2592000 seconds"
  ExpiresByType application/x-javascript "access plus 2592000 seconds"
  ExpiresByType text/html "access plus 7200 seconds"
  ExpiresByType application/xhtml+xml "access plus 7200 seconds"
</IfModule>
# END Expire headers

# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
  <FilesMatch "\\.(ico|jpe?g|png|gif|swf|gz)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\\.(css)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\\.(js)$">
    Header set Cache-Control "max-age=2592000, private"
  </FilesMatch>
<filesMatch "\\.(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesMatch>
# Disable caching for scripts and other dynamic files
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
# END Cache-Control Headers

Bạn có thể tải trước gzip mọi thứ bạn có thể hợp lý (7-Zip là một công cụ tốt cho việc này) & tải nó lên cùng một nơi với tệp bạn vừa nén. Thay đổi .htaccess để phục vụ các tệp được nén trước, như bên dưới. Thông báo trước ở đây là bạn cần nhớ gzip lại chúng nếu/khi bạn cập nhật mọi thứ. Điều này cắt bỏ chi phí CPU, ngoài việc phân tích cú pháp .htaccess.

RewriteEngine on
#Check to see if browser can accept gzip files. If so and we have it - serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there's no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+\.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]

Đây chỉ là một câu trả lời thô. Có rất nhiều biến thể về chủ đề này. Tôi viết blog về điều này và thêm khá nhiều tài liệu tham khảo cho các bài viết chuyên sâu hơn tại http://icanhazdot.net/2010/03/23/some-wordpress- ware/ . Đọc điều đó và quan trọng hơn, các tài liệu tham khảo tôi chỉ đến - chúng là những tài nguyên tốt.

Xin lưu ý rằng nếu bạn tinker thường xuyên thì người dùng sẽ cần làm mới bộ đệm của họ.

Một plugin tôi thấy cũng rất hữu ích là wp-minify . Điều cần xem với cái này là bạn nên loại trừ các mục cụ thể của trang (biểu mẫu liên hệ, thanh trượt trang trước, v.v.) để bạn không tải xuống lại toàn bộ bộ css, JS, v.v. cho mỗi trang. Đó là một cách tốt để thu nhỏ, kết hợp và nén CSS cơ bản, JS, v.v ... Nó cắt giảm rất nhiều yêu cầu http. Wp-minify chơi tốt với supercache và cũng với các tiêu đề hết hạn mà tôi đã nêu chi tiết ở trên.

Sử dụng Yslow trong Fireorms (Firefox) hoặc tương tự để theo dõi các yêu cầu http của bạn và những gì được và không được nén. Có một cái nhìn vào tiêu đề hết hạn trong đó quá. Bạn sẽ sớm thấy những gì bạn có thể cải thiện.

26
CAD bloke

Giảm thiểu số lượng plugin bạn chạy chỉ những gì bạn thực sự cần. Đặc biệt lưu ý các plugin bổ sung mã javascript và CSS trên mỗi lần tải trang, ngay cả khi mã đó không được sử dụng trên trang.

Nếu bạn đang tạo chủ đề của riêng mình từ đầu, hãy chia nhỏ CSS của bạn để các tính năng chỉ cần cho các mẫu trang hoặc loại xem cụ thể (bài đăng đơn, lưu trữ, danh mục, v.v.) chỉ được tải khi cần.

Định cấu hình W3TC để sử dụng CDN (như Amazon CloudFront hoặc bất kỳ ứng dụng nào khác được W3TC hỗ trợ).

Xem các tùy chọn Thu nhỏ có phù hợp với bạn không (một số plugin tạo js/css sẽ không giảm thiểu độc đáo, vì vậy hãy chắc chắn kiểm tra trang web của bạn sau khi kích hoạt tính năng thu nhỏ).

Nếu bạn có toàn quyền kiểm soát máy chủ MySQL của mình, hãy đảm bảo rằng bạn đã bật query_cache. Sử dụng Tập lệnh điều chỉnh MySQL để tìm các cách khác để tối ưu hóa cấu hình cơ sở dữ liệu của bạn.

Nếu vì lý do nào đó, việc sử dụng CDN có vấn đề, hãy định cấu hình mod_Exires trong thiết lập Apache của bạn. Đặt thời gian hết hạn miễn là hợp lý cho các loại tĩnh như hình ảnh, css, javascript, video, âm thanh, v.v.

21
Dougal Campbell

Chạy memcached và sử dụng bộ đệm đối tượng để giảm số lượng truy vấn cơ sở dữ liệu. Điều này lưu trữ dữ liệu từ cơ sở dữ liệu, thay vì các trang. Không chắc chắn nếu w3-Total-cache đã làm điều này.

Đảm bảo bạn đang chạy bộ đệm opcode như APC . (Có nhiều cái khác có sẵn.)

14
Annika Backstrom

Ngoài việc sử dụng plugin lưu trữ đĩa như wp-cache, hãy đặt blog của bạn vào ổ đĩa Máy chủ có thuộc tính "noatime" được đặt trên nó. Mặt khác, SSH vào Máy chủ của bạn (nếu webhost của bạn cung cấp điều đó) và thường xuyên chạy lệnh này trên các tệp của bạn mỗi vài ngày:

chattr -R +A ~/*

~/* Có nghĩa là "các tệp của tôi trong thư mục nhà của tôi". Bạn có thể thay đổi đường dẫn đó khi bạn thấy phù hợp. Bạn cũng có thể thiết lập công việc này trên một công việc định kỳ trong cpanel nếu webhost của bạn cung cấp điều đó.

Để biết thêm thông tin về tài sản atime, xem này . Nó tăng tốc hiệu suất đọc đĩa Linux rất nhiều.

Đôi khi trang web của bạn đang bị nhện đập. Bạn có thể sử dụng một công cụ như SpyderSpanker hoặc Chennai Central để lọc những con nhện không giúp mang lại nhiều thứ hạng trang hơn cho trang web của bạn và chỉ làm chậm nó, sau đó điều khiển những con nhện tốt (như Google, Bing, v.v.) bằng cách gửi chúng ngẫu nhiên HTTP 304 Tin nhắn không được sửa đổi.

Một điều khác tôi thấy chỉ là các plugin được viết kém. Nếu bạn tìm hiểu cách tạo plugin, bạn bắt đầu thấy một số plugin được mã hóa không hiệu quả hoặc thậm chí tìm thấy các khung thời gian, chẳng hạn như bảng cơ sở dữ liệu lấp đầy và không bao giờ bị xóa, lưu trữ những thứ như dữ liệu kết nối đến.

Ngoài tất cả các giải pháp khác ở đây, bạn cũng có thể tạo trang trại web WordPress của blog của mình bằng cách lưu trữ nó trên một số PC nút web, tất cả kết nối lại với một cơ sở dữ liệu và một ổ đĩa đơn cho các tệp (chẳng hạn như ổ đĩa được gắn trên NFS ). Kiểm tra Ultra Monkey để biết làm thế nào để mọi thứ diễn ra.

8
Volomike

Một vài câu trả lời trên đỉnh đầu của tôi:

1) Giảm thiểu số lượng yêu cầu HTTP mà trình duyệt phải gửi đến Máy chủ của bạn bằng cách kết hợp JavaScript và CSS khi có thể/thực tế.

2) Giảm tải càng nhiều hình ảnh/phương tiện của bạn phục vụ cho CDN của bên thứ 3 càng tốt, đặc biệt nếu bạn đang sử dụng lưu trữ chia sẻ.

3) Thử giảm số lượng bài đăng bạn đang hiển thị trên trang đầu để giảm tổng thời gian kết xuất.

3a) Hãy thử sử dụng một chủ đề trình bày một vài bài đăng nổi bật đầy đủ trên trang nhất và tất cả các bài đăng cũ hơn khác dưới dạng trích đoạn.

7
ZaMoose

Bộ nhớ đệm Menu WordPress cũng giúp bạn tăng hiệu suất. Đặc biệt nếu bạn có nhiều Trang hoặc Cấu trúc Menu khổng lồ, điều này cần được xem xét.

Làm điều đó trong 2 bước dễ dàng. Đầu tiên, tạo một chức năng nhận hoặc tạo menu, thay vì gọi trực tiếp wp_nav_menu.

function get_cached_menu( $menuargs ) {

    if ( !isset( $menuargs['menu'] ) ) {

        $theme_locations = get_nav_menu_locations();
        $nav_menu_selected_id = $theme_locations[$menuargs['theme_location']];
        $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );
        $transient = 'menu_' . $termslug->slug . '_transient';

    } else {

        $transient = 'menu_' . $menuargs['menu'] . '_transient';

    }


    if ( !get_transient( $transient ) ) { // check if the menu is already cached

        $menuargs['echo'] = '0'; // set the output to return
        $this_menu = wp_nav_menu( $menuargs ); // build the menu with the given $menuargs
        echo $this_menu; // output the menu for this run
        set_transient( $transient, $this_menu ); // set the transient, where the build HTML is saved

    } else {

        echo get_transient( $transient ); // just output the cached version

    }

}

Trong chủ đề của bạn, thay thế wp_nav_menus bằng get_cached_menu. Bây giờ, mỗi khi menu được gọi, bạn có một Cơ sở dữ liệu thay vì toàn bộ Bản dựng.

Menu không thay đổi thường xuyên - nhưng bạn cũng phải nối vào hành động wp_update_nav_menu để xóa các giao dịch cũ.

Làm như thế này:

add_action('wp_update_nav_menu', 'my_delete_menu_transients');

function my_delete_menu_transients($nav_menu_selected_id) {

    $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );

    $transient = 'menu_' . $termslug->slug . '_transient';

    delete_transient( $transient ); 

}

Menu sẽ được tạo vào lần tiếp theo khi trang được gọi - và sử dụng phiên bản được lưu trong bộ nhớ cache cho đến khi có người cập nhật lại menu.

Phiên bản cập nhật

Cảm ơn @helgatheviking vì đã chỉ ra một lỗi giữa sên và ID. Tôi đã cập nhật các chức năng để nó hoạt động cả với theme_positionmenu (cho một cuộc gọi trực tiếp của menu).

Các menu luôn được lưu với tên của Menu, không phải vị trí trong Theme.

7
fischi

Sử dụng một lớp cơ sở dữ liệu được cắt tỉa để tối ưu hóa. Chúng tôi đã tạo ra những trải nghiệm tốt với mã riêng để giảm mức sử dụng bộ nhớ và tốc độ truy cập cơ sở dữ liệu. Bên cạnh đó, bạn có thể tự tối ưu hóa cấu trúc cơ sở dữ liệu bằng một số thay đổi nhỏ cũng làm rất nhiều.

Một phần của mã lớp cơ sở dữ liệu có thể được tìm thấy trong trac wordpress, nó không biến nó thành cốt lõi ( Vé số 11799 và có liên quan ).

5
hakre

Đối với một trang web bị buôn bán nhiều, bạn nên điều chỉnh tất cả các bộ đệm MySQL cho nội dung hiện có. Bất kể phiên bản nào của WordPress, lớp MySQL có thể được tính toán cấu hình của nó .

Trong thực tế, nếu bạn có dữ liệu InnoDB mà không bật innodb_file_per_table, bạn cần dọn sạch InnoDB bằng cách phân đoạn mỗi bảng thành không gian bảng vật lý của riêng nó . Có thể thực hiện điều chỉnh MySQL tốt ngay cả khi bạn có phần cứng hạn chế . Có nhiều kịch bản để thực hiện tối ưu hóa InnoDB như vậy .

IMHO, bạn không thể lập kế hoạch cài đặt tốt cho my.cnf mà không biết lượng dữ liệu cần định cấu hình. Bạn sẽ phải định kỳ tải một tập dữ liệu hiện tại từ sản xuất vào môi trường dàn dựng, thực hiện tối ưu hóa và đi kèm với các số để định cấu hình trong my.cnf của máy chủ sản xuất.

4
RolandoMySQLDBA

Gần đây tôi đã nói về chủ đề này tại WordCamp Houston . Tất cả các khuyến nghị ở trên đều tuyệt vời và điều quan trọng là đảm bảo tất cả các công cụ mặt trước được tối ưu hóa hoàn toàn sau đó bạn có thể bắt đầu làm việc với các vấn đề về hiệu năng của bộ đệm và máy chủ.

Kết xuất tiến bộ sẽ làm cho các trang của bạn cảm thấy nhanh hơn vì người dùng sẽ thấy nội dung trang trước khi nó được tải đầy đủ. Để làm điều này, đảm bảo rằng bất kỳ js chặn nào ở dưới cùng của trang và css ở trên cùng.

Ngoài ra, nếu bạn sử dụng nhiều nút phương tiện truyền thông xã hội, bạn có thể tùy chỉnh các tập lệnh để làm cho chúng tải trong iframe sau khi trang được tải đầy đủ. Tôi đã viết một hướng dẫn về cách thực hiện với nút TweetMeMe re Tweet (hiện đã lỗi thời kể từ khi Twitter phát hành nút r tweet của riêng họ) nhưng vẫn có thể được áp dụng cho các nút chia sẻ khác.

Đối với hiệu suất máy chủ, hãy xem Nginx như một proxy phía trước cho nội dung tĩnh với Apache xử lý việc nặng PHP và nâng MySQL.

3
Chris_O

bạn có thể kích hoạt nén toàn cầu đầu ra . điều này sẽ gzip mọi thứ sẽ tự động tắt nếu trình duyệt hỗ trợ nó. Điều này làm giảm đáng kể kích thước của các tệp được truyền, nhưng không làm tăng tải CPU của bạn.

3
Scott M.

Do chưa có ai đề cập đến nó, một trong những bước quan trọng nhất để nâng cao hiệu suất của máy chủ kết hợp với bất kỳ thiết lập LAMP nào sẽ là chuyển sang luồng công nhân Apache và mod_fcgid.

Điều này giải phóng 500 MB bộ nhớ trên máy chủ riêng ảo của tôi.

2
nottinhill

Hướng dẫn kiểm tra plugin chậm lại

Có một plugin rất đơn giản được gọi là Thời gian tải trang , thêm bộ đếm thời gian vào chân trang của bạn. Nó thực sự chỉ có bốn dòng mã:

<?php
function ur_pageload_footer() {
    printf(__('Page in %s seconds', 'pageload'), timer_stop());
}
add_action('wp_footer', 'ur_pageload_footer')

Sau đó:

  1. Tạo một bảng tính
  2. Liệt kê tất cả các plugin đang hoạt động của bạn và đặt chúng vào đó
  3. Làm mới trang ba lần lưu ý thời gian tải trang mỗi lượt
  4. Lần lượt đi qua các plugin của bạn để tắt chúng
  5. Lặp lại bước 3
  6. Lưu ý thứ tự bạn đã hủy kích hoạt plugin

Bảng tính của bạn sẽ trông giống như

+-------+-------+-------+-------+--------+
| Run 1 | Run 2 | Run 3 | Order | Plugin |

Vì vậy, nếu sau khi tắt plugin, thời gian phản hồi của trang tăng lên đáng kể thì bạn có thể xem liệu bạn có thể tránh plugin đó không.

Tôi đã tìm thấy hai plugin gây chậm 'đáng kể' mqtranslate và (khá cũ nhưng tốt) Plugin điều hướng đa cấp .

1
icc97