Shopware Knowledgebase

Shopware Labs

Der Bereich Shopware Labs ist die Plattform für alle Entwickler. Hier findet man technische Dokumentationen und zahlreiche Tipps und Tricks rund um das Thema Programmieren. In dieser Rubrik stellen außerdem die Entwickler der shopware AG neue und experimentelle Lösungsansätze vor. Neue Funktionen, die in dieser Rubrik bereitgestellt werden, sind teilweise auch für zukünftige Releases geplant. Die Funktionen können dann ohne Programmierkenntnisse zukünftig direkt im Shopware Backend konfiguriert werden oder werden über Plugins bereitgestellt. Informationen über neue, geplante Funktionen finden Sie in unserer Roadmap.

Bitte beachten Sie, dass die hier bereitgestellten Lösungsansätze nicht offiziell supportet werden und nur eingebaut werden sollten, sofern Sie über das entsprechende, technische Wissen verfügen.

Shopware mit Nginx / PHP-FPM / APC

1 Kommentare

Voraussetzungen

Die Einrichtung der Komponenten bezieht sich auf Linux-Systeme, in unserem Fall Debian Squeeze (6.0). Das ganze sollte sich aber ähnlich unter Ubuntu und anderen Debian-Deviraten umsetzen lassen.

Sie benötigen Root-Zugriff auf die Linux-Maschine!

Für Anregungen und Anleitungen für andere Linux-Varianten sind wir dankbar - einfach als Kommentar oder an forum@shopware.de schicken!

Sie können diese Schritte übrigens auch mit dem Shopware VMWare Image (http://wiki.shopware.de/Shopware-3.5-VMware-Image_detail_562.html) ausprobieren - dieses basiert im Augenblick allerdings noch auf Shopware 3.5.3 (Wird mit dem Erscheinen von 3.5.5 aktualisiert!)

Allgemeines

Das Bild zu diesem Artikel verrät es - wir wollen Shopware richtig Dampf machen und eine hochperformante Server-Konfiguration umsetzen.

Hier kann man im Prinzip mit wenig Aufwand eine Menge erreichen. Der Einsatz dieser Komponenten macht sich vor allem auf Systemen bemerkbar, die viel Traffic zu verarbeiten haben.

Was ist APC?

Die Alternative PHP Cache (APC) ist ein Open-Source-Zusatzmodul für PHP, das eine beschleunigte Ausführung von PHP-Programmen ermöglicht. Die Beschleunigung wird dadurch erreicht, dass der kompilierte PHP-Quelltext zwischengespeichert wird und bei wiederholter Ausführung das zeitaufwändige Kompilieren nahezu vollständig vermieden werden kann. [Quelle Wikipedia: http://de.wikipedia.org/wiki/Alternative_PHP_Cache]

APC kann natürlich auch losgelöst von den anderen Komponenten in diesem Tutorial eingesetzt werden und macht eigentlich immer Sinn. Dadurch entfällt das aufwendige Neu-Kompilieren der PHP-Quellen bei jedem Request, da diese im Arbeitsspeicher zwischengelagert werden.

Was ist PHP-FPM?

Bei php-fpm handelt es sich um einen PHP FastCGI Process Manager, der sich besonders für stark frequentierte Seiten eignet. Weiterführende Informationen erhält man auf der Homepage des Projektes. Erwähnt sei allerdings ein maßgeblicher Vorteil von FastCGI: die Isolierung der Skriptsprache vom Webserver, sprich der Gewinn von Sicherheit für das Webserver-Konstrukt. [Quelle: http://adminwerk.de/services/2011/nginx-php-fpm/]

Was ist Nginx?

Nginx (ausgesprochen engine-x) ist ein schmaler, modularer Webserver, der einen signifikant kleineren Footprint als Apache2 hat und sich somit optimal für High-Traffic-Shops eignet!

Benchmark Apache2 & Mod_PHP vs. Nginx / PHP-FPM / APC

Der Test wurde auf virtualisierter Hardware ausgeführt (Getestet auf einem Profihost Root-VServer Highend (http://www.profihost.com/virtualserver/vserver_highend/), die über keine feste Ressourcen-Zuordnung verfügt. Deshalb wurde jeder Test dreimal zu verschiedenen Tageszeiten ausgeführt - das Test-Ergebnis ist also der Mittelwert aus den Einzeltests.

Der Test stellt ein Last-Test-Szenario dar und ist von den Antwortzeiten nicht auf kleinere Shops übertragbar.

Verwendeter Aufruf:

ab -n 100 -c 5 -i http://www.shop.de

(100 Aufrufe mit fünf konkurrierenden Benutzern)

Die Prozent-Steigerung bezieht sich immer auf das Referenz-System mit Apache2 und Mod-PHP (Standard Debian Konfiguration)

  • Apache2 + Mod-PHP

Durchschnittliche Antwortzeit: 2345ms => 100 % Max. Antwort-Zeit: 51408ms => 100 %

  • Apache2 + Mod-PHP + APC

Durchschnittliche Antwortzeit: 1907ms => + 20 % Max. Antwort-Zeit: 7557ms => + 680 %

  • Nginx + PHP-FPM

Durchschnittliche Antwortzeit: 1749ms => + 25 % Max. Antwort-Zeit: 5263ms => + 961 %

  • Nginx + PHP-FPM + APC

Durchschnittliche Antwortzeit: 1750ms => + 25 % Max. Antwort-Zeit: 2500ms => + 2500 %

Ergebnis:

Der Einsatz von APC als Bytecache bringt einen sofortigen Performance-Gewinn zwischen 20 und 25 %, da der Shopware-Quellcode kompiliert im Arbeitsspeicher vorgehalten werden kann.

Die Kombination aus Nginx und PHP-FPM macht vor allem auf stark frequentierten Seiten Sinn, da hierdurch Lastspitzen abgefangen werden können und das System besser skaliert!

  • Getestet auf einem Profihost Root-VServer Highend (http://www.profihost.com/virtualserver/vserver_highend/)

Installation unter Debian Squeeze

Apache2 ausschalten

Apache2 deinstallieren

Stoppen Sie die laufenden Apache-Prozesse:

/etc/init.d/apache2 stop

Führen Sie folgende Befehle (Root-Rechte vorausgesetzt) auf der Shell aus:

apt-get remove apache2 [Enter]
apt-get remove apache2-mpm-prefork (or apache2-mpm-worker or apache2-mpm-event) [Enter]
apt-get remove apache2.2-common [Enter]
apt-get remove apache2-utils [Enter]

Apache2 auf einen anderen Port legen

Sie können Apache auch parallel zu Nginx betreiben - hier macht es Sinn, den Indianer auf einen anderen Port zu legen - damit Nginx über den Standard-HTTP-Port 80 erreichbar ist.

Öffnen Sie hierzu die /etc/apache2/ports.conf.

Ändern Sie die Port-Angabe bei den Paramemtern Listen und NameVirtualHost von 80 auf 8080

Speichern Sie die Datei und starten Sie den Apache neu. (/etc/init.d/apache2 restart)

Ggf. müssen Sie auch die Port-Einstellungen Ihrer Vhosts bearbeiten, diese finden Sie unter /etc/apache2/sites-enabled!

Installation Nginx

Nginx ist Teil des Debian Repositorys und lässt sich somit sehr einfach installieren.

apt-get install nginx [Enter]

Um die weitere Konfiguration kümmern wir uns später.

Installation PHP-FPM

Quelle: http://www.codernotes.com/2011/7/install-nginx-and-php-fpm-on-debian-6-squeeze-2/

Dotdeb Paket-Quellen hinzufügen

Zunächst fügen wir "Dotdeb" zu den lokalen Paket-Quellen hinzu. Dotdeb stellt aktuelle PHP- und MySQL-Versionen, sowie andere für den Webserver-Betrieb interessante Tools, bereit.

echo "deb http://packages.dotdeb.org stable all" >> /etc/apt/sources.list [Enter]
wget http://www.dotdeb.org/dotdeb.gpg [Enter]
cat dotdeb.gpg | apt-key add - [Enter]

Quellen aktualisieren und PHP-FPM installieren

apt-get update [Enter]
apt-get install php5-cli php5-suhosin php5-fpm php5-cgi [Enter]

Öffnen Sie die Default-Konfiguration unter /etc/php5/fpm/pool.d/www.conf

Ändern Sie die Variable pm=dynamic auf pm=static

Passen Sie die Variable pm.max_children an - setzen Sie hier den Wert 2 statt 4.

Anschließend können Sie PHP-FPM via /etc/init.d/php5-fpm start starten.

Installation APC

Installieren Sie die nachfolgenden Pakete:

apt-get install php5-dev make php5-pear [Enter]

Anschließend können Sie APC via pecl installieren.

pecl install apc [Enter]

Nachdem apc kompiliert und installiert worden ist, muss dieses in die aktuelle PHP-Konfiguration eingebunden werden.

touch /etc/php5/conf.d/apc.ini [Enter]
nano (oder anderer bevorzugter Editor) /etc/php5/conf.d/apc.ini [Enter]

Fügen Sie folgenden Code in die Konfigurationsdatei ein:

extension="apc.so"
apc.enabled=1
apc.mmap_file_mask="/tmp/apc.XXXXXX"
apc.shm_size=256M

Installation Ioncube (Optional)

Da Shopware in der aktuellen Version noch einige verschlüsselte Dateien einsetzt, muss das System Ioncube bereitstellen (Dieser Umstand entfällt mit Shopware 4 ;))

Für 32 Bit-Systeme

wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz [Enter]
tar xfvz ioncube_loaders_lin_x86.tar.gz [Enter]
cp ioncube/ioncube_loader_lin_5.3.so /usr/lib/php5/20060613+lfs/ioncube.so [Enter]
touch /etc/php5/conf.d/ioncube.ini [Enter]
nano /etc/php5/conf.d/ioncube.ini [Enter]

In die ioncube.ini fügen Sie nun folgendes ein:

zend_extension = ioncube.so

Achtung! Das PHP-Extension-Verzeichnis kann abweichen, in welchem Verzeichnis PHP seine Extensions verwaltet, können Sie via phpinfo() feststellen.

Für 64 Bit-Systeme

wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz [Enter]
tar xfvz ioncube_loaders_lin_x86-64.tar.gz [Enter]
cp ioncube/ioncube_loader_lin_5.3.so /usr/lib/php5/20060613+lfs/ioncube.so [Enter]
touch /etc/php5/conf.d/ioncube.ini [Enter]
nano /etc/php5/conf.d/ioncube.ini [Enter]

In die ioncube.ini fügen Sie nun Folgendes ein:

zend_extension = ioncube.so

Achtung! Das PHP-Extension-Verzeichnis kann abweichen, in welchem Verzeichnis PHP seine Extensions verwaltet, können Sie via phpinfo() feststellen.

Einrichtung Nginx für Shopware

Basis-Konfiguration Nginx

Wir gehen in diesem Beispiel davon aus, dass die Shopware-Installation im Verzeichnis /var/www liegt, sollte dem nicht so ein, können Sie die Pfade einfach anpassen!

Erstellen Sie ein Backup der Datei /etc/nginx/sites-enabled/default

cp /etc/nginx/sites-enabled/default /root/nginx-config-backup [Enter]

Löschen Sie die bestehende Nginx-Konfiguration und legen Sie eine neue Konfigurationsdatei an:

rm /etc/nginx/sites-enabled/default [Enter]
touch /etc/nginx/sites-enabled/default [Enter]

Öffnen Sie die Datei und fügen Sie folgenden Inhalt ein:

server {
	listen 80; # Listen to Port 80 
	server_name localhost; # Replace with Server-Name 
	access_log /var/log/nginx/localhost.access.log;
	
	location / {
		root /var/www; #Define doc-root
		include /var/www/shopware.conf; #Include shopware specific nginx rules
	}

	
	# Use php-fpm as fast-cgi backend for all .php files
	location ~ .php$ {
 		include /etc/nginx/fastcgi_params;
                fastcgi_pass  127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
	}
}

Abschließend müssen wir nun die Shopware-spezifische Nginx-Konfigurations-Datei anlegen, dazu mehr im nächsten Schritt!

Konvertierung der Shopware htaccess Regeln nach Nginx

Die .htaccess Regeln für Shopware sind für Apache2 konzipiert und lassen sich nicht 1 zu 1 auf Nginx adaptieren. Wir bieten hier aber eine passende Nginx-Konfiguration, die die bestehenden Regeln nachbildet.

Lege Sie die Datei /var/www/shopware.conf an

Inhalt:

# Shopware nginx rules 
# version 1.0
# date 09.08.2011 
# author Stefan Hamann <sth@shopware.de>

# Defining various options
	
	# Set DirectoryIndex
	index  shopware.php index.php;
	
	# Deny direct access to all smarty templates
	location ~ ^/templates/.*/*.tpl {
		deny all;
	}
	
	# Permit access to php files in web readable directories
	location ~ ^/cache/.*/*.(php|cgi|php5|php3|php4|phtml|pl|py) {
		deny all;
	}
	location ~ ^/images/.*/*.(php|cgi|php5|php3|php4|phtml|pl|py) {
		deny all;
	}
	location ~ ^/files/.*/*.(php|cgi|php5|php3|php4|phtml|pl|py) {
		deny all;
	}
	location ~ ^/upload/.*/*.(php|cgi|php5|php3|php4|phtml|pl|py) {
		deny all;
	}

# Defining rewrite rules
	rewrite /images/ayww/(.*) /images/banner/$1 last;
	rewrite /files/documents/.* /engine last;
	rewrite /templates/(.*(css|js))$ /engine/backend/php/sCacheTemplate.php?file=/templates/$1 last;
	rewrite /sitemap.xml(.*) /shopware.php?controller=SitemapXml;
	rewrite /application.yaml /engine last;
	rewrite /engine/core/php/sAjaxSearch.php$ /engine/backend/php/sAjaxSearch.php last;
	rewrite /engine/core/php/campaigns.php$ /engine/backend/php/campaigns.php last;

# Defining controller based route processing behaviour
	if (!-e $request_filename) {
		rewrite . /shopware.php last;
	}

Fertig ;) Nun müssen wir nginx nur noch neu starten...

/etc/init.d/nginx restart [Enter]

Jetzt sollte Shopware bereits funktionieren - falls es Probleme gibt, können Sie mich gerne ansprechen. Ansonsten helfen Ihnen ggf. auch die Error-Logs von Nginx weiter, diese finden Sie unter /var/log/nginx.

Bei Fragen oder Anregungen freue ich mich über Kommentare & Feedback!

Artikel-PDF erstellen

Artikel bewerten

Waren diese Informationen hilfreich? Ja Nein


Kommentare:

1 - 20. December 2011 - 13:24 Uhr

Von: Technikexpert

Diese Regel in shopware.conf blockt bei mir auch Hersteller-Bilder

location ~ ^/images/.*/*.(php|cgi|php5|php3|php4|phtml|pl|py) {
deny all;
}


*3579 access forbidden by rule, client: 93.218.184.193, server: xxx.com, request: "GET /images/supplier/036a36af82f2018b62995352610d5033.png HTTP/1.1", host: "www.xxx.com", referrer: "http://www.xxx.com/engine/backend/modules/supplier/hersteller.php?edit=1"

Artikel kommentieren


Die mit einem * markierten Felder sind Pflichtfelder.

Weitere interessante Artikel:

Bezeichnung:
Rating:
Klicks:
Datum:

Bestell-Nr.: SW1586

Lieferzeit ca. 5 Tage

€ 1,00

Preise inkl. gesetzlicher
MwSt. zzgl. Versandkosten*

€ 1,00

Preise inkl. gesetzlicher
MwSt. + Versandkosten*

Kategorien: