Tối ưu hóa apache cho 10K + lượt xem wordpress mỗi ngày trên CPU 2GB RAM E6500


10

Tôi có một máy chủ chuyên dụng với apache / php trên ubfox phục vụ blog Wordpress của tôi với khoảng 10K + lượt xem trang mỗi ngày. Tôi đã cài đặt W3TC với APC.

Nhưng thỉnh thoảng máy chủ ngừng phản hồi hoặc chết chậm và tôi phải khởi động lại apache để lấy lại.

Đây là cấu hình của tôi, tôi đang làm gì sai?

ServerRoot "/etc/apache2"
LockFile /var/lock/apache2/accept.lock
PidFile ${APACHE_PID_FILE}
TimeOut 40
KeepAlive on
MaxKeepAliveRequests 200
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
  StartServers 5
  MinSpareServers 5
  MaxSpareServers 8
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild 1000
</IfModule>
<IfModule mpm_worker_module>
  StartServers       3
  MinSpareServers    3
  MaxSpareServers    3
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild  1000
</IfModule>
<IfModule mpm_event_module>
  StartServers       3
  MinSpareServers    3
  MaxSpareServers    3
  ServerLimit        80
  MaxClients         80
  MaxRequestsPerChild  1000
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy all
</Files>
DefaultType text/plain
HostnameLookups Off
ErrorLog /var/log/apache2/error.log
LogLevel error
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined
Include /etc/apache2/conf.d/
Include /etc/apache2/sites-enabled/

Câu trả lời:


23

Hiệu suất WordPress và bộ nhớ đệm của tôi

Đây là một ngăn xếp hiệu suất WordPress tuyệt vời cho một máy chủ hoặc VPS tầm thấp đến trung bình. Tôi đang phân loại tầm trung là lõi đơn với bộ nhớ khoảng 1G và ổ đĩa khá nhanh.

Trên hộp của bạn, điều này sẽ có khả năng phục vụ hơn 10 nghìn lượt xem trang mỗi giờ

Ngăn xếp máy chủ

  • Linux - Hoặc Debian Lenny hoặc Ubuntu
  • Nginx - Được định cấu hình như bộ đệm ẩn tệp proxy ngược
  • Apache - Apache sẽ xử lý PHP được Nginx giảm tải trên một cổng thay thế
  • MySql - Được yêu cầu bởi WP, hãy đảm bảo bạn đang chạy phiên bản ổn định mới nhất
  • PHP - Phiên bản ổn định mới nhất của chi nhánh 5.2 hoặc 5.3

Bộ nhớ cache PHP

  • APC - Định cấu hình nó với bộ nhớ mmap và kích thước shm tối thiểu 128M

Ngăn xếp hiệu suất WordPress

  • Bộ tích hợp bộ đệm proxy Nginx
  • W3 Total Cache - Đặt bộ đệm trang vào đĩa được tăng cường, thu nhỏ vào đĩa, và đối tượng và db thành APC.
  • CDN tự lưu trữ - Tạo 4 bí danh tên trỏ trỏ đến tên miền trên máy chủ được thiết lập chỉ để phục vụ tệp tĩnh

Với W3 Total Cache, chúng tôi đang sử dụng đĩa cho bộ đệm trang và giảm thiểu vì Nginx sẽ phục vụ các tệp tĩnh của chúng tôi rất nhanh.

Cách định cấu hình Nginx để phục vụ các tệp tĩnh và truyền PHP cho Apache

Vấn đề với việc sử dụng Apache một mình là nó mở ra một kết nối và truy cập php vào mọi yêu cầu ngay cả đối với các tệp tĩnh. Điều này làm lãng phí các kết nối vì Apache sẽ giữ cho chúng mở và khi bạn có nhiều lưu lượng, các kết nối của bạn sẽ bị làm chậm ngay cả khi chúng không được sử dụng.

Theo mặc định, Apache lắng nghe các yêu cầu trên cổng 80 là cổng web mặc định. Đầu tiên chúng ta sẽ thực hiện các thay đổi đối với các tệp tin conf và máy chủ ảo Apache để nghe trên cổng 8080.

Cấu hình Apache

httpd.conf

đặt KeepAlive thành tắt

cổng.

NameVirtualHost *:8080
Listen 8080

Máy chủ ảo trên mỗi trang web

<VirtualHost 127.0.0.1:8080>
     ServerAdmin info@yoursite.com
     ServerName yoursite.com
     ServerAlias www.yoursite.com
     DocumentRoot /srv/www/yoursite.com/public_html/
     ErrorLog /srv/www/yoursite.com/logs/error.log
     CustomLog /srv/www/yoursite.com/logs/access.log combined
</VirtualHost>

Bạn cũng nên cài đặt mod_rpaf để nhật ký của bạn sẽ chứa địa chỉ IP thực của khách truy cập. Nếu không nhật ký của bạn sẽ có 127.0.0.1 làm địa chỉ IP ban đầu.

Cấu hình Nginx

Trên Debian bạn có thể sử dụng kho để cài đặt nhưng chúng chỉ chứa phiên bản 0.6.33. Để cài đặt phiên bản mới hơn, bạn phải thêm các gói backport lenny

$ nano /etc/apt/sources.list

Thêm dòng này vào tập tin deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Thêm vào đây vào tập tin:

Package: nginx
Pin: release a=lenny-backports 
Pin-Priority: 999

Ban hành các lệnh sau để nhập khóa từ backports.org để xác minh các gói và cập nhật cơ sở dữ liệu gói của hệ thống của bạn:

$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update

Bây giờ cài đặt với apt-get

apt-get install nginx

Điều này dễ dàng hơn nhiều so với biên dịch từ nguồn.

Cấu hình tập tin và máy chủ của Nginx

nginx.conf

user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;
    client_body_temp_path /var/lib/nginx/body 1 2;
    gzip_buffers 32 8k;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;

  gzip_comp_level   6;
  gzip_http_version 1.0;
  gzip_min_length   0;
  gzip_types        text/html text/css image/x-icon
        application/x-javascript application/javascript text/javascript application/atom+xml application/xml ;



    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Bây giờ bạn sẽ cần phải thiết lập lưu trữ ảo Nginx của bạn. Tôi muốn sử dụng phương thức kích hoạt trang web với mỗi sym host v được liên kết với một tệp trong thư mục có sẵn của trang web.

$ mkdir /etc/nginx/sites-available  
$ mkdir /etc/nginx/sites-enabled
$ touch /etc/nginx/sites-available/yourservername.conf
$ touch /etc/nginx/sites-available/default.conf
$ ln -s  /etc/nginx/sites-available /etc/nginx/sites-enabled
$ nano /etc/nginx/sites-enabled/default.conf

mặc định

Ghi chú:

Cài đặt bộ đệm tĩnh trong các tệp sau sẽ chỉ hoạt động nếu plugin tích hợp bộ đệm bộ đệm proxy Nginx được bật.

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:180m  max_size=500m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;

#IMPORTANT - this sets the basic cache key that's used in the static file cache.
proxy_cache_key "$scheme://$host$request_uri";

upstream wordpressapache {
        #The upstream apache server. You can have many of these and weight them accordingly,
        #allowing nginx to function as a caching load balancer 
        server 127.0.0.1:8080 weight=1 fail_timeout=120s;
}

Trên mỗi trang web WordPress conf (Đối với nhiều trang web, bạn sẽ chỉ cần một vhost)

server {
        #Only cache 200 responses, and for a default of 20 minutes.
        proxy_cache_valid 200 20m;

        #Listen to your public IP
        listen 80;

        #Probably not needed, as the proxy will pass back the host in "proxy_set_header"
        server_name www.yoursite.com yoursite.com;
        access_log /var/log/nginx/yoursite.proxied.log;  

        # "combined" matches apache's concept of "combined". Neat.
        access_log  /var/log/apache2/nginx-access.log combined;
        # Set the real IP.
        proxy_set_header X-Real-IP  $remote_addr;

        # Set the hostname
        proxy_set_header Host $host;

        #Set the forwarded-for header.
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
                        # If logged in, don't cache.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location ~* wp\-.*\.php|wp\-admin {
                        # Don't static file cache admin-looking things.
                        proxy_pass http://wordpressapache;
        }

        location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                        # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                        # whether logged in or not (may be too heavy-handed).
                        proxy_cache_valid 200 120m;
                        expires 864000;
                        proxy_pass http://wordpressapache;
                        proxy_cache staticfilecache;
        }

        location ~* \/[^\/]+\/(feed|\.xml)\/? {
 # Cache RSS looking feeds for 45 minutes unless logged in.
                        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
                                set $do_not_cache 1;
                        }
                        proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
                        proxy_cache_valid 200 45m;
                        proxy_cache staticfilecache;
                        proxy_pass http://wordpressapache;
        }

        location = /50x.html {
                root   /var/www/nginx-default;
        }

        # No access to .htaccess files.
        location ~ /\.ht {
                deny  all;
        }

        }

CDN tự lưu trữ

Đối với CDN tự lưu trữ của bạn, bạn chỉ cần thiết lập nó để phục vụ các tệp tĩnh mà không cần qua proxy

server {

        proxy_cache_valid 200 20m;
        listen 80;
        server_name yourcdndomain.com;
        access_log   /srv/www/yourcdndomain.com/logs/access.log;
        root   /srv/www/yourcdndomain.com/public_html/;

 proxy_set_header X-Real-IP  $remote_addr;

      location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
                                # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
                                # whether logged in or not (may be too heavy-handed).

                                proxy_cache_valid 200 120m;
                        expires 7776000;
                        proxy_cache staticfilecache;
                }

location = /50x.html {
                root   /var/www/nginx-default;
        }

 # No access to .htaccess files.
        location ~ /\.ht {
          deny  all;
        }

    }

Bây giờ bắt đầu các máy chủ

$ /etc/init.d/apache2 restart  
$/etc/init.d/nginx start

Kết quả điểm chuẩn

Trên băng ghế dự bị Apache, thiết lập này về mặt lý thuyết có thể phục vụ 1833,56 yêu cầu mỗi giây

$ ab -n 1000 -c 20 http://yoursite.com/

văn bản thay thế


Bạn đề cập đến việc nginx xử lý các tệp tĩnh và apache xử lý các tệp php, nhưng trong khối tệp tĩnh, bạn có "proxy_pass wordpressapache ;". Điều đó không có nghĩa là apache đang xử lý các tệp tĩnh?
srchulo

0

Trông giống như một cấu hình Apache tiêu chuẩn mặc dù có vẻ như một số cấu hình đã bị loại bỏ do nó trông giống như HTML.

Bạn cần điều tra những gì đang xảy ra khi máy chủ của bạn phản hồi chậm. Bạn không nói thông số kỹ thuật của máy chủ của mình nhưng bạn đề cập đến chuyên dụng của nó và 10k / ngày nên được xử lý dễ dàng.

  • Top hiển thị những gì?
  • Nút thắt ở đâu? CPU, bộ nhớ, I / O Chờ?
  • Có bao nhiêu quy trình Apache đang chạy?
  • Có bao nhiêu kết nối hiển thị trong netstat?

Đoán, CPU có lẽ là nút cổ chai do PHP gây ra. Sử dụng APC và plugin bộ nhớ đệm WP là những phương pháp tốt để giảm bớt điều này, điều mà bạn đã thực hiện. Bạn cũng có thể thử mô hình quy trình "MPM" của Apache thay vì "Prefork". Hãy chắc chắn rằng bạn có đủ bộ nhớ được phân bổ cho APC để nó có thể lưu trữ các tập lệnh PHP của bạn và không 'bỏ lỡ'.

Nó cũng có thể là MySQL - xem điều đó có làm hỏng CPU hoặc đĩa không.

Cân nhắc tắt mod_deflate nếu bạn đã bật nó - nó mang lại lợi ích cho thời gian tải, nhưng có thể tăng tải CPU. Có thể đáng để thử.

Sử dụng một công cụ như 'bao vây' hoặc 'ab' để điểm chuẩn máy chủ của bạn và tìm ra điểm nào máy chủ của bạn chậm lại.

Đây là một số dấu trang của tôi từ điều chỉnh hiệu suất máy chủ web: http://articles.slicehost.com/2010/5/19/configuring-the-apache-mpm-on-ubfox

http://www.thebuzzmedia.com/increas-wordpress-performance-on-apache-with-worker-mpm-php-and-mod_fcgid/

http://www.devside.net/articles/apache-performance-tuning

http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/

Nhưng lời khuyên ban đầu của tôi vẫn giữ nguyên - tìm hiểu xem nút cổ chai là gì trước tiên! Mặt khác, bạn đang mù quáng cố gắng cải thiện hiệu suất (và chắc chắn, cải thiện hiệu suất luôn tốt) nhưng không biết nên tập trung vào lĩnh vực nào.


0

Đồng thời kích hoạt mô-đun trạng thái máy chủ và truy cập vào đó để tìm hiểu điều gì đang xảy ra.

Bạn có thể trao đổi. Bạn đã kiểm tra vmstat trong khi điều này đang xảy ra? 2GB RAM cho 80 MaxCl Client chỉ có 25 MB cho mỗi (giả sử hộp không làm gì khác.) MaxCl Client của bạn có thể quá cao. Giải pháp cho điều này là rõ ràng: thêm nhiều RAM hoặc MaxCl Client thấp hơn. Nếu dòng lệnh chậm phản hồi khi bạn khởi động lại apache, đó là một dấu hiệu của tình huống này.

Cũng có thể bạn đang cho ăn một số máy khách di động (hoặc các máy khách khác trên các kết nối chậm) với các tệp 'lớn' do đó tiêu thụ tất cả các khe cắm apache có sẵn của bạn. Có thể bạn có quá ít MaxCl Client. Kiểm tra trạng thái máy chủ sẽ cho bạn biết mỗi khách hàng đang làm gì vào thời điểm đó. Một giải pháp cho tình huống này là tăng MaxClents (nhưng cũng có thể chuyển sang tình huống ở trên.) Một giải pháp tốt hơn cho việc này là cài đặt bộ tăng tốc HTTP trước apache (một tùy chọn miễn phí là perlbal.) Nếu dòng lệnh của bạn bình thường tốc độ khi bạn khởi động lại apache, đó là một dấu hiệu của tình huống này.


0

Sử dụng mod_status là cách để xem những gì đang diễn ra bên trong nhiều phiên bản Apache nhưng xin lưu ý rằng nó sẽ thực sự làm giảm hiệu suất. Nó dường như ăn bộ nhớ và trong một trường hợp tôi không thể chẩn đoán liệu đó có phải là nguyên nhân dẫn đến khóa đơn trong một cài đặt chỉ có proxy ngược trong đó không có gì được phục vụ trực tiếp. Tất nhiên những điều này được người dùng báo cáo là "phải mất mãi mãi để tải trang". Họ thậm chí không hiểu sự khác biệt giữa "sẽ còn 10 giây nữa để chờ" và "nó sẽ không bao giờ kết thúc" vì họ thường nhấn Stop trong trình duyệt của họ sau vài (<10) giây.

Đồng thời kiểm tra xem bạn có đang định cấu hình đúng vị trí không (dễ thấy bằng cách sử dụng mod_status vì bạn thấy số lượng phiên bản / quy trình). Cấu hình stock ít nhất là trong Ubuntu có các phần được định nghĩa cho mỗi chế độ MPM và thật dễ dàng để chỉnh sửa chế độ worker khi bạn đang chạy prefork (như được gợi ý bởi sự khôn ngoan thông thường từ một cảm giác mờ nhạt rằng PHP không phải là chủ đề an toàn).

Ồ và hầu hết tất cả: Chạy trên đỉnh với quyền root và xem các nguồn tài nguyên tối đa. Bộ nhớ, đĩa, CPU - bạn sẽ thấy.

Thêm một điều nữa: Ý tưởng hủy kích hoạt mod_deflate có thể tốt mặc dù cài đặt của bạn không dễ bị lỗi thông tin Độ dài nội dung không chính xác khiến trình duyệt chờ dữ liệu "mãi mãi" cung cấp cho bạn các báo cáo "chết chậm" để "không phản hồi".

BTW: 10K trang được phân phối mỗi ngày cộng với các tệp phương tiện trên máy này chỉ là vấn đề nếu tất cả chúng truy cập trong một giờ.


0

Một số lời khuyên, đặc biệt nếu bạn lưu trữ nhiều tệp phương tiện:

  • Di chuyển phương tiện truyền thông của bạn đến một cá thể Apache (hoặc tốt hơn: nginx) chuyên dụng. Không có PHP, không có mô-đun, chỉ có một máy chủ http sẽ cung cấp phương tiện truyền thông nhanh nhất có thể.
  • Cache, cache, cache! Sử dụng plugin siêu cache trên wordpress. Nó giúp rất nhiều.
  • Kiểm tra cấu hình apache của bạn trên các tiêu đề. Xác minh rằng hình ảnh và các phương tiện truyền thông "ổn định" khác có thời gian hết hạn được đặt thành ngày ở xa & apache của bạn trả về mã HTTP 304 khi được khách hàng yêu cầu
  • Kích hoạt mod_deflate. Nó có thể làm giảm hiệu suất của khách hàng sẽ được phục vụ nhanh hơn.
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.