web-dev-qa-db-ja.com

NGinxのベストプラクティス

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

46

断然、私が今まで見た中で最高のヒントは、その落とし穴ページの著者からです: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls /

21
Roger

HTTPブロックとHTTPSブロックを組み合わせる方法。

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

これは別の質問への回答として投稿されました。 こちらをご覧ください

21
Jauder Ho

一般に、「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を実行します。

15
Slava K

より強力なSSL暗号を使用するようにnginxを構成します。デフォルトでは、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

11
Jauder Ho

一致するサブドメインのルートを切り替える場合は、正規表現の代わりに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;

}
8

empty_gifモジュールもveryで便利です。特に、Webサーバーからの応答を監視する必要がある場合(nagios/monit/etcを使用):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

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

このクックブック を使用して、ChefでNginxをセットアップします。これには、DebianがApache2を実行する方法と同様のnginx構成を処理するためのスクリプトと、適切なデフォルトのいくつかのサンプルテンプレートが含まれています。

6
jtimberman

これは、メンテナンスページを返すための適切な方法です。すべてのリクエストが書き換えられ、正しい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;
}
5

Nginx 0.7.12以降では、server_nameで「」を使用して、「Host」ヘッダーのないリクエストをキャッチできます。

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

server {
  server_name _ "";
}
4
Unknown

また、以前のブラウザでは、nginxでgzip圧縮を適切に処理する方法についても投稿しました。古いブラウザでは、包括的なgzipステートメントで問題が発生する可能性があるためです。 HTH。

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

3
Jauder Ho

それがベストプラクティスであるかどうかはわかりませんが、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
sajal

同じサーバーブロックで処理されるサブドメインのコンテキストで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 Page には、ベストプラクティスに関するすばらしいヒントがいくつかあります。

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

proxy_connect_timeout
proxy_send_timeout
1
wjimenez5271
0
KPWINC