Optimieren Sie Apache für 10K + WordPress-Aufrufe pro Tag auf 2 GB RAM E6500-CPU

10

Ich habe einen dedizierten Server mit Apache / PHP auf Ubuntu, der mein Wordpress-Blog mit mehr als 10.000 Seitenaufrufen pro Tag bedient. Ich habe W3TC Plug-In mit APC installiert.

Aber hin und wieder reagiert der Server nicht mehr oder geht sehr langsam und ich muss Apache neu starten, um es zurückzubekommen.

Hier ist meine Konfiguration, was mache ich falsch?

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/
Pleite Künstler
quelle

Antworten:

23

Mein WordPress-Performance- und Caching-Stack

Dies ist ein großartiger WordPress-Leistungsstapel für einen einzelnen Server oder VPS mit niedriger bis mittlerer Reichweite. Ich klassifiziere den mittleren Bereich als Single Core mit etwa 1 GB Speicher und ziemlich schnellen Laufwerken.

Auf Ihrer Box können über 10.000 Seitenaufrufe pro Stunde ausgeführt werden

Server Stack

  • Linux - Entweder Debian Lenny oder Ubuntu
  • Nginx - Konfiguriert als statischer Reverse-Proxy-Datei-Cache
  • Apache - Apache verarbeitet das von Nginx ausgelagerte PHP an einem alternativen Port
  • MySql - Wird von WP benötigt, stellen Sie sicher, dass Sie die neueste stabile Version ausführen
  • PHP - Neueste stabile Version von 5.2 oder 5.3 Branch

PHP-Cache

  • APC - Konfigurieren Sie es mit mmap-Speicher und einer shm-Größe von mindestens 128 MB

WordPress Performance Plugin Stack

  • Nginx-Proxy-Cache-Integrator
  • W3 Total Cache - Setzt den Seitencache auf Festplatte erweitert, auf Festplatte verkleinern und Objekt und Datenbank auf APC.
  • Selbst gehostetes CDN - Erstellen Sie 4 cname-Aliase, die auf die Domäne auf dem Server verweisen, der nur für die Bereitstellung statischer Dateien eingerichtet wurde

Mit W3 Total Cache verwenden wir Festplatten für den Seiten-Cache und minimieren, da Nginx unsere statischen Dateien sehr schnell bereitstellen wird.

So konfigurieren Sie Nginx für die Bereitstellung statischer Dateien und die Übergabe von PHP an Apache

Das Problem bei der Verwendung von Apache allein ist, dass es eine Verbindung öffnet und bei jeder Anfrage auf PHP trifft, selbst für statische Dateien. Dadurch werden Verbindungen verschwendet, da Apache sie offen hält und wenn Sie viel Verkehr haben, werden Ihre Verbindungen blockiert, selbst wenn sie nicht verwendet werden.

Standardmäßig wartet Apache auf Anforderungen an Port 80, dem Standard-Webport. Zuerst werden wir Änderungen an unseren Apache Conf- und Virtual Hosts-Dateien vornehmen, um Port 8080 abzuhören.

Apache Config

httpd.conf

Schalten Sie KeepAlive aus

ports.conf

NameVirtualHost *:8080
Listen 8080

Virtueller Host pro Standort

<VirtualHost 127.0.0.1:8080>
     ServerAdmin [email protected]
     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>

Sie sollten auch mod_rpaf installieren, damit Ihre Protokolle die tatsächlichen IP-Adressen Ihrer Besucher enthalten. Wenn nicht, haben Ihre Protokolle 127.0.0.1 als ursprüngliche IP-Adresse.

Nginx Config

Unter Debian können Sie die Repositorys zur Installation verwenden, sie enthalten jedoch nur Version 0.6.33. Um eine spätere Version zu installieren, müssen Sie die Lenny-Backports-Pakete hinzufügen

$ nano /etc/apt/sources.list

Fügen Sie diese Zeile der Datei hinzu deb http://www.backports.org/debian lenny-backports main

$ nano /etc/apt/preferences

Fügen Sie der Datei Folgendes hinzu:

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

Geben Sie die folgenden Befehle ein, um den Schlüssel von backports.org zu importieren, um Pakete zu überprüfen und die Paketdatenbank Ihres Systems zu aktualisieren:

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

Jetzt mit apt-get installieren

apt-get install nginx

Dies ist viel einfacher als das Kompilieren aus dem Quellcode.

Nginx conf und Serverdateien config

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/*;
}

Jetzt müssen Sie Ihr virtuelles Nginx-Hosting einrichten. Ich verwende gerne die Sites-fähige Methode für jedes v Host-Sym, das mit einer Datei im Sites-Available-Verzeichnis verknüpft ist.

$ 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

default.conf

Hinweis:

Die statischen Cache-Einstellungen in den folgenden Dateien funktionieren nur, wenn das Nginx-Proxy-Cache-Integrator-Plugin aktiviert ist.

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;
}

Pro WordPress-Site conf (Für mehrere Sites benötigen Sie nur einen 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;
        }

        }

Selbst gehostete CDN conf

Für Ihre selbst gehostete CDN-Konfiguration müssen Sie sie nur so einrichten, dass statische Dateien ohne Proxy-Pass bereitgestellt werden

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;
        }

    }

Starten Sie nun die Server

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

Die Benchmark-Ergebnisse

Auf Apache Bench kann dieses Setup theoretisch 1833,56 Anforderungen pro Sekunde bedienen

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

Alt-Text

Chris_O
quelle
Sie erwähnen, dass Nginx statische Dateien und Apache PHP-Dateien verarbeitet, aber im Block für statische Dateien haben Sie "proxy_pass wordpressapache ;". Bedeutet das nicht, dass Apache die statischen Dateien verarbeitet?
Srchulo
0

Das sieht aus wie eine Standard-Apache-Konfiguration, obwohl es den Anschein hat, dass ein Teil davon entfernt wurde, weil es wie HTML aussieht.

Sie müssen untersuchen, was passiert, wenn Ihr Server langsam reagiert. Sie sagen nicht die Spezifikationen Ihres Servers, aber Sie erwähnen, dass seine dedizierten und 10.000 / Tag leicht zu handhaben sein sollten.

  • Was zeigt Top?
  • Wo ist der Engpass? CPU, Speicher, E / A Warten?
  • Wie viele Apache-Prozesse werden ausgeführt?
  • Wie viele Verbindungen werden in netstat angezeigt?

Vermutlich ist die CPU wahrscheinlich der durch PHP verursachte Engpass. Die Verwendung von APC und eines WP-Caching-Plugins sind gute Methoden, um dies zu beheben, was Sie bereits getan haben. Sie können auch das "MPM" -Prozessmodell von Apache anstelle von "Prefork" ausprobieren. Stellen Sie sicher, dass APC genügend Speicher zugewiesen ist, damit Ihre PHP-Skripte zwischengespeichert werden können und nicht "verpasst" werden.

Es könnte auch MySQL sein - sehen Sie, ob das die CPU oder die Festplatte belastet.

Deaktivieren Sie mod_deflate, wenn Sie es aktiviert haben. Es bietet Vorteile für die Ladezeiten, kann jedoch die CPU-Auslastung erhöhen. Könnte einen Versuch wert sein.

Verwenden Sie ein Tool wie "Belagerung" oder "ab", um Ihren Server zu bewerten und herauszufinden, an welchem ​​Punkt Ihr Server langsamer wird.

Hier sind einige meiner Lesezeichen aus der Leistungsoptimierung des Webservers: http://articles.slicehost.com/2010/5/19/configuring-the-apache-mpm-on-ubuntu

http://www.thebuzzmedia.com/increase-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/

Mein ursprünglicher Rat bleibt jedoch derselbe - finden Sie zuerst heraus, was der Engpass ist! Andernfalls versuchen Sie blind, die Leistung zu verbessern (und sicher ist eine Leistungsverbesserung immer gut), ohne jedoch zu wissen, auf welchen Bereich Sie Ihre Aufmerksamkeit richten müssen.

Rafiq Maniar
quelle
0

Aktivieren Sie auch das Serverstatusmodul und besuchen Sie dieses, um herauszufinden, was passiert.

Sie könnten tauschen. Haben Sie vmstat währenddessen ausgecheckt? 2 GB RAM für 80 MaxClients sind jeweils nur 25 MB (vorausgesetzt, die Box macht nichts anderes). Ihre MaxClients sind möglicherweise zu hoch. Die Lösung hierfür liegt auf der Hand: Fügen Sie mehr RAM oder weniger MaxClients hinzu. Wenn die Befehlszeile beim Neustart von Apache nur langsam reagiert, ist dies ein Hinweis auf diese Situation.

Es ist auch möglich, dass Sie einige mobile Clients (oder andere Clients mit langsamen Verbindungen) mit "großen" Dateien versorgen, wodurch alle verfügbaren Apache-Slots belegt werden. Vielleicht haben Sie zu wenige MaxClients. Wenn Sie den Serverstatus überprüfen, erfahren Sie, was jeder dieser Clients zu diesem Zeitpunkt tut. Eine Lösung für diese Situation besteht darin, MaxClients zu erhöhen (dies kann sich jedoch auch in der obigen Situation niederschlagen). Eine bessere Lösung hierfür ist die Installation eines HTTP-Beschleunigers vor Apache (eine kostenlose Option ist perlbal.) Wenn Ihre Befehlszeile normal ist Geschwindigkeit, wenn Sie Apache neu starten, ist dies ein Hinweis auf diese Situation.

gestürzter Wagen
quelle
0

Mit mod_status können Sie sehen, was in den mehreren Apache-Instanzen vor sich geht. Beachten Sie jedoch, dass dies die Leistung erheblich beeinträchtigt. Es scheint Speicher zu verbrauchen, und in einem Fall konnte ich nicht diagnostizieren, ob dies die Ursache für einzelne Prozesssperren in einer Nur-Reverse-Proxy-Einstellung war, in der nichts direkt bereitgestellt wurde. Diese werden von Benutzern natürlich als "das Laden der Seite dauert ewig" gemeldet. Sie verstehen nicht einmal den Unterschied zwischen "es hätte noch 10 Sekunden gedauert, um zu warten" und "es wird nie zu Ende sein", da sie normalerweise nach einigen (<10) Sekunden in ihrem Browser auf Stopp klicken.

Überprüfen Sie auch, ob Sie den richtigen Ort konfigurieren (mit mod_status leicht zu erkennen, da Sie die Anzahl der Instanzen / Prozesse sehen). Die Standardkonfiguration hat zumindest unter Ubuntu ifdef'ed-Abschnitte pro MPM-Modus und es ist einfach, den Worker-Modus zu bearbeiten, wenn Sie Prefork ausführen (wie durch herkömmliche Weisheit aus dem unscharfen Gefühl vorgeschlagen, dass PHP nicht threadsicher ist).

Oh und vor allem: Laufen Sie oben als Wurzel und achten Sie auf maximale Ressourcen. Speicher, Disc, CPU - Sie werden sehen.

Noch eine: Die Idee, mod_deflate zu deaktivieren, ist möglicherweise gut, obwohl Ihre Einstellung nicht anfällig für den Fehler falscher Informationen zur Inhaltslänge ist, die dazu führen, dass der Browser "für immer" auf Daten wartet und Sie Berichte über "absolut langsam" bis "nicht antworten" erhalten.

Übrigens: 10.000 gelieferte Seiten pro Tag plus Mediendateien auf diesem Computer sollten nur dann ein Problem sein, wenn sie alle innerhalb einer Stunde besucht werden.

Paul
quelle
0

Einige Ratschläge, insbesondere wenn Sie viele Mediendateien hosten:

  • Verschieben Sie Ihre Medien in eine dedizierte Apache-Instanz (oder besser: nginx). Kein PHP, keine Module, nur ein nackter http-Server, der Medien so schnell wie möglich liefert.
  • Cache, Cache, Cache! Verwenden Sie das Super-Cache-Plugin in WordPress. Es hilft sehr.
  • Überprüfen Sie Ihre Apache-Konfiguration in den Headern. Stellen Sie sicher, dass für Bilder und andere "stabile" Medien eine Ablaufzeit auf ein entferntes Datum festgelegt ist und dass Ihr Apache auf Anforderung von Clients einen HTTP 304-Code zurückgibt
  • Aktivieren Sie mod_deflate. Es kann die Leistung von Kunden reduzieren, die schneller bedient werden.
Pierre-Yves Gillier
quelle