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;
}
}
}
このパターンは機能します:
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
ブロックが優先されないようにします。 このドキュメント を参照してください。
location
とalias
の値は両方とも/
で終わるか、どちらも/
で終わりません。 このドキュメント を参照してください。
この問題 のためにalias
とtry_files
を一緒に使用することは避け、if
の使用については この注意 を参照してください。
$request_filename
の計算値としてSCRIPT_FILENAME
を使用します(alias
とroot
の両方で機能するため)。
fastcgi_param
ファイルを含めて常にfastcgi_params
afterを設定し、後者がローカル値を黙って上書きしないようにします。