Существует ли распространенная конфигурация nginx для сайтов на Drupal 7?

15

Я посмотрел на репозиторий Perusio drupal-with-nginx, и, хотя я думаю, что он впечатляет, насколько он обширный, в данный момент он может быть слишком сложным для меня, плюс у меня есть несколько сайтов на базе Symfony2, работающих на сервере, и Я не начинаю вносить существенные изменения, пока полностью не пойму конфигурации.

Так что я нашел это в блоге и подумал, что это может сработать. Существуют ли какие-либо распространенные подводные камни при обслуживании drupal 7 над nginx? Кроме того, если одна и та же установка Drupal предназначена для питания более чем одного сайта, конфигурация будет другой?

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;
    }
}
Адам-E
источник
1
никаких подводных камней, о которых я знаю. Эта конфигурация nginx уже обрабатывает каждый каталог / sites / * / multisite дискретно ...
tenken
@kenken хорошо. Я обязательно попробую. Большинство конфигураций, которые я нашел в сети, предполагали, что nginx не был установлен или ни один сайт не был настроен, поэтому я немного осторожен. Спасибо
Адам-E

Ответы:

7

Основная проблема, которую Drupal 7 имеет с nginx, заключается в том, что Drupal предназначен для Apache, и поэтому многие модули предполагают, что Apache установлен (и у вас всегда будет небольшая голубая запись в «Отчете о состоянии», которая говорит вам, что вы не можете использовать Upload Progress, потому что mod_php не установлен - раздражает).

Тем не менее, благодаря perusio и другим, было создано много модулей, которые больше работают с nginx и хорошо используют его функциональность. До сих пор я не сталкивался с какой-либо проблемой nginx, которая была бы исправлена ​​Apache, и nginx намного быстрее и занимает гораздо меньше места. Это показано многими тестами, но это также и мой опыт. Он также лучше интегрирован с php5-fpm, который также превосходит mod_php.

По мере развития Drupal он становится все более независимым от бэкэнда. Вы можете убедиться в этом на уровне абстракции базы данных 7, который позволяет использовать больше баз данных, и поэтому я предполагаю, что будущие выпуски будут разрабатываться с учетом других веб-серверов.

Так что я не вижу никаких подводных камней. Вам просто нужно уделить немного больше внимания тому, что делают некоторые модули, или, по крайней мере, тому, что они говорят. Если они упоминают файлы .htaccess, убедитесь, что в ваших файлах nginx есть соответствующие записи, которые делают то же самое. На самом деле я не видел случая, когда nginx завершился неудачно с правильной конфигурацией.

Конфигурация Perusio nginx просто потрясающая, но требуется время, чтобы пройти через все это и понять это. Вам нужно будет настроить его для себя, и вы можете столкнуться с некоторыми проблемами, которые вам нужно будет исправить, если вы используете нестандартные настройки для таких вещей, как кеширование изображений или advagg или некоторые другие. Также предполагается, что вы используете более одного пула php-fpm. Так что вам нужно пройти и вытащить то, что не нужно. Но стоит потратить время на то, чтобы пройти через все это, потому что вы так много узнаете о том, как работает nginx.

Я также столкнулся с несколькими ошибками на своих сайтах nginx / drupal, потому что у меня есть тенденция использовать php-fpm 5.4 или 5.5. Ошибки не имеют ничего общего с nginx, но с самими функциями Drupal, так как Drupal только что завершил переход на php 5.3. Однако если вы осмотрите очереди проблем, вы найдете несколько исправлений и других решений для исправления модулей для работы с более новыми версиями php.

В конце дня я бы порекомендовал всем, кто начинает с нового сервера, использовать nginx вместо Apache. Это просто лучше.

Шон Патрик Райс
источник
4

Я читал, что Nginx не может делать все, он ограничен по сравнению с Apache. «В Apache есть модуль для каждой задачи». По моему короткому опыту я использую Nginx в течение нескольких месяцев с Drupal, и все работает отлично. Если вы используете многосайтовую установку для Drupal и Nginx, вы можете установить несколько имен серверов в одной и той же конфигурации сервера, но вы не сможете иметь разные журналы для каждого сайта. Я использую этот конфиг без (почти) любой проблемы: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

Бето Авейга
источник
4
Apache похож на Microsoft Word, у него есть миллион вариантов, но вам нужно всего шесть. Nginx делает эти шесть вещей и пять из них в 50 раз быстрее, чем Apache. - Крис Ли на nginx и Wordpress
SGhosh
2

Я полностью согласен с вами, что конфигурация Perginio для nginx для Drupal впечатляет, но, возможно, излишняя для локального экземпляра nginx. Я обнаружил, что файл конфигурации nginx Mulkave на GitHub является наиболее практичной и легкой конфигурацией для запуска Drupal 7 на nginx.

pxwise
источник
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
источник