Czy istnieje wspólna konfiguracja nginx dla witryn Drupal 7?


15

Rzuciłem okiem na repozytorium drupal-with-nginx Perusio i choć wydaje mi się, że imponujące jest jego rozległość, w tej chwili może być dla mnie trochę zbyt zaawansowane, a ponadto mam kilka witryn opartych na Symfony2 na serwerze i Nie zaczynam wprowadzać znaczących zmian, dopóki nie w pełni zrozumiem konfiguracje.

Znalazłem to na blogu i pomyślałem, że to może zadziałać. Czy są jakieś typowe pułapki związane z serwowaniem drupala 7 przez Nginx? Ponadto, gdyby ta sama instalacja Drupala miała zasilać więcej niż jedną stronę, czy konfiguracja byłaby inna?

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
żadnych pułapek, o których jestem świadomy. Ta konfiguracja nginx już dyskretnie traktuje każdy katalog / sites / * /
multisite

@tenken nice. Na pewno to wypróbuję. Większość konfiguracji, które znalazłem w sieci, zakładało, że nginx nie został zainstalowany lub żadne strony nie zostały już skonfigurowane, dlatego jestem trochę ostrożny. Dzięki
Adam-E,

Odpowiedzi:


7

Główny problem Drupala 7 z nginx polega na tym, że Drupal jest zaprojektowany dla Apache, a tak wiele modułów zakłada, że ​​Apache jest zainstalowany (i zawsze będziesz miał mały niebieski wpis w „Raporcie stanu”, który mówi, że nie możesz użyj Postępu przesyłania, ponieważ mod_php nie jest zainstalowany - irytujące).

To powiedziawszy, dzięki perusio i innym, stworzono wiele modułów, które lepiej radzą sobie z nginx i dobrze wykorzystują jego funkcjonalność. Do tej pory nie napotkałem żadnego problemu z nginx, który zostałby naprawiony przez Apache, a nginx jest znacznie szybszy i ma znacznie mniejszą powierzchnię. Wskazuje na to wiele testów, ale to także moje doświadczenie. Ma także lepszą integrację z php5-fpm, co również przewyższa mod_php.

W miarę rozwoju Drupala staje się on coraz bardziej agresywny. Możesz to zobaczyć dzięki warstwie abstrakcji bazy danych 7, która pozwala na więcej backendów bazy danych, więc zakładam, że przyszłe wydania będą projektowane z myślą o innych serwerach WWW.

Więc nie ma w ogóle żadnych pułapek. Musisz tylko zwrócić nieco większą uwagę na to, co robią niektóre moduły, a przynajmniej na to, co mówią. Jeśli wspominają pliki .htaccess, upewnij się, że masz odpowiednie wpisy w plikach nginx, które robią to samo. Tak naprawdę nie widziałem przypadku, w którym nginx zawodzi przy prawidłowej konfiguracji.

Konfiguracja Nginx w Perusio jest absolutnie niesamowita, ale zajmuje to sporo czasu, aby przejść przez to wszystko i zrozumieć. Będziesz musiał dostosować go dla siebie i możesz napotkać pewne problemy, które musisz rozwiązać, jeśli używasz niestandardowych ustawień do takich zadań, jak imagecaching lub advagg lub kilka innych. Zakłada również, że używasz więcej niż jednej puli php-fpm. Musisz więc przejść i wyciągnąć to, czego nie potrzebujesz. Ale warto poświęcić czas, aby przejść przez to wszystko, ponieważ dowiesz się wiele o tym, jak działa nginx.

Wystąpił również szereg błędów w moich witrynach nginx / drupal, ponieważ mam tendencję do korzystania z php-fpm 5.4 lub 5.5. Błędy nie mają nic wspólnego z nginx, ale z samymi funkcjami Drupala, ponieważ Drupal właśnie kończy przejście na wymaganie php 5.3. Jeśli jednak rozejrzysz się po kolejkach problemów, znajdziesz kilka poprawek i innych rozwiązań, aby naprawić moduły współpracujące z nowszymi wersjami php.

Na koniec polecam wszystkim, którzy zaczynają od nowego serwera, używać nginx zamiast Apache. Po prostu lepiej.


4

Czytałem, że Nginx nie może zrobić wszystkiego, jest ograniczony w porównaniu z Apache. „Apache ma moduł do każdego zadania”. Z mojego krótkiego doświadczenia korzystam od Nginx od kilku miesięcy z Drupalem i wszystko działa dobrze. Jeśli korzystasz z instalacji na wielu serwerach dla Drupal i Nginx, możesz ustawić wiele nazw serwerów dla tej samej konfiguracji serwera, ale nie będziesz mieć różnych dzienników dla każdej witryny. Używam tej konfiguracji bez (prawie) żadnego problemu: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/


4
Apache jest jak Microsoft Word, ma milion opcji, ale potrzebujesz tylko sześciu. Nginx robi te sześć rzeczy i robi pięć z nich 50 razy szybciej niż Apache. - Chris Lea na nginx i Wordpress
SGhosh

2

Całkowicie się z tobą zgadzam, że konfiguracja Perusio nginx dla Drupala jest imponująca, ale być może przesada w przypadku lokalnej instancji nginx. Odkryłem, że plik konfiguracyjny Nginx Mulkave na GitHub jest najbardziej praktyczną i lekką konfiguracją do uruchamiania Drupala 7 na 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;
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.