Esiste una conf nginx comune per i siti Drupal 7?


15

Ho dato un'occhiata al repository drupal-con-nginx di Perusio e mentre penso che sia impressionante quanto sia esteso, al momento potrebbe essere un po 'troppo avanzato per me, inoltre ho diversi siti basati su Symfony2 dal vivo sul server e Non inizio a fare cambiamenti significativi fino a quando non comprenderò appieno le configurazioni.

Quindi l'ho trovato su un blog e ho pensato che potesse fare il lavoro. Ci sono insidie ​​comuni nel servire drupal 7 su nginx? Inoltre, se la stessa installazione di Drupal dovesse alimentare più di un sito, la configurazione sarebbe diversa?

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;
    }
}

1
senza insidie ​​di cui sono a conoscenza. Quella configurazione di nginx sta già trattando ogni directory / sites / * / multisite in modo discreto ...
Tenken,

@tenken nice. Lo proverò sicuramente. La maggior parte delle configurazioni che ho trovato in rete presupponevano che nginx non fosse installato o che nessun sito fosse già stato configurato, motivo per cui sono un po 'cauto. Grazie
Adam-E,

Risposte:


7

Il problema principale che Drupal 7 ha con nginx è che Drupal è progettato per Apache, e così tanti moduli presumono che Apache sia installato (e avrai sempre una piccola voce blu nel tuo "Rapporto sullo stato" che ti dice che non puoi usa Progress Upload perché mod_php non è installato - fastidioso).

Detto questo, grazie a perusio e altri, sono stati creati molti moduli che trattano di più con nginx e sfruttano bene la sua funzionalità. Finora, non ho riscontrato alcun problema con nginx che sarebbe stato risolto da Apache, e nginx è molto più veloce e ha un'impronta molto più leggera. Ciò è dimostrato da molti benchmark, ma è anche la mia esperienza. Ha anche una migliore integrazione con php5-fpm, che supera anche mod_php.

Man mano che Drupal si sviluppa, sta diventando più agnostico nel backend. Puoi vederlo con il livello di astrazione del database 7 che consente più back-end di database, quindi presumo che le versioni future saranno progettate pensando ad altri server web.

Quindi, non ci sono insidie ​​che io abbia mai visto. Devi solo prestare un po 'più di attenzione a ciò che fanno alcuni moduli, o almeno a quello che dicono di fare. Se menzionano i file .htaccess, assicurati di avere voci corrispondenti nei tuoi file nginx che facciano la stessa cosa. In realtà non ho visto un caso in cui nginx fallisce con una corretta configurazione.

La configurazione di nginx di Perusio è assolutamente sorprendente, ma ci vuole un po 'di tempo per superare tutto e capirlo. Dovrai personalizzarlo per te stesso e potresti riscontrare alcuni problemi che dovresti risolvere se usi configurazioni non standard per cose come l'immaginazione o Advagg o altri. Presuppone inoltre che stai utilizzando più di un pool php-fpm. Quindi dovrai passare attraverso ed estrarre ciò che non è necessario. Ma vale la pena prendersi il tempo necessario per affrontare tutto perché imparerai così tanto su come funziona nginx.

Ho anche riscontrato diversi errori con i miei siti nginx / drupal perché ho la tendenza ad usare php-fpm 5.4 o 5.5. Gli errori non hanno nulla a che fare con nginx ma con le stesse funzioni di Drupal in quanto Drupal sta davvero finendo una transizione per richiedere php 5.3. Se guardi intorno alle code dei problemi, tuttavia, troverai diverse patch e altre soluzioni per correggere i moduli in modo che funzionino con le versioni più recenti di php.

Alla fine, consiglierei a chiunque inizi con un nuovo server di utilizzare nginx invece di Apache. È solo meglio.


4

Ho letto che Nginx non può fare tutto, è limitato rispetto ad Apache. "Apache ha un modulo per ogni attività". Nella mia breve esperienza ho usato Nginx per un paio di mesi con Drupal e tutto funziona bene. Se si utilizza un'installazione multisito per Drupal e Nginx, è possibile impostare più nomi di server nella stessa configurazione del server, ma non sarà possibile avere registri diversi per ciascun sito. Uso questa configurazione senza (quasi) nessun problema: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/


4
Apache è come Microsoft Word, ha un milione di opzioni ma ne servono solo sei. Nginx fa queste sei cose, e ne fa cinque volte 50 volte più velocemente di Apache. - Chris Lea su nginx e Wordpress
SGhosh

2

Sono completamente d'accordo con te sul fatto che la configurazione nginx di Perusio per Drupal sia impressionante, ma forse eccessiva per un'istanza locale di nginx. Ho trovato il file di configurazione nginx di Mulkave su GitHub come la configurazione più pratica e leggera per eseguire Drupal 7 su 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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.