Có một nginx conf chung cho các trang web Drupal 7 không?


15

Tôi đã xem qua kho lưu trữ drupal-with-nginx của Perusio và trong khi tôi nghĩ nó ấn tượng đến mức nào thì nó có thể hơi quá tiến bộ đối với tôi vào lúc này, cộng với tôi có một số trang web dựa trên Symfony2 sống trên máy chủ và Tôi không bắt đầu thực hiện các thay đổi đáng kể cho đến khi tôi hoàn toàn hiểu cấu hình.

Vì vậy, tôi tìm thấy điều này trên một blog và hình dung nó có thể thực hiện công việc. Có bất kỳ cạm bẫy phổ biến nào khi phục vụ drupal 7 trên nginx không? Ngoài ra, nếu cài đặt Drupal tương tự cung cấp năng lượng cho nhiều trang web, cấu hình có khác nhau không?

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
không có cạm bẫy mà tôi nhận thức được. Cấu hình nginx đó đã xử lý riêng từng thư mục / site / * /
multisite

@tenken đẹp. Tôi chắc chắn sẽ thử nó. Hầu hết các cấu hình tôi tìm thấy trên mạng đều cho rằng nginx chưa được cài đặt hoặc chưa có trang nào được cấu hình, đó là lý do tại sao tôi hơi thận trọng. Cảm ơn
Adam-E

Câu trả lời:


7

Vấn đề chính mà Drupal 7 gặp phải với nginx là Drupal được thiết kế cho Apache và rất nhiều mô-đun cho rằng Apache đã được cài đặt (và bạn sẽ luôn có một mục màu xanh nhỏ trên "Báo cáo trạng thái" cho bạn biết rằng bạn không thể sử dụng Tiến trình tải lên vì mod_php chưa được cài đặt - gây phiền nhiễu).

Điều đó đang được nói, nhờ vào perusio và những người khác, nhiều mô-đun đã được tạo ra để đối phó nhiều hơn với nginx và khai thác tốt chức năng của nó. Cho đến nay, tôi chưa gặp phải bất kỳ vấn đề nào với nginx đã được sửa chữa bởi Apache và nginx nhanh hơn nhiều và có dấu chân nhẹ hơn nhiều. Điều này được thể hiện bằng nhiều điểm chuẩn, nhưng đó cũng là kinh nghiệm của tôi. Nó cũng tích hợp tốt hơn với php5-fpm, nó cũng vượt trội so với mod_php.

Khi Drupal phát triển, nó trở nên bất khả tri hơn. Bạn có thể thấy điều này với lớp trừu tượng cơ sở dữ liệu của 7 cho phép có nhiều phụ trợ cơ sở dữ liệu hơn và vì vậy tôi cho rằng các bản phát hành trong tương lai sẽ được thiết kế với các máy chủ web khác.

Vì vậy, không có cạm bẫy mà tôi đã thấy ở tất cả. Bạn chỉ cần chú ý hơn một chút về những gì một số mô-đun làm, hoặc ít nhất là những gì họ nói họ làm. Nếu họ đề cập đến các tệp .htaccess, thì hãy đảm bảo rằng bạn có các mục tương ứng trong các tệp nginx của bạn làm điều tương tự. Tôi chưa thực sự thấy một trường hợp nginx thất bại với một cấu hình phù hợp.

Cấu hình nginx của Perusio hoàn toàn tuyệt vời, nhưng phải mất khá nhiều thời gian để vượt qua tất cả và hiểu nó. Bạn S need cần tùy chỉnh nó cho chính mình và bạn có thể gặp phải một số vấn đề cần khắc phục nếu bạn sử dụng các thiết lập không chuẩn cho những thứ như tưởng tượng hoặc advagg hoặc một số vấn đề khác. Nó cũng giả định rằng bạn đang sử dụng nhiều nhóm php-fpm. Vì vậy, bạn sẽ cần phải đi qua và lấy ra những gì không cần thiết. Nhưng nó đáng để dành thời gian để trải qua tất cả bởi vì bạn sẽ học được rất nhiều về cách nginx hoạt động.

Tôi cũng đã gặp phải một số lỗi với các trang web nginx / drupal của mình vì tôi có xu hướng sử dụng php-fpm 5.4 hoặc 5.5. Các lỗi không liên quan gì đến nginx nhưng với chính các chức năng của Drupal vì Drupal thực sự đang hoàn tất quá trình chuyển đổi sang yêu cầu php 5.3. Tuy nhiên, nếu bạn nhìn xung quanh hàng đợi vấn đề, bạn sẽ tìm thấy một số bản vá và các giải pháp khác để sửa các mô-đun hoạt động với các phiên bản php mới hơn.

Vào cuối ngày, tôi sẽ khuyên mọi người bắt đầu với một máy chủ mới sử dụng nginx thay vì Apache. Nó chỉ tốt hơn.


4

Tôi đã đọc rằng Nginx không thể làm mọi thứ, nó bị giới hạn so với Apache. "Apache có một mô-đun cho mọi nhiệm vụ". Theo kinh nghiệm ngắn ngủi của tôi, tôi đã sử dụng Nginx trong một vài tháng với Drupal và mọi thứ đều hoạt động tốt. Nếu bạn đang sử dụng cài đặt nhiều trang cho Drupal và Nginx, bạn có thể đặt nhiều tên máy chủ trên cùng một cấu hình máy chủ, nhưng bạn sẽ không thể có các nhật ký khác nhau cho mỗi trang web. Tôi sử dụng cấu hình này mà không có (hầu như) bất kỳ vấn đề nào: https://www.nginx.com/resource/wiki/start/topics/recipes/drupal/


4
Apache giống như Microsoft Word, nó có một triệu tùy chọn nhưng bạn chỉ cần sáu. Nginx thực hiện sáu điều đó và nó thực hiện năm lần nhanh hơn 50 lần so với Apache. - Chris Lea trên nginx và Wordpress
SGhosh

2

Tôi hoàn toàn đồng ý với bạn rằng cấu hình nginx của Perusio cho Drupal rất ấn tượng, nhưng có lẽ quá mức cần thiết cho một phiên bản nginx cục bộ. Tôi đã tìm thấy tệp cấu hình nginx của Mulkave trên GitHub là cấu hình nhẹ, thiết thực nhất để chạy Drupal 7 trên 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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.