web-dev-qa-db-ja.com

エイリアスを使用したサブディレクトリ内のphp-fpmを介したnginxの複数(現在は2つ)のphpプロジェクト

Nginxを愛するために、この問題に頭を悩ませることはできません。

Desired: 1つのサーバーブロックの下の2つのサブロケーションに2つの単純なphpプロジェクト(長距離のワードプレス)が必要です。補足:これらのプロジェクトは、capistranoでデプロイされたサーバー上の2つの異なるディレクトリにあります。

問題:最終的に404、403、またはindex.phpのオクテットストリームの直接ダウンロードになります。後者では、正しいindex.phpにヒットしたようですが、php-fpmブロックに渡されません。 php-fpmは機能しており、問題ではありません(サブロケーションのない他のサーバーブロックでテスト済み)

私はWeb全体を調べて、何億もの「機能する」構成を試しましたが、一緒にはなりませんでした。

Plan:以下に、正しいエイリアスディレクトリ内の適切なindex.htmlファイルにアクセスする動作中のnginx仮想ホストを示します。したがって、私はそこの途中にいます。

あなたの助けを借りて、indexをindex.phpに変更し、phpがlocation /staging/productionで動作するように、以下の構成を適応させたいと思います。

location /productionには、phpを機能させようとした1つの構成(コメントアウト)が表示されます。

server {
  listen 82;
  listen [::]:82;

  server_name nginx-web.ch;

  access_log /var/log/nginx/nginx-web_access.log;
  error_log /var/log/nginx/nginx-web_error.log;

  location  /staging {
    alias /var/www/nginx-web1/current;
    index index.html
    add_header X-debug-message "Location web1";
  }

  location /production {
    alias /var/www/nginx-web/current;
    index index.html
    add_header X-debug-message "Location web";

    #try_files $uri $uri/ /production/index.php;

    #location ~ \.php$ {
      # add_header X-debug-message "Location ~ php";
      # try_files $uri =404;
      # fastcgi_split_path_info ^(.+\.php)(/.+)$;
      # fastcgi_pass unix:/var/run/php5-fpm.sock;
      # fastcgi_index index.php;
      # include fastcgi_params;
      # fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #}
  }
}

これは、サブロケーションに適応しようとしたが成功しなかった動作中のサーバーブロックです:(

server {
  listen 80;
  listen [::]:80;

  server_name testdev;

  access_log /var/log/nginx/wp_access.log;
  error_log  /var/log/nginx/wp_error.log;

  root /var/www;
  index index.php;

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

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }
}

WORKING CONFIGで更新(<3 serverfault/stackoverflow):

これが最終的な作業構成です。@ RichardSmithに感謝します。

server {
    listen 82;
    listen [::]:82;

    server_name nginx-web.ch;

    access_log /var/log/nginx/nginx-web_access.log;
    error_log /var/log/nginx/nginx-web_error.log;

    index index.php;

    location ^~ /staging/ {
      alias /var/www/nginx-web1/current/;

      if (!-e $request_filename) { rewrite ^ /staging/index.php last; }

      location ~ \.php$ {
       if (!-f $request_filename) { return 404; }

       include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $request_filename;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
       }
    }

    location /production {
      alias /var/www/nginx-web/current;

      if (!-e $request_filename) { rewrite ^ /production/index.php last; }

      location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $request_filename;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    }
}
1
mahatmanich

このパターンは機能します:

location ^~ /prefix/ {
    alias /path/to/root/;
    if (!-e $request_filename) { rewrite ^ /prefix/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $request_filename;
        fastcgi_pass   ...;
    }
}

^~プレフィックスを使用して、他の正規表現locationブロックが優先されないようにします。 このドキュメント を参照してください。

locationaliasの値は両方とも/で終わるか、どちらも/で終わりません。 このドキュメント を参照してください。

この問題 のためにaliastry_filesを一緒に使用することは避け、ifの使用については この注意 を参照してください。

$request_filenameの計算値としてSCRIPT_FILENAMEを使用します(aliasrootの両方で機能するため)。

fastcgi_paramファイルを含めて常にfastcgi_paramsafterを設定し、後者がローカル値を黙って上書きしないようにします。

1
Richard Smith