ホスト名に基づく動的nginxドメインルートパス?


11

必要に応じて無制限の___.framework.locドメイン作成できるように、開発用のnginx / PHPサーバーを基本的なマスター/キャッチオールvhost構成でセットアップしようとしています。

server {
        listen 80;
        index index.html index.htm index.php;

        # Test 1
        server_name ~^(.+)\.frameworks\.loc$;
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;

        include /etc/nginx/php.conf;
}

ただし、nginxはこのセットアップに対して404エラーで応答します。私がlocalhost使用している構成が正常に機能するため、nginxとPHPが機能し、権限を持っていることを知っています。

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

問題を見つけるために何をチェックすべきですか?以下は、両方がロードしているphp.confのコピーです。

location / {
        try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {

        try_files $uri =404;

        include fastcgi_params;
        fastcgi_index index.php;

        # Keep these parameters for compatibility with old PHP scripts using them.
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # Some default config
        fastcgi_connect_timeout        20;
        fastcgi_send_timeout          180;
        fastcgi_read_timeout          180;
        fastcgi_buffer_size          128k;
        fastcgi_buffers            4 256k;
        fastcgi_busy_buffers_size    256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors    on;
        fastcgi_ignore_client_abort off;
        fastcgi_pass 127.0.0.1:9000;

}

回答:



13

Nginx configはプログラムではなく、宣言です。このような設定を使用している場合:

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

setディレクティブがの前に実行されることを保証する方法はありませんroot

しかし、map私が使用したいディレクティブにはトリックがあります。map以前に評価された事実に依存しているlocation

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}

これはおもしろそうだ、今マップでもっと遊ぶつもりだ。また、構成ファイルが線形に処理されないことも知りませんでした。
Xeoncross

$mypathここのポイントは何ですか?どこでも使用されていません。
kodeart

@kodeartは、$mypath正規表現のために、結果グループである~^(.?<mypath>+)\.frameworks\.loc$$rootpath全体マップトリックのための結果です。
Fabio Montefuscolo 2016年

4

素晴らしいDukeLionの回答に加えて、私は行を変更する必要がありました

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

ここで/etc/nginx/nginx.conf提案されているように私のファイルに。

追加

root /var/www/frameworks/$rootpath

その後/etc/nginx/sites-available/defaultはうまくいきました。


0

多分あなたもlighttpdを調べることができます。それはあなたがここで求めていることを正確にサポートするために組み込まれています。これはmod_evhostと呼ばれます

evhostを有効にする

次の行をlighttpd.confに追加します。Debian / Ubuntuベースディストリビューションを使用している場合は、ソフトリンクするか、から/etc/lighttpd/conf-available/10-evhost.confにコピーし/etc/lighttpd/conf-enabled/ます。

    #http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
    server.modules + =( "mod_evhost")
    evhost.path-pattern = "/ home / www /%_"

%_evhost.path-patten の(ワイルドカード)は、完全なドメイン名(www.example.comなど)を使用することを意味します。www.example.comに対するリクエストは、自動的にdocument-rootに転送されます/home/www/www.example.com/

追加のサイトを追加するのは/home/www、完全なドメイン名で別のディレクトリを作成するのと同じくらい簡単です。Lighttpd設定ファイルに変更はありません。

他にもワイルドカードがあり、ディレクトリ構造の構築に使用できます。彼らは次のとおりです

    %% =>%記号
    %0 =>ドメイン名+ tld
    %1 => tld
    %2 => tldのないドメイン名
    %3 =>サブドメイン1の名前
    %4 =>サブドメイン2の名前
    %_ =>完全なドメイン名

詳細情報はこちら

PS: debian / ubuntuプラットフォームを使用している場合、PHPの有効化も簡単です。ただ、有効10-fastcgi.conf15-fastcgi-php.conf


0

NGINXはPCRE正規表現ライブラリを使用します。
NGINX v0.8.25以降、server_nameディレクティブは名前付きキャプチャを許可します

正規表現の名前付きキャプチャは、後で他のディレクティブで使用できる変数(0.8.25)を作成します。名前付き括弧を使用している間、NGINXはサーバー名の評価中に、各名前付き括弧の変数を自動的に設定します(私は推測します)。

次のスニペットを使用して、開発環境を「フェンス」します。«user»はユーザー名、«proj»はプロジェクトのプロジェクトを指します。

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

nginxの構成は宣言型であるため、静的な宣言は実行時の計算値や変数に比べて常に高速になる可能性があることに注意してください。正規表現の評価は比較的コストがかかります。負荷の高い(本番環境)環境では節約と共に使用する必要があると思います。

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