Existe um nginx conf comum para sites do Drupal 7?

15

Dei uma olhada no repositório drupal-with-nginx do Perusio e, embora seja impressionante o quão extenso, ele pode ser um pouco avançado para mim no momento, além de ter vários sites baseados no Symfony2 ao vivo no servidor e Não começo a fazer alterações significativas até entender completamente as configurações.

Então, eu achei isso em um blog e achei que poderia fazer o trabalho. Existem armadilhas comuns em servir o drupal 7 sobre o nginx? Além disso, se a mesma instalação do Drupal alimentasse mais de um site, a configuração seria 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
fonte
11
Não há armadilhas que eu saiba. Essa configuração nginx já está tratando cada sites / * / diretório / multisite discretamente ...
Tenken
@tenken nice. Certamente vou experimentar. A maioria das configurações que encontrei na rede estava assumindo que o nginx não estava instalado ou que nenhum site já foi configurado, por isso sou um pouco cauteloso. Obrigado
Adam-E

Respostas:

7

O principal problema que o Drupal 7 tem com o nginx é que o Drupal foi projetado para o Apache, e muitos módulos assumem que o Apache está instalado (e você sempre terá uma pequena entrada azul no seu "Relatório de status" que indica que você não pode use o Upload Progress porque o mod_php não está instalado - é irritante).

Dito isto, graças ao perusio e outros, muitos módulos foram criados para lidar mais com o nginx e aproveitar bem sua funcionalidade. Até agora, não encontrei nenhum problema com o nginx que teria sido corrigido pelo Apache, e o nginx é muito mais rápido e tem uma pegada muito mais leve. Isso é mostrado por muitos benchmarks, mas também é minha experiência. Ele também possui uma melhor integração com o php5-fpm, que também supera o mod_php.

À medida que o Drupal se desenvolve, ele se torna mais agnóstico. Você pode ver isso com a camada de abstração de banco de dados do 7, que permite mais back-ends de banco de dados, e por isso presumo que lançamentos futuros serão projetados com outros servidores da Web em mente.

Portanto, não há armadilhas que eu já tenha visto. Você só precisa prestar um pouco mais de atenção ao que alguns dos módulos fazem, ou pelo menos ao que eles dizem que fazem. Se eles mencionarem arquivos .htaccess, verifique se você possui entradas correspondentes nos arquivos nginx que fazem a mesma coisa. Na verdade, eu não vi um caso em que o nginx falha com uma configuração adequada.

A configuração nginx do Perusio é absolutamente incrível, mas leva um bom tempo para passar por tudo e entender. Você precisará personalizá-lo por conta própria e poderá encontrar alguns problemas que precisará corrigir se usar configurações não padrão para coisas como armazenamento de imagens, advagg ou outros. Ele também pressupõe que você esteja usando mais de um pool de php-fpm. Então, você precisará passar e retirar o que não é necessário. Mas vale a pena dedicar algum tempo para analisar tudo, porque você aprenderá muito sobre como o nginx funciona.

Também encontrei vários erros nos meus sites nginx / drupal porque tenho a tendência de usar o php-fpm 5.4 ou 5.5. Os erros não têm nada a ver com nginx, mas com as próprias funções do Drupal, pois o Drupal está realmente finalizando uma transição para exigir o php 5.3. Se você examinar as filas de problemas, no entanto, encontrará várias correções e outras soluções para corrigir os módulos para trabalhar com versões mais recentes do php.

No final do dia, eu recomendaria que qualquer pessoa que estivesse iniciando com um servidor novo usasse o nginx em vez do Apache. É apenas melhor.

Shawn Patrick Rice
fonte
4

Eu li que o Nginx não pode fazer tudo, é limitado em comparação com o Apache. "O Apache possui um módulo para todas as tarefas". Na minha curta experiência, uso o Nginx há alguns meses com o Drupal e tudo funciona bem. Se você estiver usando uma instalação multisite para Drupal e Nginx, poderá definir vários nomes de servidor na mesma configuração de servidor, mas não poderá ter logs diferentes para cada site. Eu uso essa configuração sem (quase) qualquer problema: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

Beto Aveiga
fonte
4
O Apache é como o Microsoft Word, possui um milhão de opções, mas você só precisa de seis. O Nginx faz essas seis coisas e faz cinco delas 50 vezes mais rápido que o Apache. - Chris Lea em nginx e Wordpress
SGhosh
2

Concordo plenamente com você que a configuração do nginx do Perusio para o Drupal é impressionante, mas talvez exagere em uma instância local do nginx. Eu achei o arquivo de configuração nginx do Mulkave no GitHub a configuração mais prática e leve para executar o Drupal 7 no nginx.

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