7

nginx構成でロケーションブロックを把握するのに苦労しています。これは私が持っているものです:

server {
    listen          80;
    server_name     _;

    access_log      /var/log/nginx/example.com.access_log;
    error_log       /var/log/nginx/example.com.error_log warn;

    root                /var/www/root;
    index               index.php index.htm index.html;
    fastcgi_index       index.php;

    location /wp/ {
        root                /var/www/wordpress;
        index               index.php index.htm index.html;
        fastcgi_index       index.php;
    }

    location ~* \.php$ {
        try_files            $uri =404;
        keepalive_timeout    0;
        fastcgi_param        SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass         127.0.0.1:9000;
    }
}

/を参照すると、期待どおりに機能し、/ var / www / rootにWebサイトが表示されますが、場所が正常に機能する場合は、/ wpを参照すると、/ var / www/wordpressにあるwordpressのインストールに移動するはずです。私が得ているのは:

404お探しのページが見つかりませんでした

nginx / 0.7.67

/ var / www/wordpressディレクトリを/var/ www / root / wordpressに再配置し、/ wordpressを参照すると、すべてが完璧になります。

ロケーションブロックで何が間違っているのですか?

私はこれまでnginxを構成したことがなく、とにかく完全なWeb初心者です。

他のアプリケーションでも、より多くのロケーションブロックを使用できるようにしたいと考えています。これは、ここに投稿するための基本的な例にすぎません。

nginxをDebianSqueezeバックポートのバージョンに更新しました。改善なし:

404お探しのページが見つかりませんでした

nginx / 1.1.19

4

1 に答える 1

7

うまくいかない理由は・・・

サーバーレベルでは、「root /var/www/root」があります。基本的に、特にオーバーライドしない限り、すべてのロケーション ブロックでこれが使用されます。これは良い習慣です。

次に、「wp」ロケーション ブロックで「/var/www/wordpress」に上書きしました。ただし、php ロケーション ブロックはまだデフォルトを使用しています。

「/var/www/wordpress/folder_a/file_a.php」に物理的に配置されている「/wp/folder_a/file_a.php」にリクエストを送信すると、リクエストはphpロケーションブロックにヒットし、ルートフォルダーが指定されますそのブロックのアクティブは、「/var/www/root/folder_a/file_a.php」でファイルを探しに行きます。その結果、「404 not found」が表示されます。

サーバー レベルのルート ディレクティブを「/var/www/wordpress」に変更し、wp の場所でオーバーライドを削除できます。これで問題は解決しますが、"/var/www/root" の下の php スクリプトは機能しなくなります。持っているかどうかはわかりません。

"/var/www/root" と "/var/www/wordpress" の両方で php を実行する必要がある場合は、次のようにする必要があります。

server {
    ...
    root                /var/www/root;
    index              index.php index.htm index.html;
    # Keep fastcgi directives together under location
    # so removed fastcgi_index

    # Put keepalive_timeout under 'http' section if possible

    location /wp/ {
        root                /var/www/wordpress;
        # One appearance of 'index' under server block is sufficient
        location ~* \.php$ {
            try_files           $uri =404;
            fastcgi_index      index.php;
            fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass         127.0.0.1:9000;
        }
    }

    location ~* \.php$ {
        try_files           $uri =404;
        fastcgi_index      index.php;
        fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass         127.0.0.1:9000;
    }
}

つまり、重複した php ロケーション ブロックを wp ロケーション ブロックの下にネストします。wp のルート ディレクティブを継承します。

物事を簡潔に保ち、編集を容易にするために、fastcgi ディレクティブを別のファイルに入れ、必要に応じて含めることができます。

したがって、/path/fastcgi.params には、次のものがあります。

    fastcgi_index      index.php;
    fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass         127.0.0.1:9000;

conf は次のようになります。

server {
    ...
    root                /var/www/root;
    ...
    location /wp/ {
        root                /var/www/wordpress;
        location ~* \.php$ {
            try_files           $uri =404;
            include /path/fastcgi.params;
        }
    }

    location ~* \.php$ {
        try_files           $uri =404;
        include /path/fastcgi.params;
    }
}

このように、fastcgi パラメータを編集する必要がある場合は、1 か所で編集するだけです。

PS。これはバージョンの問題ではないため、nginx を更新しても解決しませんが、とにかく更新してください。

于 2012-05-01T08:38:30.910 に答える