web-dev-qa-db-ja.com

Nginxはエイリアス内でphp(または同様のfcgi)リクエストを処理できますか?

従来の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ファイルへのパスを文字化けさせているように見えます。

4
allaryin

ここで提供される解決策は解決策ではありません。そして、それはもう正しくありません。 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の使用

6
dcurtis

あなたが話している「文字化け」は、私が知る限り、ネストされたロケーションブロックに関連する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をサーバーブロックに配置する必要があります。そうしないと、すべての地獄が解き放たれます。

ええ、これはひどいです、そして私がモチベーションを上げたら、ネストされたケースで何が悪いのかを正確に解決しようとするかもしれません(構成パーサーはそれをバーフしないので、それは機能するはずですが、実際には誰もそれを使用していません、だからそれはバグだらけです)。

1
womble

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$

(テストが必要)

0
Jauder Ho