มี nginx ทั่วไปสำหรับเว็บไซต์ Drupal 7 ไหม?


15

ฉันได้ดูที่คลังข้อมูล drupal-with-nginx ของ Perusioและในขณะที่ฉันคิดว่ามันน่าประทับใจมากเพียงใดมันอาจจะสูงไปหน่อยสำหรับฉันในขณะนี้รวมทั้งฉันมีไซต์ที่ใช้ 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 อยู่แล้วการรักษาแต่ละเว็บไซต์ / / * / directory MultiSite การ discretely ...
tenken

@ เทินดี ฉันจะลองดู การกำหนดค่าส่วนใหญ่ที่ฉันพบในเน็ตนั้นสมมติว่าไม่ได้ติดตั้ง nginx หรือไม่มีไซต์ที่ได้รับการกำหนดค่าไว้แล้วซึ่งเป็นสาเหตุที่ทำให้ฉันระมัดระวังเล็กน้อย ขอบคุณ
Adam-E

คำตอบ:


7

ปัญหาหลักที่ Drupal 7 มีกับ nginx คือ Drupal ได้รับการออกแบบสำหรับ Apache และมีโมดูลมากมายที่สมมติว่าติดตั้ง Apache (และคุณจะมีรายการสีน้ำเงินเล็กน้อยใน "Status Report" ที่บอกคุณว่าคุณไม่สามารถทำได้ ใช้ Upload Progress เนื่องจาก mod_php ไม่ได้ติดตั้ง - น่ารำคาญ)

ที่ถูกกล่าวว่าขอบคุณ perusio และอื่น ๆ โมดูลจำนวนมากได้ถูกสร้างขึ้นที่จัดการกับ nginx และแตะลงในฟังก์ชั่นของมันได้ดี จนถึงตอนนี้ฉันยังไม่พบปัญหาใด ๆ กับ nginx ที่จะได้รับการแก้ไขโดย Apache และ nginx นั้นเร็วกว่าและมีขนาดเล็กกว่ามาก มันแสดงให้เห็นจากการวัดประสิทธิภาพหลายอย่าง แต่มันก็เป็นประสบการณ์ของฉันด้วยเช่นกัน นอกจากนี้ยังมีการรวมที่ดีขึ้นกับ php5-fpm ซึ่งยังดีกว่า mod_php

เมื่อ Drupal พัฒนาขึ้นมันก็กลายเป็นผู้ไม่เชื่อเรื่องพระเจ้ามากขึ้น คุณสามารถเห็นสิ่งนี้ได้โดยใช้เลเยอร์ abstraction ของฐานข้อมูล 7 ที่อนุญาตให้แบ็กเอนด์ฐานข้อมูลเพิ่มเติมดังนั้นฉันคิดว่าการออกแบบในอนาคตจะได้รับการออกแบบกับเว็บเซิร์ฟเวอร์อื่น ๆ

ดังนั้นไม่มีข้อผิดพลาดที่ฉันได้เห็นเลย คุณเพียงแค่ต้องให้ความสนใจกับสิ่งที่โมดูลบางส่วนทำหรืออย่างน้อยสิ่งที่พวกเขาบอกว่าพวกเขาทำ หากพวกเขาพูดถึงไฟล์. htaccess ตรวจสอบให้แน่ใจว่าคุณมีรายการที่เกี่ยวข้องในไฟล์ nginx ของคุณที่ทำสิ่งเดียวกัน ฉันไม่ได้เห็นกรณีที่ nginx ล้มเหลวด้วยการกำหนดค่าที่เหมาะสม

การกำหนดค่า nginx ของ Perusio นั้นยอดเยี่ยม แต่ก็ต้องใช้เวลาพอสมควรในการทำความเข้าใจและทำความเข้าใจกับมัน คุณจะต้องปรับแต่งมันด้วยตัวคุณเองและคุณอาจพบปัญหาบางอย่างที่คุณต้องแก้ไขหากคุณใช้การตั้งค่าที่ไม่ได้มาตรฐานสำหรับสิ่งต่าง ๆ เช่น imagecaching หรือ 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 ทำหกสิ่งเหล่านี้และทำได้เร็วกว่า Apache ถึงห้าเท่า - Chris Lea บน nginx และ Wordpress
SGhosh

2

ฉันเห็นด้วยกับคุณอย่างเต็มที่ว่าการกำหนดค่า nginx สำหรับ Drupal ของ Perusio นั้นน่าประทับใจ แต่อาจเป็น overkill สำหรับอินสแตนซ์ท้องถิ่นของ 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;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.