Magento Hosting mit Plesk 11.5, Apache, Nginx und Varnish Cache
Varnish ist ein sehr beliebter Seitencache für Webseiten.
Der Geschwindigkeitsvorteil kann je nach verwendeten Backend ein vielfaches betragen da Webseiten nicht bei jedem Abruf berechnet sondern statisch ausgeliefert werden.
Gerade im Bereich von Magento Hosting und Shop Hosting wird er sehr häufig eingesetzt.
Ich möchte hier einmal zeigen, wie man den Cache in einer Plesk Umgebung installiert.
Er wird als Daemon installiert und zwischen Webserver und Benutzer gehängt. Seiten werden entweder aus dem Cache geladen oder vom Webserver (Backend Server) abgerufen.
Um den Varnish im Plesk einzubinden sind einige Schritte erforderlich.
1. Installation des Varnish Caches
2. Erstellen einer custom Konfiguration im Plesk (CentOS: /usr/local/psa/admin/conf/templates/custom)
Installation des Varnish Caches für das Magento Hosting
Der Varnish Cache ist auf einem RH/CentOS sehr einfach installiert:
1 2 |
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-3.0.el6.rpm yum install varnish |
Dadurch wird der Varnish in der Version 3 installiert.
Vorsicht: Sofern andere Respoitory Varnish zur Verfügung stellen sollte mit yum priorities eine Reihenfolge festgelegt werden.
/etc/varnish/default.vcl:
1 2 3 4 |
backend default { .host = "127.0.0.1"; .port = "7080"; } |
/etc/sysconfig/varnish:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# Configuration file for varnish # # /etc/init.d/varnish expects the variable $DAEMON_OPTS to be set from this # shell script fragment. # # Maximum number of open files (for ulimit -n) NFILES=131072 # Locked shared memory (for ulimit -l) # Default log size is 82MB + header MEMLOCK=82000 # Maximum size of corefile (for ulimit -c). Default in Fedora is 0 # DAEMON_COREFILE_LIMIT="unlimited" # Set this to 1 to make init script reload try to switch vcl without restart. # To make this work, you need to set the following variables # explicit: VARNISH_VCL_CONF, VARNISH_ADMIN_LISTEN_ADDRESS, # VARNISH_ADMIN_LISTEN_PORT, VARNISH_SECRET_FILE, or in short, # use Alternative 3, Advanced configuration, below RELOAD_VCL=1 # # See varnishd(1) for more information. # # # Main configuration file. You probably want to change it :) VARNISH_VCL_CONF=/etc/varnish/default.vcl # # # Default address and port to bind to # # Blank address means all IPv4 and IPv6 interfaces, otherwise specify # # a host name, an IPv4 dotted quad, or an IPv6 address in brackets. #VARNISH_LISTEN_ADDRESS=127.0.0.1 VARNISH_LISTEN_PORT=6081 # # # Telnet admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 VARNISH_ADMIN_LISTEN_PORT=6082 # # # Shared secret file for admin interface VARNISH_SECRET_FILE=/etc/varnish/secret # # # The minimum number of worker threads to start VARNISH_MIN_THREADS=100 # # # The Maximum number of worker threads to start VARNISH_MAX_THREADS=2500 # # # Idle timeout for worker threads VARNISH_THREAD_TIMEOUT=120 # # # Cache file location VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin # # # Cache file size: in bytes, optionally using k / M / G / T suffix, # # or in percentage of available disk space using the % suffix. VARNISH_STORAGE_SIZE=10G # # # Backend storage specification #VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" VARNISH_STORAGE="malloc,2G" # # # Default TTL used when the backend does not specify one VARNISH_TTL=600 # # # DAEMON_OPTS is used by the init script. If you add or remove options, make # # sure you update this section, too. DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ -f ${VARNISH_VCL_CONF} \ -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ -t ${VARNISH_TTL} \ -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \ -u varnish -g varnish \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE} \ -p session_linger=50 \ -p cli_buffer=10000 \ -p sess_workspace=262144" |
Erstellen einer custom Konfiguration für Plesk
Damit der Webserver von Plesk die Daten vom Varnish abruft und nicht direkt vom Webserver ist eine Konfigurationserweiterung notwendig.
Plesk ist standardmäßig so konfiguriert, dass eingehende Verbindungen vom NGinx Reverseproxy entgegen genommen werden.
Nginx liefert lokale Dateien ggf. direkt aus und übergibt weiter Anfragen an den Apache Server, welcher i.d.R. auf Port 7080 horcht. Hier klinken wir uns ein und schieben dem System den Varnish Cache unter.
Im Ordner custom können eigene Konfigurationen abgelegt werden, die Plesk statt der eigenen verwendet.
Kopieren Sie die default/nginx.php aus dem default in den custom Ordner.
Bearbeiten Sie die Datei custom/nginx.php und fügen oben (Zeile 3) zwischen den beiden PHP Zeilen den upstream backend_varnish ein:
1 2 3 4 5 6 7 8 |
<?php echo AUTOGENERATED_CONFIGS; ?> upstream backend_varnish { server 127.0.0.1:6081; server [lokale ip adresse]:7080 backup; } <?php /** @var Template_VariableAccessor $VAR */ ?> |
[lokale ip adresse] ersetzen Sie bitte durch die Adresse, über die Ihre Webseite erreichbar ist.
Der Upstream Server dient nun als Deklaration, woher der NGinx seine Daten bekommen soll, sobald er als proxy_pass den Namen des Upstreams übergeben bekommen hat.
Sollte der Varnish Cache mal nicht Online sein, verwendet NGinx den Apache Server da dieser als Backup Verbindung hinterlegt ist.
Kopieren Sie die default/domain/service/proxy.php Datei in den custom/domain/service Ordner.
Bearbeiten Sie diese nun wie folgt (custom/domain/service/proxy.php):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php /** * @var Template_VariableAccessor $VAR * @var array $OPT */ ?> <?php if ($OPT['ssl']) { ?> proxy_pass https://<?php echo $OPT['ipAddress']->proxyEscapedAddress . ':' . $OPT['backendPort'] ?>; <?php } else { if (file_exists("/etc/varnish/".$VAR->domain->asciiName.".enable")) { ?> proxy_pass http://backend_varnish; <?php } else { ?> proxy_pass http://<?php echo $OPT['ipAddress']->proxyEscapedAddress . ':' . $OPT['backendPort'] ?>; <?php } ?> <?php } ?> proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; <?php if (!$VAR->domain->physicalHosting->proxySettings['nginxTransparentMode'] && !$VAR->domain->physicalHosting->proxySettings['nginxServeStatic']): ?> proxy_set_header X-Accel-Internal /internal-nginx-static-location; <?php endif ?> access_log off; |
An der file_exists Funktion läßt sich gut sehen, dass das Script erst prüft, ob eine Datei im /etc/varnish ordner liegt, die als Namen den Domainnamen gefolgt von .enable hat (z.B. lcube-webhosting.de.enable). Ist dies der Fall wird der Varnish aktiviert. Wenn nicht, werden die Dateien normal vom Webserver abgerufen. Auf diese Weise kann der Varnish durch setzen einer Datei aktiviert oder deaktiviert werden.
Nach dem setzen oder löschen der enable Datei muss
1 |
/usr/local/psa/admin/bin/httpdmng --reconfigure-all |
ausgeführt werden.
Ggf. muss ein Addon installiert werden. Für Magento kommt z.B. Turpentine in Frage.
Nicht für jede Anwendung ist der Varnish Cache geeignet. Wenn viele Dynamische Daten abgerufen werden und die Aktualität der Daten von entscheidender Bedeutung ist (z.B. bei Warenkörbe sowie beim SVN Hosting oder Git Hosting) sollte man entsprechende URLs in die Ausnahmen eintragen bzw. auf Varnish verzichten.