2016-09-30 17 views
0

これは私の状況です。私は別の上流のアプリケーションから来るカスタムロジックを持っているサイトを持っています。私はこれを今問題なく稼働させていますが、私の単純な解決策は少し冗長です。私は間もなく、これらのカスタムロケーションをさらに追加し、これらのロケーションにアクセスする機能を追加するだけでなく、大文字と小文字を追加します。私の解決策はうまくいくが、場所のリストはすぐに扱いにくくなり、私は私の解決策を再考したい。大文字/小文字の場所のNginxルール

私のアップストリームが "myupstream"と呼ばれ、すでにファイルに定義されているとします。私のカスタムの場所は1,2,3、そして4です。 (実際の場所名はそれぞれの保護のために変更されています)。だから、

これらのURL:

http://mysite/one http://mysite/two http://mysite/three http://mysite/four

そして、私のnginx.confで:

location /one { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/one; 
      proxy_set_header Host $http_host; 
    } 
    location /two { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/two; 
      proxy_set_header Host $http_host; 
    } 
… 
etc. 

場所のすべては、場所の名前のほかに同じです。

現在、現在の数は数になりますが、数十になることもあります。そして、大文字と小文字の両方の場所を訪問する機能を追加します。だから、:

http://mysite/one http://mysite/ONE http://mysite/two http://mysite/TWO 等...

私はnginx.conf内40個の別の場所のブロックを作成することと思います私の現在の戦略を使用して、20点の場所を持っている場合。だから私はもう少しダイナミックなやり方を模索していました。以下のようないくつかの事:もちろん

location /(one|two|three) { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/$1; 
      proxy_set_header Host $http_host; 
    } 

が、私は特定のエントリのための唯一の仕事にそれをみたい、そう大きく開いルールが機能しません。また、大文字も検出したいと思いますが、上流を呼び出すときは小文字にする必要があります。たとえば:

location /ONE { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/one; 
      proxy_set_header Host $http_host; 
    } 

だから、1質問:nginxのでこれを行うには良い方法は

ありますか?どうやって?

質問2:

どのようにリソース/プロセスが効率的ですか?

ありがとうございます。

答えて

2

大文字と小文字を区別しないlocationマッチング使用します。別のアプローチがある

location ~* /(one|two|three) { 
    log_request_speed_filter on; 
    log_request_speed_filter_timeout 1000; 
    proxy_pass http://myupstream/$1; 
    proxy_set_header Host $http_host; 
} 

を - テンプレートを使用して:

/etc/nginx/host.tmpl

log_request_speed_filter on; 
log_request_speed_filter_timeout 1000; 
proxy_pass http://myupstream/$host_loc; 
proxy_set_header Host $http_host; 

/etc/nginx/vhost.d/somehost.conf

は、
location /one { 
    set $host_loc "one"; 
    include host.impl; 
} 

Nginxは、ロケーションURIの変数をサポートしていません。

最も効率的なものを選択するために、さまざまな設定をベンチマークすることをお勧めします。 nginxのは、現在構築されていないため

はEDITは

あなたはhttp://myupstream/fourから/FOURの要求だけでなく、http://myupstream/fourなどへ /FoUr要求を渡したい場合は、このようなPerl moduleとして モジュールを使用する必要があります小文字のURIの場合は変数、位置URIを小文字に変換する組み込み関数の場合

/etc/nginx/nginx.conf

http { 
    perl_set $uri_lc 'sub { return lc shift->uri; }'; 
} 

サブルーチンで、我々は:

  • request objectshiftとをフェッチします。
  • リクエストオブジェクトから現在のURIを取得します。shift->uri;
  • lc functionにURIを渡すと

結果は$uri_lc nginxの変数に割り当てられている結果を返します。

/etc/nginx/vhost.d/somehost.conf

location ~* ^/(one|two|three)$ { 
    log_request_speed_filter on; 
    log_request_speed_filter_timeout 1000; 
    proxy_pass http://myupstream$uri_lc; 
    proxy_set_header Host $http_host; 
} 

マーカー^(開始)と$(端部)が重要です。

+0

上記の例で、誰かがhttp://example.com/FOURを呼び出した場合、アップストリームに渡される値は "4"か "4"になりますか?私はそれを "4"にする必要があります。 –

+0

@ R.Smith、私は答えを更新しました –

+0

ありがとう!これはまさに私が必要としたものでした。 –

関連する問題