Apakah ada nginx conf umum untuk situs Drupal 7?

15

Saya sudah melihat-lihat repositori drupal-dengan-nginx Perusio dan sementara saya pikir itu mengesankan betapa luasnya itu, mungkin agak terlalu canggih bagi saya saat ini, ditambah saya memiliki beberapa situs berbasis Symfony2 yang tinggal di server dan Saya tidak mulai membuat perubahan signifikan sampai saya sepenuhnya memahami konfigurasi.

Jadi saya menemukan ini di blog dan saya pikir itu bisa melakukan pekerjaan. Apakah ada jebakan umum dengan penyajian drupal 7 di atas nginx? Juga, jika instalasi Drupal yang sama untuk memberi daya lebih dari satu situs, apakah konfigurasinya akan berbeda?

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
sumber
1
tidak ada jebakan yang saya sadari. Konfigurasi nginx itu sudah memperlakukan setiap direktori / sites / * / multisite secara terpisah ...
tenken
@ bagus sekali. Saya pasti akan mencobanya. Sebagian besar konfigurasi yang saya temukan di internet berasumsi bahwa nginx tidak diinstal atau tidak ada situs yang telah dikonfigurasi, itulah sebabnya saya agak berhati-hati. Terima kasih
Adam-E

Jawaban:

7

Masalah utama yang dimiliki Drupal 7 dengan nginx adalah Drupal dirancang untuk Apache, dan begitu banyak modul mengasumsikan bahwa Apache diinstal (dan Anda akan selalu memiliki entri biru kecil pada "Laporan Status" yang memberi tahu Anda bahwa Anda tidak bisa gunakan Unggah Kemajuan karena mod_php tidak diinstal - mengganggu).

Yang sedang berkata, terima kasih kepada perusio dan lainnya, banyak modul telah dibuat yang lebih berhubungan dengan nginx dan memanfaatkan fungsinya dengan baik. Sejauh ini, saya belum mengalami masalah dengan nginx yang akan diperbaiki oleh Apache, dan nginx jauh lebih cepat dan memiliki jejak yang jauh lebih ringan. Ini ditunjukkan oleh banyak tolok ukur, tetapi juga pengalaman saya. Ini juga memiliki integrasi yang lebih baik dengan php5-fpm, yang juga mengungguli mod_php.

Ketika Drupal berkembang, ia menjadi agnostik backend. Anda dapat melihat ini dengan lapisan abstraksi basis data 7 yang memungkinkan backend basis data lebih banyak, jadi saya berasumsi bahwa rilis mendatang akan dirancang dengan mempertimbangkan server web lain.

Jadi, tidak ada jebakan yang pernah saya lihat sama sekali. Anda hanya perlu sedikit lebih memperhatikan apa yang dilakukan beberapa modul, atau setidaknya apa yang mereka lakukan. Jika mereka menyebutkan file .htaccess, maka pastikan Anda memiliki entri yang sesuai di file nginx Anda yang melakukan hal yang sama. Saya belum benar-benar melihat kasus di mana nginx gagal dengan konfigurasi yang tepat.

Konfigurasi nginx Perusio benar-benar luar biasa, tetapi butuh waktu cukup lama untuk melewati semuanya dan memahaminya. Anda AKAN perlu menyesuaikannya untuk diri Anda sendiri, dan Anda mungkin mengalami beberapa masalah yang harus Anda perbaiki jika Anda menggunakan pengaturan non-standar untuk hal-hal seperti imagecaching atau advagg atau yang lainnya. Ini juga mengasumsikan bahwa Anda menggunakan lebih dari satu kumpulan php-fpm. Jadi, Anda harus melewati dan mengeluarkan apa yang tidak diperlukan. Tetapi layak untuk meluangkan waktu untuk menjalani semuanya karena Anda akan belajar banyak tentang cara kerja nginx.

Saya juga mengalami beberapa kesalahan dengan situs nginx / drupal saya karena saya cenderung menggunakan php-fpm 5.4 atau 5.5. Kesalahan tidak ada hubungannya dengan nginx tetapi dengan fungsi Drupal sendiri karena Drupal hanya benar-benar menyelesaikan transisi ke membutuhkan php 5.3. Namun, jika Anda melihat-lihat masalah antrian, Anda akan menemukan beberapa tambalan dan solusi lain untuk memperbaiki modul agar dapat bekerja dengan versi php yang lebih baru.

Pada akhir hari, saya akan merekomendasikan bahwa siapa pun yang memulai dengan server baru menggunakan nginx bukan Apache. Itu lebih baik.

Shawn Patrick Rice
sumber
4

Saya pernah membaca bahwa Nginx tidak dapat melakukan semuanya, ini terbatas dibandingkan dengan Apache. "Apache memiliki modul untuk setiap tugas". Dalam pengalaman singkat saya, saya telah menggunakan Nginx selama beberapa bulan dengan Drupal dan semuanya berfungsi dengan baik. Jika Anda menggunakan pemasangan multisite untuk Drupal dan Nginx, Anda dapat menetapkan beberapa nama server pada konfigurasi server yang sama, tetapi Anda tidak akan dapat memiliki log yang berbeda untuk setiap situs. Saya menggunakan konfigurasi ini tanpa (hampir) masalah: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

Beto Aveiga
sumber
4
Apache seperti Microsoft Word, ia memiliki sejuta opsi tetapi Anda hanya perlu enam. Nginx melakukan enam hal itu, dan lima di antaranya 50 kali lebih cepat dari Apache. - Chris Lea di nginx dan Wordpress
SGhosh
2

Saya sepenuhnya setuju dengan Anda bahwa konfigurasi nginx Perusio untuk Drupal sangat mengesankan, tetapi mungkin berlebihan untuk contoh lokal nginx. Saya telah menemukan file konfigurasi nginx Mulkave di GitHub menjadi konfigurasi yang paling praktis dan ringan untuk menjalankan Drupal 7 di nginx.

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