nginxは場所に変数を設定します


37

私はnginxの設定を最適化しようとしているので、1つの変数を設定することが可能で、すべてのロケーションパスが自動的に更新されます。問題のある4行があります。

server_name php.domain.com;
root /srv/web/vhosts/php/web;
error_log /srv/web/vhosts/php/logs/error.log;
access_log /srv/web/vhosts/php/logs/access.log;

私が達成したいのは、1つの変数(この場合は「php」)を設定し、それをconfigに含めることです。

set $variable "php";
server_name $variable.domain.com;
root /srv/web/vhosts/$variable/web;
error_log /srv/web/vhosts/$variable/logs/error.log;
access_log /srv/web/vhosts/$variable/logs/access.log;

ただし、nginxはこの設定の変数を無視するようです。私は何か間違ったことをしていますか、ロケーションパスで変数を使用することはできませんか?

回答:


58

変数はどこでも宣言できず、どのディレクティブでも使用できません。

setディレクティブのドキュメントは次のとおりです。

Syntax:   set $variable value;
Default:  —
Context:  server, location, if

直接的な結果は、httpブロック内でカスタム変数を使用できないことです。

アップデート:このチャットルームAlexeyTenとの議論と実験の後。

  • access_log制限付きの変数を含めることができます。その中でも、バッファリングの欠如と、先頭のスラッシュを変数で宣言してはならないという事実
  • error_log 変数ではまったく機能しません。
  • root ディレクティブには変数を含めることができます。
  • server_nameディレクティブは$hostname、変数のような表記法として厳密な値のみを許可します。

1
access_log/ error_log変数を操作しますが、いくつかの制限があります。server_name変数を含めることはできません。
アレクセイ10年

@AlexeyTen私の答えを読み直してください。カスタム変数では機能しません。サーバー名には、などの組み込み変数を含めることができます$hostname。その動作を明確にするために回答を更新しました。
ザビエルルーカス14年

5
まあ、$hostname唯一の許可された変数です。github.com/nginx/nginx/blob/…実際、それは本当の変数ではなく、魔法の定数のようなものです
Alexey Ten 14年


3
これは多分ある最高の研究SFの答え。お二人に感謝/ Cc @AlexeyTen
kaiser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.