7

次のようにNginx Webサーバーを構成したいと思います。

  • /index.phpURIへのリクエストは、public_html/frontend/web/index.php
  • /admin/index.phpURIへのリクエストは、public_html/backend/web/index.php

私が間違っているところにアドバイスをください。これが私の設定です:

server {
    listen        80;
    server_name   yii2.lo;
    server_tokens off;

    client_max_body_size 128M;
    charset       utf-8;

    access_log    /var/log/nginx/yii2-access.log main buffer=50k;
    error_log     /var/log/nginx/yii2-error.log notice;

    set           $host_path      "/srv/http/yii2/public";
    set           $yii_bootstrap  "index.php";

    index         $yii_bootstrap;

    location / {
        root          $host_path/frontend/web;
        try_files $uri $uri/ /$yii_bootstrap?$args;

    }

    location /admin {
        root          $host_path/backend/web;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index           $yii_bootstrap;

        # Connect to php-fpm via socket
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;

        fastcgi_connect_timeout     30s;
        fastcgi_read_timeout        30s;
        fastcgi_send_timeout        60s;
        fastcgi_ignore_client_abort on;
        fastcgi_pass_header         "X-Accel-Expires";

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  HTTP_REFERER     $http_referer;
        include fastcgi_params;
    }

    location ~* \.(js|css|less|png|jpg|jpeg|gif|ico|woff|ttf|svg|tpl)$ {
        expires 24h;
        access_log off;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        log_not_found off;
        access_log off;
    }

    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}
4

4 に答える 4

15

簡単に言うと、以下に示す最初の方法を使用します。

残りの答えは、推奨事項のリストです。

回答を 2 つのセクションに分けます。最初の部分では、目的の URL リクエストに従って目標を達成するための最も簡単で最速の方法を説明しますが、それはアプリの構造を部分的に壊しますが、深刻なことではありません.

2 番目の部分では、構成ファイルのどこで間違いを犯したかを説明し、必要に応じて適切に作成されていない構成を示します。

I. 共有ホスティングの展開

これを使用することを強くお勧めします。これは、プロジェクトを共有ホスティングにデプロイするのに役立ちますが、バックエンドを同じドメインで動作させるための Yii 2 ドキュメントからの公式な方法です。また、追加の nginx 構成は必要ありません。フロントエンド ルートの基本的な構成だけです。

このガイドに従って簡単なリストを書きましょう。

  1. コンテンツを から/backend/webに移動し/frontend/web/adminます。
  2. /frontend/web/admin/index.php(およびindex-test.php、使用する場合は )のスクリプトのパスを修正します。

これですべてです/admin。URL の同じドメインにバックエンドがあります。さらに、Cookie に関するガイドの最後のセクションをお読みください。高度なテンプレートは、環境ごとに異なるドメインを使用するように設計されているため、このガイドでは、共有ホスティングのバックエンド構成について説明し、フロントエンドとバックエンドから Cookie を分離します。

もちろん、スクリプト/environmentsを使用してプロジェクトを適切に初期化するために、ファイルを変更することを忘れないでください。/init

Ⅱ.Nginx の構成

間違い

私はプロの nginx 管理者ではありませんが、私の個人的な経験とドキュメントに基づいて、構成の問題点を説明できます。残念ながら、現在の評価では 2 つ以上のリンクを投稿できないため、ドキュメントへのリンクを提供することはできません。

サーバー コンテキストroot

rootサーバー コンテキストにディレクティブがありません。したがって、~ \.php$場所が一致すると、ルートがまったくなく、デフォルトの nginx ルートが使用されます。コンテキストで共通rootのディレクティブを設定してみてくださいserver。そうすれば、すべての場所にデフォルトで設定されます。例えば:

server {
    # Beginning of your configuration
    # ...

    root /srv/http/yii2/public/frontend/web;

    # The rest of your configuration
    # ...
}

上位のコンテキスト ルートを持たないことは、よくある落とし穴です。

rootそれ以外のalias

次に、場所が一致すると、URIが場所のルートに追加され、サーバーが検索しようとするパスになります。したがって、あなたの/admin場所は、サーバーが を検索することを示唆しています$host_path/backend/web/admin。あなたの状況ではalias、一致した場所のURIがルートに追加されるのではなく、エイリアスパスを参照することをサーバーに伝えるディレクティブを使用する必要があります。

location /admin {
    alias          $host_path/backend/web;

    # The rest of location
    # ...
}

locationrootおよびaliasディレクティブに関する nginx の関連ドキュメントを読むことをお勧めします。

機能しているが構成が不十分

このサンプル構成をコメント付きで投稿するのは、本番環境での使用ではなく、理解のためだけです。本番環境に適用することはお勧めしません (安全で健全であると確信できるまで)。

それは機能しますが、厄介な欠陥があります: バックエンドは Yii2 エントリ スクリプトを直接要求すると (のように) 見つけることができないため、 set toおよびset to/admin/index.phpと共に使用する必要がありますが、バックエンド Web ルートで他の PHP スクリプトを見つけます。enablePrettyUrltrueshowScriptNamefalse

server {
    # The beginning of your configuration
    # ...

    # By default we will provide frontend
    root /srv/http/yii2/public/frontend/web;
    index index.php;

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

    location /admin {
        # We use /web/index here to make backend call to php scripts
        # distinct from frontend call
        index /web/index.php;
        alias $root_base/backend/web;
        try_files $uri $uri/ /web/index.php?$args;

        # Rewrite PHP requests from /admin to /web
        # However, Yii2 entry script returns 404
        location ~ ^/admin/.*\.php$ {
            rewrite ^/admin/(.*)$ /web/$1;
        }

    }

    location ~ ^/web/.*\.php$ {
        # Make sure this location cannot be called externally
        internal;

        # Remember, that the uri of this location
        # will be appended to this root!
        root $root_base/backend;

        # PHP settings for backend
    }

    location ~ \.php$ {
        # PHP settings for frontend
    }

    # The rest of your configuration
    # ...
}

さらに、Yii2 バックエンド構成baseUrlのコンポーネントにプロパティを追加し、それを に設定します。request/admin

Yii2 の高度なプロジェクトを展開し、nginx をさらに理解するのに私の回答が役立つことを願っていますが、あなたの質問は 6 か月前のものです。

于 2015-01-11T18:57:21.127 に答える
0

構成Nginxを指定してみてください:ドメイン構成ファイルで「高度な」テンプレートの構成を使用し、そのためにフロントエンドを指定します:

聞く frontend.site.loc:80; # フロントエンド用

バックエンド ドメインを指定します: listen backend.site.loc:80; # バックエンド用

于 2016-03-01T18:37:03.210 に答える