私は 作成済み無制限___.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;
}
なぜ使用しないのですか?
server_name *.frameworks.loc;
root /var/www/frameworks/$http_Host/public;
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
}
素晴らしい 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
その後は問題なく動作しました。
多分あなたも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
。
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の構成は宣言型であるため、静的な宣言は実行時の計算値や変数に比べて常に高速になる可能性があることに注意してください。正規表現の評価は比較的コストがかかります。負荷の高い(本番環境)環境では節約と共に使用する必要があると思います。