¿Existe una configuración nginx común para los sitios de Drupal 7?

15

He echado un vistazo al repositorio drupal-with-nginx de Perusio y, aunque creo que es impresionante lo extenso que es, puede ser demasiado avanzado para mí en este momento, además tengo varios sitios basados ​​en Symfony2 en vivo en el servidor y No empiezo a hacer cambios significativos hasta que entiendo completamente las configuraciones.

Así que encontré esto en un blog y pensé que podría hacer el trabajo. ¿Hay alguna dificultad común al servir drupal 7 sobre nginx? Además, si la misma instalación de Drupal fuera a alimentar más de un sitio, ¿la configuración sería diferente?

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
fuente
1
no hay escollos que yo sepa. Esa configuración nginx ya está tratando cada directorio / sitios / * / multisitio discretamente ...
tenken
@tenken bien. Ciertamente lo probaré. La mayoría de las configuraciones que encontré en la red suponían que nginx no estaba instalado o que no se habían configurado sitios, por eso soy un poco cauteloso. Gracias
Adam-E

Respuestas:

7

El principal problema que tiene Drupal 7 con nginx es que Drupal está diseñado para Apache, y muchos módulos asumen que Apache está instalado (y siempre tendrá una pequeña entrada azul en su "Informe de estado" que le dice que no puede use Upload Progress porque mod_php no está instalado, molesto).

Dicho esto, gracias a perusio y otros, se han creado muchos módulos que tratan más con nginx y aprovechan bien su funcionalidad. Hasta ahora, no me he encontrado con ningún problema con nginx que hubiera sido reparado por Apache, y nginx es mucho más rápido y tiene una huella mucho más ligera. Esto se muestra en muchos puntos de referencia, pero también es mi experiencia. También tiene una mejor integración con php5-fpm, que también supera a mod_php.

A medida que Drupal se desarrolla, se vuelve más agnóstico de backend. Puede ver esto con la capa de abstracción de la base de datos de 7 que permite más backends de la base de datos, por lo que supongo que las futuras versiones se diseñarán teniendo en cuenta otros servidores web.

Entonces, no hay trampas que haya visto en absoluto. Solo tiene que prestar un poco más de atención a lo que hacen algunos de los módulos, o al menos a lo que dicen que hacen. Si mencionan archivos .htaccess, asegúrese de tener entradas correspondientes en sus archivos nginx que hagan lo mismo. En realidad, no he visto un caso en el que nginx falla con una configuración adecuada.

La configuración nginx de Perusio es absolutamente increíble, pero lleva bastante tiempo superarlo y comprenderlo. Tendrá que personalizarlo usted mismo, y es posible que tenga algunos problemas que deberá solucionar si usa configuraciones no estándar para cosas como el almacenamiento en caché de imágenes o advagg u otros. También supone que está utilizando más de un grupo php-fpm. Por lo tanto, tendrá que pasar y sacar lo que no se necesita. Pero vale la pena tomarse el tiempo para analizarlo todo porque aprenderá mucho sobre cómo funciona nginx.

También me he encontrado con varios errores con mis sitios nginx / drupal porque tengo tendencia a usar php-fpm 5.4 o 5.5. Los errores no tienen nada que ver con nginx, pero con las funciones de Drupal, ya que Drupal está realmente terminando una transición para requerir php 5.3. Sin embargo, si observa las colas de problemas, encontrará varios parches y otras soluciones para arreglar módulos para que funcionen con versiones más nuevas de php.

Al final del día, recomendaría que cualquiera que esté comenzando con un servidor nuevo use nginx en lugar de Apache. Es solo mejor.

Shawn Patrick Rice
fuente
4

He leído que Nginx no puede hacer todo, es limitado en comparación con Apache. "Apache tiene un módulo para cada tarea". En mi corta experiencia, he estado usando Nginx durante un par de meses con Drupal y todo funciona bien. Si está utilizando una instalación multisitio para Drupal y Nginx, puede configurar varios nombres de servidor en la misma configuración de servidor, pero no podrá tener registros diferentes para cada sitio. Uso esta configuración sin (casi) ningún problema: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

Beto Aveiga
fuente
44
Apache es como Microsoft Word, tiene un millón de opciones pero solo necesitas seis. Nginx hace esas seis cosas, y hace cinco de ellas 50 veces más rápido que Apache. - Chris Lea en nginx y Wordpress
SGhosh
2

Estoy completamente de acuerdo con usted en que la configuración nginx de Perusio para Drupal es impresionante, pero tal vez exagerada para una instancia local de nginx. He encontrado que el archivo de configuración nginx de Mulkave en GitHub es la configuración más práctica y liviana para ejecutar Drupal 7 en nginx.

pxwise
fuente
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
fuente