nginx のリバース プロキシ エイリアスの背後にあるネット
P粉953231781
2023-09-04 00:28:05
<p>Apache2/Debian 11 サーバー上で Nette アプリケーションを実行していますが、正常に動作します。ただし、エイリアスを使用して nginx プロキシの背後に隠す必要があります。 </p>
<p>http://127.0.0.1:89/ で実行されている完璧な Apache2 環境があり、https://example.com /applications/ でリバース プロキシとして設定された nginx 経由でそれにアクセスしたいとします。< ;/p>
<p>nginx の設定は次のとおりです。</p>
<pre class="brush:php;toolbar:false;">location /app/ {
プロキシパス http://127.0.0.1:89;
proxy_set_header ホスト $host;
proxy_set_header X 転送ホスト $host;
proxy_set_header X-Forwarded-Proto "https";
proxy_set_header X 転送ポート "443";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}</pre>
<p>プロキシが試行するまで、Apache2 構成は変更されません: </p>
<pre class="brush:php;toolbar:false;"><VirtualHost *:89>
ServerAdmin webmaster@localhost
ドキュメントルート /var/www/app/www/
<ディレクトリ /var/www/app/www/>
オプション インデックス FollowSymLinks
すべてのオーバーライドを許可
すべての付与を要求する
</ディレクトリ>
</VirtualHost></pre>
<p>問題は、Nette アプリケーションが「/app」URI 部分のないパスで実行されていると依然として認識しているため、リダイレクトとリンク呼び出しによって生成されたすべてのリンク ($basePath テンプレート変数を含む) が無効になることです。 < /p>
<p>プロキシ情報も Nette 構成に追加しました。nginx インスタンスは同じサーバー上で実行されているため、次のようになります。</p>
<pre class="brush:php;toolbar:false;">http:
プロキシ: 127.0.0.1</pre>
<p>転送される URI で /admin パスを転送するように nginx 構成を設定してみました: </p>
<pre class="brush:php;toolbar:false;">proxy_pass http://127.0.0.1:89/admin;</pre>
<p>また、Nette ルーターをいじって「admin/」部分をフィルタリングしてみました (明らかに欠落している AdminPresenter は検索しません)。 </p>
<pre class="brush:php;toolbar:false;">$router->addRoute('[admin/]<presenter>/<action>[/<id>]', 'ホームページ:デフォルト');
<p>Nette アプリケーションは、ページにアクセスしようとすると次のエラーを生成します: </p>
<pre class="brush:php;toolbar:false;">TypeError: unpack() はパラメータ 2 が文字列であることを予期しており、/var/www/app/vendor/nette/http/src/Http/Helpers で指定されたブール値になります。 .php:49 @ http://example.com/app/</pre>
<p>誰かが私に正しい方向を教えてくれませんか? </p>
さて、他の人が同じ問題を抱えている場合に備えて、私自身の質問に答えます。私の解決策はちょっとしたハックのような気がするので、ハック以外の回答を自由に投稿してください。
まず、nginx 構成を変更しました:
リーリー次に、すべてのプロキシをカバーするように Nette 構成を変更しました (おそらく実際には必要ありません)。 リーリー
ルーター コードに「app」ルートも追加しました (オプションのプレフィックスとしてではなく、通常のルートとして):リーリー
BasePresenter コードの起動メソッドも変更されました:リーリー
最後に、.htaccess ファイルを変更して、すべての静的リソースの URL を「app」部分を含まないパスに書き換えました。 リーリーApache 仮想ホストは変更されません。
このようにして、nginx は完全なリクエスト URL (「app」を含む) を Apache に渡し、Apache は「app」プレフィックスを使用して Nette ルーターを呼び出します。 「アプリケーション」は URL の一部であり、Nette によっても認識されているため、ルーティングは正常に機能します (実際にはリクエスト ヘッダーに完全に存在するため)。これにより、
$basePathとリンク/リダイレクトが機能します。
ただし、静的リソースは Nette ルーターを通じて提供されないため、
app/プレフィックスにより、Apache はファイルを見つけられず、404 を報告します。書き換えルールを追加すると、静的リソースの URL から
これはハック的ですが、プロキシ アクセスと非プロキシ アクセスの両方で機能します。
app/
プレフィックスが削除されるのはこのためです。