NGinxベストプラクティス


46

NGinxを使用する際に使用するベストプラクティスは何ですか?


これは、Magentoのセットアップでは機能しないことに注意してください。理由はまだ調査中ですが、クエリ文字列と関係があると思います。
ジョーダーホー09

location / wordpressは、wordpressという名前のサブディレクトリにwordpressがある場合に役立つ必要があります。ウェブルート「/」にワードプレスがある場合はどうですか?
rahul286 09

回答:




15

一般的に、「if」の使用は悪い習慣です(nginxの作者による)。可能であれば、代わりにerror_pageディレクティブのtry_fileを使用する方が「if(-f ...)」

tipをmaintenence.htmlファイルと組み合わせて、tipをtry_filesと組み合わせます:

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

メンテナンスが終了したら、$ rootからmv maintenance.htmlを実行します。


16
/maintenance.htmlは200応答として提供されるため、これは理想的ではありません。おそらく、メンテナンスページが実際のWebサイトではないことを検索エンジンに認識させる必要があります。503(Service Temporarily Unavailable)を返すことをお勧めします。これを行う方法を理解できる唯一の方法は、if (-f ...) { return 503; }andを使用することerror_page 503 /maintenance.htmlです。どう思いますか?
アーロンギブラーター


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の/ etcを使用して)ウェブサーバからの応答を監視する必要が場合は特に、便利:

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

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

1
これについて実世界の例を提供できますか?私はまだそれがどのように役立つかを完全には理解していません。
ピクセル開発者

1
@ The Pixel Developer。スピードの面で非常に便利です。Nginxは空のgifのデータをメモリに保持するため、ディスクからロードする必要はありません。
不明

5
また、access_log off;これらの場所のための一般的な方法である
SaveTheRbtz


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;
アーロンギブラーター

また、location = /maintenance.html { break; }必要ですか?
アーロンギブラーター

4

nginx 0.7.12以降では、server_nameで ""を使用して、 "Host"ヘッダーのない要求をキャッチできます。

未定義の仮想ホストのキャッチオールとして次を使用できます。

server {
  server_name _ "";
}

あなたのexempleは未定義のvhostを持つリクエストに対してのみ機能しますか、それとも未知の(間違った)vhostを持つリクエストでも動作しますか?
ブノワ

@Benoitは、定義されていないものに対して機能します。
不明

"server_name _ *"はnginx 0.7以降でサポートされていませんか?
rahul286 09

1
これは部分的にしか当てはまらないことに注意してください。「」は、欠落しているホストヘッダーをキャッチしますが、何にも一致しないホストヘッダーを持つリクエストはキャッチしません。catch-allサーバーブロックが必要な場合は、listenディレクティブの下のdefault_serverフラグを参照してください。
マーティンフィヨルドヴァルド


3

それがベストプラクティスであるかどうかはわかりませんが、nginxでネストされた条件を取得するのは間違いなくきちんとしたハックです。nginx wikiのサンプルを次に示します

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
私はそれを「ugいですが時折必要な練習」のカテゴリーに入れました。確かに奨励すべきものではありません。
ワンブル

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 wiki のPitfallsページには、ベストプラクティスに関する素晴らしいヒントがあります。


1

プロキシとしてnginxを使用している場合、タイムアウト設定を調整することは、特にトラフィックの多いアプリケーションを処理している場合、nginxが接続を完了する前に接続をドロップしないようにするために重要です。

proxy_connect_timeout
proxy_send_timeout

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.