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 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>
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/