NGinx En İyi Uygulamaları


46

NGinx kullanırken hangi en iyi uygulamaları kullanıyorsunuz?


Bunun bir Magento kurulumu için işe yaramadığını not edin. Nedenlerini hala araştırıyor, ancak sorgu dizesiyle bir ilgisi olduğunu düşünüyorum.
Jauder Ho

"wordpress" adlı alt dizinde wordpress varken konum / wordpress yararlı olmalıdır. Peki ya "/" web kökünde wordpress varken?
rahul 286

Yanıtlar:


21

HTTP ve HTTPS blokları nasıl birleştirilir?

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Bu, farklı bir sorunun cevabı olarak gönderildi. Buraya bakınız .



15

Genellikle, "if" kullanmak kötü bir uygulamadır (nginx yazarına göre). mümkünse, "if (-f ...)" yerine error_page yönergelerinin try_file işlevini kullanmak daha iyi

Tipen maintenence.html dosyası ve tipin try_files ile birleştirilmesi:

yer / {
    try_files /maintenance.html $ uri $ uri / @wordpress;
}

Bakım sona erdiğinde, $ root'dan sadece mv maintenance.html.


16
Bu /maintenance.html 200 yanıt olarak sunulacağı için ideal değildir. Muhtemelen arama motorlarının bakım sayfasının gerçek web siteniz olmadığını bilmesini istersiniz. Muhtemelen bir 503'ü (Geçici Olarak Kullanılamıyor Servisi) iade etmek istersiniz. Bunu nasıl yapacağımı çözebilmemin tek yolu bir if (-f ...) { return 503; }ve error_page 503 /maintenance.html. Ne düşünüyorsun?
Aaron Gibralter


8

mapEşleştirme alt etki alanları için kökü değiştirirken yönergeyi normal ifadelerin yerine kullanmak genellikle daha etkilidir :

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
Yapabileceğini biliyorsun server_name mysite.tld * .mysite.tld
Unknown

8

empty_gifModül ayrıca çok sen (nagios / Monit / vs kullanılarak) web sunucusundan monitör yanıt ihtiyaç, özellikle, yararlıdır:

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

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

1
Bunun için gerçek bir dünya örneği verebilir misiniz? Ne kadar yararlı olduğunu hala tam olarak anlamadım.
Piksel Geliştirici

1
@ Pixel Developer, sadece hız için gerçekten faydalı. Nginx boş bir gif için verileri bellekte tutar, böylece hiçbir zaman diskten yüklenmemesi gerekir.
Bilinmiyor

5
Ayrıca access_log off;bu konumlar için ortak bir uygulamadır
SaveTheRbtz

6

Debian'ın Apache2'yi yaptığı gibi nginx yapılandırmasını idare etmek için komut dosyaları ve aklı başında varsayılanlara sahip bazı örnek şablonlar içeren bu kitabı kullanarak Nginx'i Chef ile kurduk.


5

İşte bir bakım sayfasını döndürmek için iyi bir yöntem. Tüm istekler yeniden yazılır ve doğru http kodu döndürülür. (503 Hizmet Kullanılamıyor)

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
Aslında katılmıyorum - serverfault.com/questions/18994/nginx-best-practices/… ' a yorum ekledim . Temel olarak, bir 503 hatası döndürmek istersiniz, aksi halde botlar ve indeksleyiciler bakım sayfanızın sitenizin bir parçası olduğunu düşünecektir ... ifDoğru kullanırsanız , ifadede yanlış bir şey yoktur - dokümanlar ifsizin için güvenliyse Sadece yapıyorum return xxx;.
Aaron Gibralter

Ayrıca, location = /maintenance.html { break; }gerekli mi?
Aaron Gibralter

4

Nginx 0.7.12 ve sonrasında, bir "Host" başlığı olmadan istekleri yakalamak için server_name içinde "" kullanılabilir.

Aşağıdakileri tanımsız sanal konaklar için bir seçenek olarak kullanabilirsiniz.

server {
  server_name _ "";
}

Örnekiniz yalnızca tanımlanmamış bir vhost ile yapılan istekler için mi çalışıyor yoksa bir bilinmeyen (yanlış) vhost ile yapılan istekler ile de çalışacak mı?
Benoit

@Benoit, tanımlanmamış herhangi bir şey için çalışır.
Bilinmiyor,

"Server_name _ *" nginx 0.7 sonrası için desteklenmiyor mu?
rahul 286

1
Lütfen bunun yalnızca kısmen doğru olduğunu unutmayın. "" bir MISSING Host başlığını yakalayacak, ancak hiçbir şeyle uyuşmayan bir Host başlığında bir istek yakalamayacak. Tümünü yakala sunucu bloğu istiyorsanız, dinleme yönergesinin altındaki default_server bayrağına bakın.
Martin Fjordvald


3

Bunun en iyi uygulama olup olmadığını bilmiyorum, ama kesinlikle nginx içinde iç içe geçmiş koşullar elde etmek için düzgün bir kesmek. İşte nginx wiki'den bir örnek .

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
Bunu "çirkin ama bazen de gerekli uygulama" kategorisine koyardım - kesinlikle teşvik edilecek bir şey değil.
womble

2

Aynı sunucu bloğu tarafından işlenen alt alanlar için http ve https arasında bağlamsal olarak geçiş yapmanız gerekirse, bunu yapmak için değişkenleri kullanabilirsiniz. İşleri yapmanın en etkili yolu olmayabilir, ama işe yarıyor:

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

rootDirektifi her zaman sunucu bloğunun en üstünde kullanmaya çalışırım, böylece $document_rootdeğişkenden faydalanabilirim ve asla, ancak hiçbir zaman rootyönergeyi bir konum bloğunun içine dahil etmem .

Tuzaklar Sayfa Nginx vikiden iyi uygulamalar hakkında bazı harika ipuçları vardır.


1

Proxy olarak nginx kullanıyorsanız, zaman aşımı ayarlarının ayarlanması, özellikle de yoğun trafik uygulaması ile uğraşıyorsanız, uygulama onlarla bitmeden nginx bağlantı bırakmadığınızdan emin olmak için önemli olabilir:

proxy_connect_timeout
proxy_send_timeout

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.