2015-10-09 14 views
9

CachetHQを特定の場所にあるnginx + php-fpmで提供しようとしています。ドキュメントは(これが動作)status.example.comに役立つ例として、これを与える:Nginxから別の場所にアプリケーションをホストする

server { 
    listen 80; 
    server_name status.example.com; 

    root /var/www/Cachet/public; 
    index index.php; 

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

    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_index index.php; 
     fastcgi_keep_conn on; 
    } 
} 

しかし、代わりstatus.example.comになると、私はexample.com/statusで配信したいと思います。

私は、これがうまくいくことを期待していたが、error.logファイルから、私はそれが/etc/nginx/htmlindex.phpをしようとしている見るが、それは/mnt/data/site/www-cachet/public/index.php次のようになります。

location /status/ { 
    index index.php; 
    root /mnt/data/site/www-cachet/public; 

    try_files $uri index.php$is_args$args; 

    location ~ ^/status/.+\.php$ { 
     root /mnt/data/site/www-cachet/public; 
     include fastcgi_params; 
     fastcgi_pass unix:/tmp/php-fpm.sock; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_index index.php; 
     fastcgi_keep_conn on; 
    } 
} 
+0

優先権は正しくありません。それは最初に 'location /'と一致します – zywj

+0

@ZYWJよく 'location /'は '/ status'にあることができないので問題にならないはずです – rodorgas

+0

@rodorgas、私の答えはあなたのために正しく動作しますか? – cnst

答えて

0

非常に多くの時間が組み合わせの多くを試した後、私は働くそれを得た方法だった:

location ^~ /status { 
    alias /mnt/data/site/www-cachet/public; 
    try_files $uri $uri/ @status; 

    location = /status/ { 
     rewrite /status/$ /status/index.php; 
    } 

    location ~ ^/status/(.+\.php)$ { 
     fastcgi_pass unix:/tmp/php-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /mnt/data/site/www-cachet/public/$1; 
     include fastcgi_params; 
    } 
} 

location @status { 
    rewrite /status/(.*)$ /status/index.php?/$1 last; 
} 

最も重要なことは、私はそれのような絶対パスの代わりに、$document_root$fastcgi_script_nameか何かにそれを設定する必要がありましたfastcgi_paramました。私はそれが良いpraticeであるかどうかはわかりませんが、ブロックにaliasを追加するだけで動作しないし、どちらもnginxまたはFastCGIは私たちに彼らが読み取ろうとしているファイルのパスを示していません。

しかし、私はCachetHQをうまく動作させることができませんでした。問題は、ソースコード内のすべてのパスが絶対的なので、ファイルがホストされているサブディレクトリを指していないことです。解決策は私が始めから消極的だった何かをしていました:それをサブドメインでホストしてください。

2

あなたtry_filesが正しくありません。
あなたはこのようにそれを行うことができます。

index index.php; 
root /mnt/data/site/www-cachet/public; 

location/{ 
    if (!-e $request_filename) { 
     rewrite ^(.*)$ /index.php?$1 last; 
     break; 
    } 
} 

location ~ ^/status/.+\.php$ { 
    root /mnt/data/site/www-cachet/public; 
    include fastcgi_params; 
    fastcgi_pass unix:/tmp/php-fpm.sock; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_index index.php; 
    fastcgi_keep_conn on; 
} 
+0

Nginx設定テストは失敗し、 'location"/"outside location/status"です。私はエラーを取り除くように修正しました。その後、ログは、nginxがFastCGIにスクリプトを送信するが、HTTPレスポンスは「File not found」であることを示していました。 error.logには、 "Primary script unknown"というメッセージが表示されます。アクセスしようとしている経路を確認する方法はありますか? – rodorgas

2

は私はあなたが作品を主張する元の構成を見てみましょう、そしてあなたの要件のためにそれを修正しようとすると、以下の結果:

location ^~ /status { 
    alias /var/www/Cachet/public; 
    index index.php; 

    location = /status { 
     return 302 /status/; 
    } 
    location/{ 
     try_files $uri /status/index.php$is_args$args; 
    } 

    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     rewrite ^/status/(.*) /$1; 
     rewrite ^(.*)/ $1/index.php; # who knows what fastcgi_index is for? 
     fastcgi_param SCRIPT_FILENAME $document_root$uri; 
     fastcgi_keep_conn on; 
    } 
} 

を基本的には、ここではrootの代わりにaliasを使用し、最終的には絶対パスも使用します。try_files入れ子になった場所に余分なプレフィックスを追加する必要はありませんが、ルートの場所が^~修飾子との最終一致であることを確認したい場合があります。

メインのトリックは、私が推測する、でもaliasディレクティブのものとの適切rootほどダンディではありませんので、あなたがSCRIPT_FILENAMEが正しく設定されていることを確認しなければならないということです。この部分は非常にはっきりと文書化されていないようで、私は$fastcgi_script_namengx variablefastcgi_indexのディレクティブがaliasでうまく演奏されるかどうかをテストするのが面倒だと思います。該当する場合はrewriteのルールの組み合わせを使用し、書き換えルールの結果に基づいてSCRIPT_FILENAMEを作成してください。 :-)

しかし、それで2番目の書き換えルール(それだけでなく、fastcgi_indexが置き換えられます)は、ノーオペレーションである可能性もあります。私たちはどうやって\.php$location$uri.phpで既に終了していない場合は、 (同様に、あなたも、最初の書き換えルールを削除し、$fastcgi_script_nameSCRIPT_FILENAME$uriを交換し、物事はまだ動作かどうかを確認しようとして自由だが、インターネットfrom 2009は、彼らがなかったことを示してもよい。)

+0

Nginx設定テストでは、 'location"/"outside location/status"が指定されています。私はnginx/1.8.0を使用しています。私は 'location /'を 'location/status /'に変更しました。そして404エラーが出ました。/etc/nginx/htmlindex.phpにアクセスしようとしています。 – rodorgas

+0

@rodorgas、どうしてこのような404エラーが発生していますか? '/ etc/nginx/htmlindex.php'に誤りがあるのを見たことがない人は、あなたの設定ファイルや私の例をコピーして貼り付ける方法がとても変わっているはずです。 '/' outside '/ status'に関しては、必ず'/status'に変更してください。 – cnst

+0

'curl http:// site/status /'(カールするのでレスポンスはキャッシュされません)、/ status/setupなどはすべて同じ奇妙な場所を試します。私は '/ etc/nginx /'の中の全てのファイルを検索しました。ここではconf.dファイルと他のファイルが置かれていて、 '/ etc/nginx/html'パスはありません。私は自分のコピーペーストもチェックして倍増しました、それは期待どおりに働いています。変なことが起こっていて、変数(バグ?)の代わりに絶対パスを設定することによってのみ修正できます。 – rodorgas

関連する問題