Shopware und NGINX

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.