2017-01-19 9 views
1
server { 
    listen 80; 
    server_name ~^(?<cc>.+?).local.solar.bc.digital$; 
    client_max_body_size 1m; 

    root /home/vagrant/sites/$cc/_www/; 
    index index.html index.htm index.php; 
    error_page 404 /index.php; 
    access_log /var/log/nginx/$cc-access.log; 
    error_log /var/log/nginx/$cc-error.log; 
    charset utf-8; 
    sendfile off; 

    location/{ 
    root /home/vagrant/sites/$cc/_www/php/; 
    try_files $uri $uri/ /index.php?$query_string; 
    } 

    location /shop/ { 
    # root /home/vagrant/sites/$cc/_www/bcshop/; 
    try_files $uri $uri/ /index.php?$query_string; 
    } 

    location ~ \.php$ { 
    fastcgi_index index.php; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME $request_filename; 
    fastcgi_param APP_ENV dev; 
    fastcgi_param PLATFORM_ENVIRONMENT local; 
    fastcgi_read_timeout 300; 
    fastcgi_buffers 16 16k; 
    fastcgi_buffer_size 32k; 
    } 

    location ~ /\.ht { 
    deny all; 
    } 
} 

右は上記の設定を指定します。私がしようとしていることが分かっているなら、それが機能していないことをご存じですか?それぞれ独自のルートを持つNginx複数の場所

いくつかの詳細:

  1. 私はエラーが出ずにいるので、私は、一般的な 'ルート' を持っています。
  2. これは開発用のローカルVM上にあります。我々は、各プロジェクト(上記の設定の$ cc変数を参照)ごとに、最大2つのアプリケーションをデプロイできる配備ツールをローカルに持っています。それぞれのプロジェクトごとに必ずしも両方が配備されるとは限りません。最初のアプリは/home/vagrant/sites/$cc/_www/phpに配備され、2番目のアプリは/home/vagrant/sites/$cc/_www/bcshopに設定されています(ただし、私はshopに設定することができます)。
  3. 両方のアプリが両方とも同じように動作します。私は単にそれらを働かせることはできません。私は、私が試した小さな変形のほとんどで、両方のファイルが見つかりません。
  4. 私は/home/vagrant/sites/$cc/_www/shop/home/vagrant/sites/$cc/_www/bcshopではなく)に2番目のアプリを置くと、そのホームページを読み込むことができますが、それ以外は何も表示されません。
  5. 2番目のアプリを無視して最初のアプリに集中すると、一般ルートを/home/vagrant/sites/$cc/_www/phpに設定し、ローカルルートを/から削除することができます。それは動作します。しかし、それがローカルルートとして指定されていないときは。この場合、実際には、ログに次のエラーが表示されます。「FastCGIがstderrで送信されました:「上流の応答ヘッダーを読み取っている間にプライマリスクリプトが不明です」。これは、最初のアプリのみ。
  6. 一般的なルートがその値に設定されている理由がわからないのであれば、一般的なルートが一致する場所に対して検証できない場合、ログにエラーが発生するからです。意味がありますか?

私は、私が要約したことのほとんどすべてをカバーしていると思います。

思考?

私はnginxの専門家ではないので、私は試してみることにしました。しかし、これまでのところ、喜びはありません。

ありがとうございます。

+0

あなた*グローバル・ルートは、 '$のrequest_filename'を解決するために、'場所〜\の.php $ 'で使用されます。私はまだPHPファイルに '/ home/vagrant/sites/$ cc/_www'を使用し、それ以外には'/home/vagrant/sites/$ cc/_www/php'を使用する理由を理解できません。 –

+0

@リチャードスミスそれは良い点です。私は自分自身を疑っていましたが、一般的なルートに存在のテストに失敗しないようにするという問題を回避する方法はわかりません( 'test '/ home/vagrant/sites/shop/_www/php第2の場所( '/ shop')にマッチするときは「存在しません。 私は 'location〜\ .php $'の両方の場所でPHPを処理したいと思います。可能? '/ home/vagrant/sites/$ cc/_www/php'の最初の場所と/ home/vagrant/sites/$ cc/_www/bcshop'に一致する場合、' 'location〜\ .php $'のルートは '' home /それが第2のものと一致するとき。どうやって? –

答えて

0

_www/bcshop/パスと_www/php/パスの両方にPHPファイルがあります。両方のアプリケーションで共通のlocation ~ \.php$を使用する場合は、各アプリケーションのURIの接頭辞をそれぞれ/bcshop/phpにする必要があります。つまり、両方のアプリケーションは、サブディレクトリで実行するとと表示されます。

1つのアプリケーションには/shopという接頭辞を使用し、もう1つには接頭辞/を使用することをお勧めします。その場合は2つのブロックが必要になります。

root /home/vagrant/sites/$cc/_www/php; 
location/{ 
    try_files $uri $uri/ /index.php?$query_string; 
} 
location ~ \.php$ { 
    try_files $uri /index.php; 

    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME $request_filename; 
    ... 
} 

1つのアプリケーションが/shopのURI接頭辞で実行されますが、サブディレクトリ_www/bcshopにあります:

location ^~ /shop { 
    rewrite ^/shop(?:/(.*))?$ /bcshop/$1 last; 
} 

location ^~ /bcshop/ { 
    internal; 
    root /home/vagrant/sites/$cc/_www; 

    try_files $uri /shop/index.php?$query_string; 

    location ~ \.php$ { 
     try_files $uri /shop/index.php; 

     include /etc/nginx/fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME $request_filename; 
     ... 
    } 
} 

^~修飾子はlocationことを保証

1つの用途は、サーバーのルートから実行されますブロックは上記の正規表現ロケーションブロックよりも優先されます。詳細はthis documentを参照してください。

外部のURIプレフィックスは/shopですが、は、暗黙的に/bcshopに書き換えられ、rootディレクティブを引き続き使用できます。 aliasディレクティブがありますが、それはissues with try_filesであり、PHPで使用するのは難しいです。

+0

よかった、ありがとう。 '/ shop /'アプリケーションを起動するときに 'index.php'ファイルをダウンロードするのはなぜですか? –

+0

ショップのPHPファイルは、ネストされた 'location〜\ .php $'ブロック(つまり、 'location ^〜/ shop'ブロック内の**)によって処理されます。このブロックは、最初の 'location〜\ .php $'ブロックと事実上同一である必要があり、処理のためにPHPファイルがFastCGIに渡されます。 –

+0

'try_files'行以外は同じです。 Mhm。 –

0

@ RichardSmithの回答に基づいて、私は自分の変種(これはうまくいきます)を考え出します。単にlocation ~ \.php$のためのブロックを繰り返すことで私の頭をしていたので。

... 
... 
root /home/vagrant/sites/$cc/_www/; 
... 
... 
location/{ 
    set $actual_root /home/vagrant/sites/$cc/_www/php/; 
    set $fastcgi_index /index.php; 
    root $actual_root; 
    try_files $uri $uri/ $fastcgi_index?$query_string; 
} 

location /shop/ { 
    set $actual_root /home/vagrant/sites/$cc/_www/; 
    set $fastcgi_index /shop/index.php; 
    root $actual_root; 
    try_files $uri $uri/ $fastcgi_index?$query_string; 
} 

location ~ \.php$ { 
    root $actual_root; 
    fastcgi_index $fastcgi_index; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME $actual_root/$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param APP_ENV dev; 
    fastcgi_param PLATFORM_ENVIRONMENT local; 
    fastcgi_read_timeout 300; 
    fastcgi_buffers 16 16k; 
    fastcgi_buffer_size 32k;  
} 

... 
... 
関連する問題