Gibt es eine gemeinsame Nginx-Konf für Drupal 7-Sites?

15

Ich habe mir das Drupal-with-Nginx-Repository von Perusio angesehen und finde es zwar beeindruckend, wie umfangreich es ist, aber im Moment ist es vielleicht etwas zu fortgeschritten für mich. Außerdem habe ich mehrere Symfony2-basierte Sites auf dem Server und Ich werde keine wesentlichen Änderungen vornehmen, bis ich die Konfigurationen vollständig verstanden habe.

Also fand ich das auf einem Blog und dachte, es könnte die Arbeit erledigen. Gibt es häufige Probleme beim Servieren von Drupal 7 über Nginx? Wenn dieselbe Drupal-Installation mehrere Standorte mit Strom versorgen würde, würde sich die Konfiguration unterscheiden?

server {
    server_name example.org;
    root /home/me/sites/example.org;

    index index.html index.htm index.php;

    access_log /var/log/nginx/example.org.access.log;
    error_log /var/log/nginx/example.org.error.log;

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }

    # For drush
    location = /backup {
            deny all;
    }

    # Prevent user from accessing settings.php directly
    location ~ ^/sites/[^/]+/settings.php$ {
            deny all;
    }

    ## Replicate the Apache <FilesMatch> directive of Drupal standard
    ## .htaccess. Disable access to any code files. Return a 404 to curtail
    ## information disclosure. Hide also the text files.
    location ~* ^(?:.+\.(?:htaccess|make|txt|log|engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(?:\.php)?|xtmpl)|code-style\.pl|/Entries.*|/Repository|/Root|/Tag|/Template)$ {
            return 404;
    }

    location ~ \..*/.*\.php$ {
            return 403;
    }

    location / {
            # This is cool because no php is touched for static content
            try_files $uri @rewrite;
    }

    location @rewrite {
            # Some modules enforce no slash (/) at the end of the URL
            # Else this rewrite block wouldn't be needed (GlobalRedirect)
            #rewrite ^/(.*)$ /index.php?q=$1&$args;
            rewrite ^ /index.php last;
    }

    # Use an SSH tunnel to access those pages. They shouldn't be visible to
    # external peeping eyes.
    location = /install.php {
            allow 127.0.0.1;
            deny all;
    }

    location = /update.php {
            allow 127.0.0.1;
            deny all;
    }

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
            fastcgi_pass unix:/var/run/php5-cgi/php5.sock;
    }

    ## Drupal 7 generated image handling, i.e., imagecache in core. See:
    ## https://drupal.org/node/371374
    location ~* /sites/.*/files/styles/ {
            access_log off;
            expires 30d;
            try_files $uri @rewrite;
    }

    # Fighting with ImageCache? This little gem is amazing.
    location ~ ^/sites/.*/files/imagecache/ {
            try_files $uri @rewrite;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            expires max;
            log_not_found off;
    }
}
Adam-E
quelle
1
Keine Fallstricke, die mir bewusst sind. Diese Nginx-Konfiguration behandelt bereits jedes Verzeichnis / sites / * / multisite diskret ...
Tenken
@tenken nett. Ich werde es auf jeden Fall ausprobieren. Die meisten Konfigurationen, die ich im Internet gefunden habe, gingen davon aus, dass nginx nicht installiert wurde oder keine Sites bereits konfiguriert wurden, weshalb ich etwas vorsichtig bin. Vielen Dank
Adam-E

Antworten:

7

Das Hauptproblem, das Drupal 7 mit Nginx hat, ist, dass Drupal für Apache entwickelt wurde und so viele Module davon ausgehen, dass Apache installiert ist benutze Upload Progress weil mod_php nicht installiert ist (nervig).

Trotzdem wurden dank Perusio und anderen viele Module entwickelt, die sich mehr mit Nginx befassen und dessen Funktionalität gut ausnutzen. Bisher habe ich keine Probleme mit Nginx, die von Apache behoben worden wären, und Nginx ist weitaus schneller und hat eine viel geringere Stellfläche. Dies zeigen viele Benchmarks, aber es ist auch meine Erfahrung. Es hat auch eine bessere Integration mit php5-fpm, die auch mod_php übertrifft.

Während sich Drupal weiterentwickelt, wird es agnostischer im Backend. Dies lässt sich an der Datenbankabstraktionsschicht von 7 ablesen, die mehr Datenbank-Backends ermöglicht. Daher gehe ich davon aus, dass zukünftige Versionen für andere Webserver entwickelt werden.

Es gibt also überhaupt keine Fallstricke, die ich gesehen habe. Sie müssen nur ein bisschen mehr auf das achten, was einige der Module tun, oder zumindest, was sie sagen, dass sie tun. Wenn sie .htaccess-Dateien erwähnen, stellen Sie sicher, dass Sie entsprechende Einträge in Ihren Nginx-Dateien haben, die dasselbe tun. Ich habe noch keinen Fall gesehen, in dem Nginx mit einer richtigen Konfiguration fehlschlägt.

Die Nginx-Konfiguration von Perusio ist absolut erstaunlich, aber es dauert eine ganze Weile, bis Sie alles verstanden haben. Sie müssen es für sich anpassen, und es können Probleme auftreten, die behoben werden müssen, wenn Sie nicht standardmäßige Setups für Dinge wie Imagecaching oder Advagg oder andere verwenden. Es wird auch davon ausgegangen, dass Sie mehr als einen PHP-FPM-Pool verwenden. Also müssen Sie durchgehen und herausziehen, was nicht benötigt wird. Es lohnt sich jedoch, sich die Zeit zu nehmen, um alles durchzuarbeiten, da Sie so viel über die Funktionsweise von Nginx lernen werden.

Ich habe auch mehrere Fehler mit meinen Nginx / Drupal-Sites festgestellt, weil ich dazu neige, PHP-Fpm 5.4 oder 5.5 zu verwenden. Die Fehler haben nichts mit Nginx zu tun, aber mit Drupal selbst, da Drupal gerade den Übergang zu PHP 5.3 vollendet. Wenn Sie sich in den Problemwarteschlangen umsehen, finden Sie verschiedene Patches und andere Lösungen, um Module für neuere PHP-Versionen zu reparieren.

Letztendlich würde ich jedem empfehlen, der mit einem neuen Server startet, nginx anstelle von Apache zu verwenden. Es ist einfach besser.

Shawn Patrick Rice
quelle
4

Ich habe gelesen, dass Nginx nicht alles kann, es ist im Vergleich zu Apache begrenzt. "Apache hat für jede Aufgabe ein Modul". Nach meiner kurzen Erfahrung benutze ich Nginx seit ein paar Monaten mit Drupal und alles funktioniert einwandfrei. Wenn Sie eine Installation mit mehreren Standorten für Drupal und Nginx verwenden, können Sie mehrere Servernamen in derselben Serverkonfiguration festlegen, es können jedoch nicht für jeden Standort unterschiedliche Protokolle erstellt werden. Ich benutze diese Konfiguration ohne (fast) Probleme: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

Beto Aveiga
quelle
4
Apache ist wie Microsoft Word, es hat eine Million Optionen, aber Sie brauchen nur sechs. Nginx erledigt diese sechs Dinge und fünf davon 50-mal schneller als Apache. - Chris Lea auf
Nginx
0
server {

    listen *:80;

    access_log /var/log/nginx/test.access.log;
    error_log /var/log/nginx/test.error.log;

    root /srv/test;
    index index.html index.htm index.php;

    # Enable compression, this will help if you have for instance advagg‎ module
    # by serving Gzip versions of the files.
    gzip_static on;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # This matters if you use drush prior to 5.x
    # After 5.x backups are stored outside the Drupal install.
    #location = /backup {
    #        deny all;
    #}

    # Very rarely should these ever be accessed outside of your lan
    location ~* \.(txt|log)$ {
        allow 192.168.0.0/16;
        deny all;
    }

    location ~ \..*/.*\.php$ {
        return 403;
    }

    # No no for private
    location ~ ^/sites/.*/private/ {
        return 403;
    }

    # Block access to "hidden" files and directories whose names begin with a
    # period. This includes directories used by version control systems such
    # as Subversion or Git to store control files.
    location ~ (^|/)\. {
        return 403;
    }

    location / {
        # This is cool because no php is touched for static content
        try_files $uri @rewrite;
    }

    location @rewrite {
        # You have 2 options here
        # For D7 and above:
        # Clean URLs are handled in drupal_environment_initialize().
        rewrite ^ /index.php last;
        # For Drupal 6 and bwlow:
        # Some modules enforce no slash (/) at the end of the URL
        # Else this rewrite block wouldn't be needed (GlobalRedirect)
        #rewrite ^/(.*)$ /index.php?q=$1;
    }

    # Fighting with Styles? This little gem is amazing.
    # This is for D6
    #location ~ ^/sites/.*/files/imagecache/ {
    # This is for D7 and D8
    location ~* files/styles {
        access_log off;
        expires 30d;
        try_files $uri @rewrite;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }

    location ~ [^/]\.php(/|$) {
        fastcgi_index index.php;
        include fcgi.conf;
        fastcgi_pass unix:/var/run/ajenti-v-php-fcgi-test-php-fcgi-0.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
maestro888
quelle