[解決済み] バックグラウンドでリクエストするようにnginxを設定する
質問
私は、APIとデータの組み合わせの使用に関するいくつかの分析を行う必要があるアプリケーションを構築しています。 以下は私のnginxの設定です。
location /r/ {
rewrite /r/(.*)$ http://localhost:3000/sample/route1/$1 redirect;
post_action /aftersampleroute1/$1;
}
location /aftersampleroute1/ {
rewrite /aftersampleroute1/(.*) /stats/$1;
proxy_pass http://127.0.0.1:3000;
}
場所
/r/
は、ブラウザのリクエストをリダイレクトするために使用されます。
http://localhost:80/r/quwjDP4us
からAPIへ
/sample/route1/quwjDP4us
を使用し、id
quwjDP4us
を実行しています。
今度はバックグラウンドで
quwjDP4us
をstatsのapiに送る。
/stats/quwjDP4us
で、そのIDのDBレコードを更新します。
nginxを起動し、リクエストを行うと
http://localhost:80/r/quwjDP4us
nginxは私のリクエストを私のアプリケーションにうまくリダイレクトしますが、バックグラウンドでstats apiに2回目のリクエストを行いません。何が足りないのでしょうか?
注 -
post_action
は nginx のドキュメントに含まれていません。代わりに使えるモジュールやディレクティブはありますか?
解決方法を教えてください。
ご指摘の通りです。
post_action
は文書化されておらず、常に非公式なディレクティブと見なされてきました。
Nginx はバージョン 1.13.4 以降、新しい "mirror" モジュールを提供しており、その内容は以下のとおりです。 こちら をご覧ください。というわけで、試してみることをお勧めします。あなたの場合、次のようになります。
location /r/ {
rewrite /r/(.*)$ http://localhost:3000/sample/route1/$1 redirect;
mirror /stats;
}
location = /stats {
internal;
rewrite /sample/route1/(.*) /stats/$1;
proxy_pass http://127.0.0.1:3000;
}
これはうまくいきません!
テスト用コンフィギュレーションを構築してみましたが、残念ながらこれは動作しません。 以下のいずれでも動作します。
rewrite
また
return
. しかし、それは
proxy_pass
.
なぜ
以下に説明します。HTTPリクエストは、Nginxでの処理中にいくつかのフェーズを順次通過します。というものです。
mirror
がトリガーされます。
PRECONNECT
よりも後に発生するフェーズ
REWRITE
ここで
rewrite
/
return
リクエスト処理を終了します。そこで
mirror
はトリガーされません。
ロケーションからファイルを提供する場合や、プロキシを経由して
proxy_pass
(または
fastcgi_pass
など)に到達すると、処理は最終的に
REWRITE
フェーズと
mirror
が実行されます。
フェーズはNginxのドキュメントに記載されています。 こちら .
回避策
トレードオフのない良い解決策は見当たりません。余分なロケーションを作成して (リダイレクトを返す)、リクエストのプロキシを
/r/
というように
mirror
がトリガーされます。残りの設定によりますが、このような感じです。
location /r/ {
# you may need setting Host to match `server_name` to make sure the
# request will be caught by this `server`.
# proxy_set_header Host $server_name;
proxy_pass http://<ip from listen>:<port from listen>/redirect/;
mirror /stats;
}
location = /redirect {
rewrite /redirect(.*)$ http://localhost:3000/sample/route1$1 redirect;
}
確かにこれは最適とは言えず、余計な定型文がある。
関連
-
[解決済み] Nginx 無効なPID番号
-
ブラウザエラー net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK) 解決策
-
Gitはいくつかのバグフィックスを行いました。マージされていないファイルがあるため、Pullができない。
-
Nginxのエラー「The plain HTTP request was sent to HTTPS port」の解決方法。
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Node.js + Nginx - 今度は何?
-
[解決済み] プロキシサーバーで Git を動かす - "Request timed out" で失敗する
-
[解決済み] Nginx -- rootとaliasによる静的ファイル提供の混乱
-
[解決済み] nginxです。[emerg] "server" ディレクティブはここでは許可されません。
-
[解決済み] MIMEタイプ "text/html "が重複している?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] nginxリクエストで許容されるurlの長さを設定する方法 (エラーコード: 414, uri too large)
-
OSError: [Errno 98] アドレスはすでに使用中です。
-
アップストリームエラーの読み込み中に、アップストリームが接続を早々に切断した
-
チャンクベンダーが大きすぎるため、最初の画面の読み込みが遅すぎるフロントエンド・プロジェクトの最適化
-
Nginxのエラー「The plain HTTP request was sent to HTTPS port」の解決方法。
-
[解決済み] nginx - 2つのサブドメインの設定
-
[解決済み】NGinx デフォルトの公開WWWの場所は?
-
[解決済み】nginxのsites-availableディレクトリが見つからない。
-
[解決済み] nginx が空白の PHP ページを表示する
-
[解決済み] React-routerとnginx