web-dev-qa-db-ja.com

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

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

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エラーで応答します。私はnginxとPHPが機能しており、使用しているlocalhost configが正常に機能しているため、権限を持っています。

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;

}
11
Xeoncross

なぜ使用しないのですか?

server_name *.frameworks.loc;
root /var/www/frameworks/$http_Host/public;
12
Michael Hampton

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

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

setディレクティブがrootの前に実行されるようにする方法はありません。

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

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

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

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

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

私の/etc/nginx/nginx.conf推奨されるファイル ここ

追加

root /var/www/frameworks/$rootpath

/etc/nginx/sites-available/defaultその後は問題なく動作しました。

4
zub0r

多分あなたも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:有効にするPHPは、debian/ubuntuプラットフォームを使用している場合も簡単です。有効にするのは10-fastcgi.confだけです。および15-fastcgi-php.conf

0
John Siu

NGINXはPCRE正規表現ライブラリを使用します。
NGINX v0.8.25現在 server_nameディレクティブはnamed captures を許可します。

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

次のスニペットを使用して、開発環境を「フェンス」します。 "user"はユーザー名と"proj"は彼らが取り組んでいるプロジェクトを指します:

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

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

0
Stphane