In diesem Beitrag zeige ich euch wie Ihr Shopware 5.2.24 unter Ubuntu 16.04 mit NGINX 1.10.1 lauffähig bekommt. NGINX ist ein hochperformanter Webserver welcher gerade bei vielen Requests ein MUSS ist.
Die aktuellste PHP Version welche wir mit Shopware und dem Ioncube Loader nutzen können ist 7.0.x – da es leider noch keine Version für die 7.1.x PHP Version gibt. Da muss ich wirklich sagen ist Ioncube oft hinterher, dass stört ungemein – ist aber wiederum ein Ansporn Anforderungen selbst umzusetzen 😉
Installation von NGINX
Ich gehe davon aus, dass Ihr auf eurem Server aktuell noch Apache2 laufen habt, daher müssen wir diesen vorab erst einmal stoppen:
sudo service apache2 stop
Danach müssen wir nginx installieren, das machen wir mit:
sudo apt-get update sudo apt-get install nginx
Solltet Ihr kein PHP 7 nutzen, müsst Ihr eure Version für FPM anpassen. Denn für NGINX benötigt Ihr den Fast CGI Process Manager (hier mehr dazu).
sudo apt-get install php7.0-fpm
Mit dem Aufruf vom localhost müssten wir nun folgendes sehen:
Wie beim Apache müssen wir noch unsere VHosts konfigurieren. Dafür gehen wir in cd /etc/nginx/sites-available/ dort finden wir eine Datei namens „default“ – diese nutzen wir nun einfach mal zum testen – Ihr könnt dort später einfach andere Files für euer Shopsystem anlegen (meinshop.de etc.).
Default ist standardmäßig schon in sites-enabled gelinkt – wenn Ihr einen neuen VHost erstellt fügt Ihr diesen einfach mit:
sudo ln -s /etc/nginx/sites-available/meinshop.de /etc/nginx/sites-enabled/
hinzu. Apache macht das üblicherweise mit sudo a2ensite meinshop.de.conf
Shopware Konfiguration
Damit Shopware unter NGINX lauffähig ist, müssen wir die oben beschriebene Datei default editieren.
sudo nano default
Ich nutze in dem Fall die Basis von Benjamin Cremer, vielen Dank an dieser Stelle für das bereitstellen auf Github – euch ist natürlich freigestellt diesen Weg der Installation zu gehen.
## Author: Benjamin Cremer ## Shopware nginx rules. ## Heavily Inspired by https://github.com/perusio/drupal-with-nginx/ ## Designed to be included in any server {} block. ## Please note that you need a PHP-FPM upstream configured in the http context, and its name set in the $fpm_upstream variable. ## https://github.com/bcremer/shopware-with-nginx server { listen 80; listen [::]:80; server_name www.meinshop.de; root /var/www/meinshop; location = /favicon.ico { log_not_found off; access_log off; } ## Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac). location ~ /\. { deny all; access_log off; log_not_found off; } ## Deny all attems to access possible configuration files location ~ \.(tpl|yml|ini|log)$ { deny all; } ## Deny access to media upload folder location ^~ /media/temp/ { deny all; } # Shopware caches and logs location ^~ /var/ { deny all; } # Deny access to root files location ~ (autoload\.php|composer\.(json|lock|phar)|CONTRIBUTING\.md|eula.*\.txt|license\.txt|README\.md|UPGRADE\.md)$ { return 404; } location ^~ /files/documents/ { deny all; } # Block direct access to ESDs, but allow the follwing download options: # * 'PHP' (slow) # * 'X-Accel' (optimized) # Also see http://wiki.shopware.com/ESD_detail_1116.html#Ab_Shopware_4.2.2 location ^~ /files/552211cce724117c3178e3d22bec532ec/ { internal; } # Shopware install / update location /recovery/install { index index.php; try_files $uri /recovery/install/index.php$is_args$args; } location /recovery/update/ { location /recovery/update/assets { } if (!-e $request_filename){ rewrite . /recovery/update/index.php last; } } location / { location ~* "^/themes/Frontend/Responsive/frontend/_public/vendors/fonts/open-sans-fontface/(?:.+)\.(?:ttf|eot|svg|woff)$" { expires max; add_header Cache-Control "public"; access_log off; log_not_found off; } location ~* "^/themes/Frontend/Responsive/frontend/_public/src/fonts/(?:.+)\.(?:ttf|eot|svg|woff)$" { expires max; add_header Cache-Control "public"; access_log off; log_not_found off; } location ~* "^/web/cache/(?:[0-9]{10})_(?:.+)\.(?:js|css)$" { expires max; add_header Cache-Control "public"; access_log off; log_not_found off; } ## All static files will be served directly. location ~* ^.+\.(?:css|cur|js|jpe?g|gif|ico|png|svg|html)$ { ## Defining rewrite rules rewrite files/documents/.* /engine last; rewrite backend/media/(.*) /media/$1 last; expires 1w; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; access_log off; # The directive enables or disables messages in error_log about files not found on disk. log_not_found off; tcp_nodelay off; ## Set the OS file cache. open_file_cache max=3000 inactive=120s; open_file_cache_valid 45s; open_file_cache_min_uses 2; open_file_cache_errors off; ## Fallback to shopware ## comment in if needed try_files $uri /shopware.php?controller=Media&action=fallback; } index shopware.php index.php; try_files $uri $uri/ /shopware.php$is_args$args; } ## XML Sitemap support. location = /sitemap.xml { log_not_found off; access_log off; try_files $uri @shopware; } ## XML SitemapMobile support. location = /sitemapMobile.xml { log_not_found off; access_log off; try_files $uri @shopware; } ## robots.txt support. location = /robots.txt { log_not_found off; access_log off; try_files $uri @shopware; } location @shopware { rewrite / /shopware.php; } location ~ \.php$ { try_files $uri $uri/ =404; ## NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini fastcgi_split_path_info ^(.+\.php)(/.+)$; ## required for upstream keepalive # disabled due to failed connections #fastcgi_keep_conn on; include fastcgi.conf; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # Mitigate httpoxy vulnerability, see: https://httpoxy.org/ fastcgi_param HTTP_PROXY ""; fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; client_max_body_size 24M; client_body_buffer_size 128k; ## Set $fpm_upstream in your server block fastcgi_pass unix:/run/php/php7.0-fpm.sock; } }
Zwei Einstellungen wurden von mir angepasst, zum einen:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
und
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Nun müsst Ihr nur noch euren NGINX neustarten:
sudo service nginx restart
Falls Ihr vorher noch kein FPM genutzt habt, müsst Ihr auch noch alle Einstellungen aus eurer php.ini File in die FPM php.ini File einfügen sudo nano /etc/php/7.0/fpm/php.ini – dazu gehören zum Beispiel extensions und Ioncube (falls Ihr verschl. Plugins nutzt):
extension=php_curl.dll zend_extension = /usr/share/nginx/html/ioncube/ioncube_loader_lin_7.0.so
dann noch ein:
sudo service php7.0-fpm restart
Probleme
FPM listener
Sollte euer Shop nicht aufrufbar sein, kann das mehrere Gründe haben. Zum einen kann der listener vom FPM nicht richtig konfiguriert sein:
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
listen = /run/php/php7.0-fpm.sock
;listen = 127.0.0.1:9000
Passt euren parameter entsprechend eurer config in /etc/nginx/sites-available/default an oder umgekehrt.
Neustart mit Apache
Ihr habt euren Server/VM zwischenzeitlich neugestartet? Dann wird vermutlich euer Apache wieder geladen – dies müsst Ihr mit
sudo update-rc.d apache2 disable unterbinden und dafür den NGINX einfügen sudo update-rc.d nginx enable
Error Logs
In den meisten Fällen findet Ihr den exakten Fehler direkt in den NGINX Error logs, diese liegen unter /var/log/nginx/error.log
Ich hoffe der Beitrag hilft einigen für den Wechsel von Apache2 auf NGINX – wie bereits erwähnt lohnt sich dies meist bei vielen Aufrufen, aber sollte auch bei einem kleinen Shop in Erwägung gezogen werden, denn der soll ja schließlich auch wachsen und ist damit dann auch für Kundenanstürme gewappnet 😉
Hier geht es zum direkten Vergleich zwischen Shopware mit NGINX & Apache2