NGinx Praktik Terbaik

46

Praktik terbaik apa yang Anda gunakan saat menggunakan NGinx?

Pengembang Pixel
sumber
Hanya catatan bahwa ini tidak berfungsi untuk pengaturan Magento. Masih menyelidiki alasannya tapi saya pikir itu ada hubungannya dengan string kueri.
Jauder Ho
location / wordpress harus berguna ketika Anda memiliki wordpress di subdirektori bernama "wordpress". Bagaimana ketika kita memiliki wordpress di root web "/"?
rahul286

Jawaban:

21

Cara menggabungkan blok HTTP dan HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Ini diposting sebagai jawaban untuk pertanyaan yang berbeda. Lihat di sini .

Jauder Ho
sumber
15

Secara umum, menggunakan "jika" adalah praktik yang buruk (menurut penulis nginx). jika memungkinkan, lebih baik menggunakan try_file dari arahan error_page sebagai gantinya "jika (-f ...)"

Menggabungkan tip dengan file maintenence.html dan tip dengan try_files kita dapatkan:

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

Ketika pemeliharaan berakhir, cukup mv maintenance.html dari $ root.

Slava K
sumber
16
Ini tidak ideal karena /maintenance.html akan disajikan sebagai tanggapan 200. Anda mungkin ingin mesin pencari mengenali bahwa halaman pemeliharaan bukanlah situs web Anda yang sebenarnya. Anda mungkin ingin mengembalikan 503 (Layanan Sementara Tidak Tersedia). Satu-satunya cara saya mengetahui cara melakukan ini adalah dengan if (-f ...) { return 503; }dan error_page 503 /maintenance.html. Bagaimana menurut anda?
Aaron Gibralter
11

Konfigurasikan nginx untuk menggunakan cipher SSL yang lebih kuat. Secara default, SSLv2 diaktifkan (yang harus dinonaktifkan jika memungkinkan).

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

Jauder Ho
sumber
8

Sering kali lebih efisien untuk menggunakan maparahan sebagai ganti ekspresi reguler saat mengganti root untuk subdomain yang cocok:

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;

}
Phillip B Oldham
sumber
5
Anda tahu bahwa Anda dapat melakukan SERVER_NAME mysite.tld * .mysite.tld
Tidak diketahui
8

The empty_gifModul ini juga sangat berguna, terutama jika Anda perlu tanggapan monitor dari webserver (menggunakan nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 
Phillip B Oldham
sumber
1
Bisakah Anda memberikan contoh dunia nyata untuk ini? Saya masih belum sepenuhnya mengerti bagaimana ini berguna.
Pengembang Pixel
1
@ The Pixel Developer, hanya sangat berguna untuk kecepatan. Nginx menyimpan data untuk gif kosong dalam memori sehingga tidak perlu memuat dari disk.
Tidak diketahui
5
juga access_log off;untuk lokasi tersebut adalah praktik umum
SaveTheRbtz
6

Kami mengatur Nginx dengan Chef, menggunakan buku resep ini yang berisi skrip untuk menangani konfigurasi nginx mirip dengan bagaimana Debian melakukan Apache2, dan juga beberapa templat contoh dengan standar waras.

jtimberman
sumber
5

Berikut adalah metode yang baik untuk mengembalikan halaman pemeliharaan. Semua permintaan ditulis ulang dan kode http yang benar dikembalikan. (503 Layanan tidak tersedia)

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;
}
Pengembang Pixel
sumber
1
Sebenarnya, saya tidak setuju - saya menambahkan komentar ke serverfault.com/questions/18994/nginx-best-practices/… . Pada dasarnya, Anda ingin mengembalikan kesalahan 503 atau bot dan pengindeks akan menganggap halaman pemeliharaan Anda adalah bagian dari situs Anda yang sebenarnya ... Tidak ada yang salah dengan ifpernyataan jika Anda menggunakannya dengan benar - dokumen mengatakan bahwa ifs aman jika Anda sedang dilakukan return xxx;.
Aaron Gibralter
Apakah location = /maintenance.html { break; }perlu?
Aaron Gibralter
4

Dari nginx 0.7.12 dan yang lebih baru, "" dapat digunakan di server_name untuk menangkap permintaan tanpa header "Host".

Anda dapat menggunakan yang berikut ini sebagai catchall untuk host virtual yang tidak terdefinisi.

server {
  server_name _ "";
}
Tidak dikenal
sumber
Apakah contoh Anda hanya berfungsi untuk permintaan dengan vhost yang tidak ditentukan atau apakah itu juga berfungsi dengan permintaan dengan vhost yang tidak dikenal (salah)?
Benoit
@Benoit berfungsi untuk apa pun yang tidak didefinisikan.
Tidak diketahui
Apakah "server_name _ *" tidak didukung nginx 0.7 dan seterusnya?
rahul286
1
Harap dicatat ini hanya sebagian benar. "" akan menangkap tajuk Host HILANG, tetapi itu tidak akan menangkap permintaan dengan tajuk Host yang tidak cocok dengan apa pun. Jika Anda ingin catch-all server block kemudian lihat flag default_server di bawah directive listen.
Martin Fjordvald
3

Saya tidak tahu apakah ini adalah praktik terbaik, tapi pasti peretasan yang rapi untuk mendapatkan kondisi bersarang di nginx. Ini contoh dari wiki 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.
  } 
}
sajal
sumber
3
Saya memasukkannya ke dalam kategori "latihan yang jelek tapi kadang-kadang perlu" - tentu saja bukan sesuatu yang harus didorong.
womble
2

Jika Anda perlu membalik secara kontekstual antara http dan https untuk subdomain yang ditangani oleh blok server yang sama, Anda dapat menggunakan variabel untuk melakukannya. Mungkin bukan cara yang paling efisien untuk melakukan sesuatu, tetapi ia bekerja:

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;
  }

}
Phillip B Oldham
sumber
2

Saya selalu mencoba menggunakan rootarahan di bagian atas blok server sehingga saya dapat mengambil keuntungan dari $document_rootvariabel dan tidak pernah, tetapi tidak pernah, termasuk rootarahan di dalam blok lokasi.

The Pitfalls Halaman dari Nginx wiki memiliki beberapa tips besar tentang praktik terbaik.

pablox
sumber
1

Jika Anda menggunakan nginx sebagai proxy, menyesuaikan pengaturan batas waktu bisa penting untuk memastikan Anda tidak memiliki koneksi nginx drop sebelum aplikasi Anda selesai, terutama jika Anda berurusan dengan aplikasi lalu lintas tinggi:

proxy_connect_timeout
proxy_send_timeout
wjimenez5271
sumber