แนวทางปฏิบัติที่ดีที่สุดของ NGinx


46

คุณใช้แนวปฏิบัติที่ดีที่สุดในการใช้ NGinx อย่างไร


เพียงแค่ทราบว่านี่ใช้ไม่ได้กับการตั้งค่า Magento ยังคงตรวจสอบเหตุผล แต่ฉันคิดว่ามันมีบางอย่างที่เกี่ยวข้องกับสตริงการสืบค้น
Jauder Ho

location / wordpress จะต้องมีประโยชน์เมื่อคุณมี wordpress ในไดเรกทอรีย่อยชื่อ "wordpress" แล้วเมื่อไหร่ที่เรามีเวิร์ดเพรสในเว็บรูท "/"
rahul286

คำตอบ:


21

วิธีรวมบล็อก HTTP และ HTTPS

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

โพสต์นี้เป็นคำตอบสำหรับคำถามอื่น ดูที่นี่



15

โดยทั่วไปแล้วการใช้ "if" เป็นวิธีปฏิบัติที่ไม่ดี (อ้างอิงจากผู้เขียน nginx) ถ้าเป็นไปได้ควรใช้คำสั่ง try_file ของ error_page แทน "if (-f ... )"

รวมเคล็ดลับเข้ากับไฟล์ maintenence.html และเคล็ดลับกับ try_files ที่เราได้รับ:

ตำแหน่ง / {
    try_files /maintenance.html $ uri $ uri / @wordpress;
}

เมื่อสิ้นสุดการบำรุงรักษาเพียง mv maintenance.html จาก $ root


16
สิ่งนี้ไม่เหมาะอย่างยิ่งที่ /maintenance.html จะแสดงเป็นการตอบกลับ 200 ครั้ง คุณอาจต้องการให้เครื่องมือค้นหารับรู้ว่าหน้าการบำรุงรักษาไม่ใช่เว็บไซต์จริงของคุณ คุณอาจต้องการส่งคืน 503 (บริการไม่พร้อมใช้งานชั่วคราว) วิธีเดียวที่ฉันสามารถคิดออกว่าจะทำเช่นนี้คือมีสระและif (-f ...) { return 503; } error_page 503 /maintenance.htmlคุณคิดอย่างไร?
Aaron Gibralter

11

กำหนดค่า nginx เพื่อใช้ ciphers SSL ที่แข็งแกร่งขึ้น โดยค่าเริ่มต้น SSLv2 จะเปิดใช้งาน (ซึ่งคุณควรปิดการใช้งานหากเป็นไปได้)

ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;

http://tumblelog.jauderho.com/post/121851623/nginx-and-stronger-ssl


8

บ่อยครั้งจะมีประสิทธิภาพมากกว่าในการใช้mapคำสั่งแทนที่นิพจน์ทั่วไปเมื่อสลับรูทสำหรับการจับคู่โดเมนย่อย:

server {

    server_name mysite.tld ~^.+\.mysite\.tld$;

    map $host $files {
        default            common;
        mysite.tld         common;
        www.mysite.tld     common;
        admin.mysite.tld   admin;
        system.mysite.tld  system;
        *.mysite.tld       users;
    }

    root /var/www/mysite/$files;

}

5
คุณรู้ว่าคุณสามารถทำ server_name mysite.tld * .mysite.tld
ไม่ทราบ

8

empty_gifโมดูลยังเป็นอย่างมากที่มีประโยชน์โดยเฉพาะอย่างยิ่งถ้าคุณต้องการการตอบสนองการตรวจสอบจากเว็บเซิร์ฟเวอร์ (ใช้ nagios / monit / ฯลฯ ):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 

1
คุณสามารถให้ตัวอย่างโลกแห่งความเป็นจริงสำหรับสิ่งนี้ได้ไหม ฉันยังไม่เข้าใจว่ามันมีประโยชน์อย่างไร
นักพัฒนา Pixel

1
@ The Pixel Developer มันมีประโยชน์สำหรับความเร็วเท่านั้น Nginx เก็บข้อมูลสำหรับ gif ว่างเปล่าในหน่วยความจำจึงไม่ต้องโหลดจากดิสก์
ไม่รู้จัก

5
นอกจากนี้ยังมีaccess_log off;สำหรับสถานที่เหล่านั้นเป็นเรื่องธรรมดา
SaveTheRbtz

6

เราตั้งค่า Nginx กับ Chef โดยใช้ตำรานี้ซึ่งมีสคริปต์สำหรับจัดการการกำหนดค่า nginx คล้ายกับวิธี Debian ทำ Apache2 และแม่แบบตัวอย่างบางส่วนที่มีค่าเริ่มต้นที่มีสติ


5

นี่เป็นวิธีที่ดีในการส่งคืนหน้าการบำรุงรักษา คำขอทั้งหมดจะถูกเขียนใหม่และรหัส http ที่ถูกต้องจะถูกส่งกลับ (503 - บริการไม่พร้อมใช้งาน)

error_page 503 /maintenance.html;

location /
{
    if (-f $document_root/maintenance.html)
    {
        return 503;
    }

    try_files $uri /index.php?$args;
}

location = /maintenance.html
{
    rewrite ^ /maintenance.html break;
}

1
ที่จริงแล้วฉันไม่เห็นด้วย - ฉันเพิ่มความคิดเห็นไปยังserverfault.com/questions/18994/nginx-best-practices/… . โดยทั่วไปคุณต้องการส่งคืนข้อผิดพลาด 503 มิฉะนั้นบ็อตและตัวจัดทำดัชนีจะคิดว่าหน้าการบำรุงรักษาของคุณเป็นส่วนหนึ่งของเว็บไซต์จริงของคุณ ... ไม่มีอะไรผิดปกติกับifคำสั่งถ้าคุณใช้อย่างถูกต้อง - เอกสารบอกว่าifปลอดภัย กำลังทำreturn xxx;อยู่
แอรอน Gibralter

นอกจากนี้location = /maintenance.html { break; }จำเป็นหรือไม่
แอรอน Gibralter

4

จาก nginx 0.7.12 และใหม่กว่า "" สามารถใช้งานได้ใน server_name เพื่อรับคำขอโดยไม่มีส่วนหัว "โฮสต์"

คุณสามารถใช้สิ่งต่อไปนี้เป็น catchall สำหรับโฮสต์เสมือนที่ไม่ได้กำหนด

server {
  server_name _ "";
}

ตัวอย่างของคุณใช้งานได้เฉพาะกับคำขอที่มี vhost ที่ไม่ได้กำหนดหรือจะทำงานกับคำขอที่มี vhost (ไม่ถูกต้อง) ที่ไม่รู้จักหรือไม่
เบอนัวต์

@Benit มันใช้งานได้กับทุกสิ่งที่ไม่ได้กำหนดไว้
ไม่รู้จัก

"server_name _ *" ไม่รองรับ nginx 0.7 เป็นต้นไปหรือไม่
rahul286

1
โปรดทราบว่านี่เป็นความจริงเพียงบางส่วนเท่านั้น "" จะจับส่วนหัวของโฮสต์ MISSING แต่จะไม่จับคำขอด้วยส่วนหัวของโฮสต์ที่ไม่ตรงกับสิ่งใดเลย หากคุณต้องการบล็อกเซิร์ฟเวอร์ catch-all ให้ดูการตั้งค่าสถานะ default_server ภายใต้ฟังคำสั่ง
Martin Fjordvald

3

ฉันยังโพสต์เมื่อเร็ว ๆ นี้เกี่ยวกับวิธีจัดการการบีบอัด gzip ด้วย nginx อย่างถูกต้องเนื่องจากเบราว์เซอร์รุ่นเก่าอาจมีปัญหากับคำสั่งครอบคลุม gzip HTH

http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx


3

ฉันไม่รู้ว่านี่เป็นวิธีปฏิบัติที่ดีที่สุดหรือไม่ แต่เป็นแฮ็คที่เรียบร้อยเพื่อรับสภาพที่ซ้อนใน nginx นี่คือตัวอย่างจากวิกิพีเดีย Nginx

location /xxxx/ {
  set $test "";

  if ($request_method = POST) {
    set $test  P;
  }

  if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
    set $test  "${test}C";
  }

  if ($test = PC) {
    #rewrite rule goes here.
  } 
}

3
ฉันวางสิ่งนั้นไว้ในหมวดหมู่ของ "การปฏิบัติที่น่าเกลียด แต่บางครั้งก็จำเป็น" - แน่นอนว่าไม่ใช่สิ่งที่จะได้รับการสนับสนุน
womble

2

หากคุณต้องการพลิกบริบทระหว่าง http และ https สำหรับโดเมนย่อยที่จัดการโดยบล็อกเซิร์ฟเวอร์เดียวกันคุณสามารถใช้ตัวแปรเพื่อทำเช่นนั้น อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการทำสิ่งต่าง ๆ แต่ใช้งานได้:

server {
  server mysite.tld ~^.+\.mysite\.tld$;

  set $req_ssl = 0;

  map $host $files {
      default            common;
      mysite.tld         common;
      www.mysite.tld     common;
      admin.mysite.tld   admin;
      system.mysite.tld  system;
      *.mysite.tld       users;
  }

  root /var/www/mysite/$files;

  if ( $files = "admin" ){
    set $req_ssl 1;
  }

  if ( $files = "common" ){
    set $req_ssl 2;
  }

  if ( $scheme = http )
  {
    set $req_ssl $req_ssl.1;
  }

  if ( $scheme = https )
  {
    set $req_ssl $req_ssl.2;
  }

  if ($req_ssl = 1.1){
    rewrite ^ https://$host$uri;
  }

  if ($req_ssl = 2.2){
    rewrite ^ http://$host$uri;
  }

}

2

ฉันพยายามใช้rootคำสั่งที่ด้านบนสุดของบล็อกเซิร์ฟเวอร์เสมอดังนั้นฉันจึงสามารถใช้ประโยชน์จาก$document_rootตัวแปรและไม่เคย แต่ไม่รวมถึงrootคำสั่งในบล็อกตำแหน่งที่ตั้ง

ผิดพลาดหน้าจากวิกิพีเดีย Nginx มีเคล็ดลับที่ดีบางอย่างเกี่ยวกับการปฏิบัติที่ดีที่สุด


1

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

proxy_connect_timeout
proxy_send_timeout

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.