Чи існує загальна nginx конф для сайтів Drupal 7?


15

Я переглянув сховище Perusio з компанією Drupal-з-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;
    }
}

1
жодних підводних каменів, про які я знаю. Ця конфігурація nginx вже дискретно обробляє кожен / сайти / * / багатомісний каталог ...
tenken

@tenken приємно. Я обов'язково спробую це. Більшість конфігурацій, які я знайшов у мережі, припускали, що nginx не встановлений або жодних сайтів не налаштовано, тому я трохи обережний. Спасибі
Адам-Е

Відповіді:


7

Основна проблема, з якою Drupal 7 має nginx, полягає в тому, що Drupal розроблений для Apache, і так багато модулів припускають, що Apache встановлений (і у вашому "Звіті про стан" ви завжди матимете синій запис, який говорить про те, що ви не можете використовуйте «Прогрес завантаження», оскільки mod_php не встановлений - дратує).

Однак, завдяки perusio та іншим було створено багато модулів, які більше справляються з nginx і добре використовують його функціональність. Поки що я не зіткнувся з жодною проблемою з nginx, яка була б виправлена ​​Apache, а nginx набагато швидше і має набагато легший слід. Це показано багатьма орієнтирами, але це також мій досвід. Він також має кращу інтеграцію з php5-fpm, що також перевершує mod_php.

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

Отже, жодних підводних каменів, яких я бачив, немає. Вам просто потрібно приділити трохи більше уваги тому, що роблять деякі модулі, або хоча б тому, що вони кажуть, що роблять. Якщо вони згадують файли .htaccess, то переконайтеся, що у ваших nginx-файлах є відповідні записи, які роблять те саме. Я фактично не бачив випадків, коли nginx виходить з ладу при правильній конфігурації.

Конфігурація nginx Perusio абсолютно дивовижна, але потрібно пройти досить багато часу, щоб усе це зрозуміти і зрозуміти. Вам потрібно буде налаштувати його під себе, і ви можете зіткнутися з деякими проблемами, які вам доведеться виправити, якщо ви використовуєте нестандартні установки для таких речей, як кешування зображень або просування або деякі інші. Він також передбачає, що ви використовуєте більше одного пулу 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

Я повністю згоден з вами, що конфігурація nginx Perusio для Drupal є вражаючою, але, можливо, надмірною для локального екземпляра nginx. Я знайшов файл конфігурації nginx Mulkave на GitHub як найбільш практичну, легку конфігурацію для запуску Drupal 7 на 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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.