従来のApacheサーバーをNginxに変換していますが、URLを変更したりファイルシステムを再配置したりする余裕がありません。
Nginx構成でネストされたlocation {}ブロックを使用して、静的コンテンツを通常どおり提供しながら、エイリアスディレクトリ内の.phpファイルをfastcgiにフィードするように指示することは可能ですか?
私が失敗するものと同様の構成:
server {
listen 80;
location / {
index index.html;
}
location /foosite/ {
alias /var/aliases/foo;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
/foosite/static.jpgのリクエストは正常に処理されますが、fastcgiにディスパッチしようとすると、nginxは.phpファイルへのパスを文字化けさせているように見えます。
ここで提供される解決策は解決策ではありません。そして、それはもう正しくありません。 Lucid(10.4)を使用すると、このソリューションを使用できました。 wombleのソリューションの問題は、DOCUMENT_ROOT
パラメーターが適切に設定されていないことです。むしろ、document_rootにスクリプト名が含まれています。
これは問題なく動作するようです。
location /foosite {
alias /home/foosite/www/;
index index.php index.html index.htm;
location ~ /foosite/(.*\.php)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$1;
include /etc/nginx/fastcgi_params;
}
}
nginx/0.7.65
の使用
あなたが話している「文字化け」は、私が知る限り、ネストされたロケーションブロックに関連するnginxのバグです(または、キャプチャなしで正規表現ベースのマッチングを行うロケーションブロックのエイリアス...わかりません) 。しかし、私ができたことはかなり簡単でした。
まず、fastcgi_pass
行とfastcgi_param SCRIPT_FILENAME $request_filename
を含むすべてのfastcgiパラメーターを別のファイルに入れて、サイトの関連部分に含めることができます。私は/etc/nginx/fragments/php
に入れました。
次に、/foosite
の場合、次のように2つのロケーションブロックが必要です。
location /foosite {
alias /var/aliases/foo;
}
location /foosite(.*\.php)$ {
alias /var/aliases/foo$1;
include /etc/nginx/fragments/php;
}
ここで注意すべき点が1つあります。「通常の」ロケーションブロックとは異なり、正規表現ベースのマッチングは、構成ファイルで指定された順序で実行されるようです(非正規表現の場合のように、最長一致優先ではありません)。ロケーションブロック)。したがって、サイト固有のPHP場所、および一般的な「すべてのサイト」PHPハンドラー(location ~ \.php$
)次に、汎用の「すべてのサイト」ハンドラーlastをサーバーブロックに配置する必要があります。そうしないと、すべての地獄が解き放たれます。
ええ、これはひどいです、そして私がモチベーションを上げたら、ネストされたケースで何が悪いのかを正確に解決しようとするかもしれません(構成パーサーはそれをバーフしないので、それは機能するはずですが、実際には誰もそれを使用していません、だからそれはバグだらけです)。
AFAIK、ネストされたブロックは使用できません。
代わりに、次のようなものを試してください。
location / {
root /var/www;
access_log off;
index index.php index.html;
expires 1d;
try_files $uri $uri/ /index.php?q=$uri;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include /usr/local/nginx/conf/fastcgi_params;
}
2番目のブロックを次のように変更できます
location ~ /foosite/.*php$
(テストが必要)