nginx でパスを使用しているときにリバース プロキシが機能しないという問題が発生しています。アプリケーションに 1 つのアドレスを設定し、パスを使用して環境を指定しようとしています。パスによっては、別のサーバーを指すことになります。直接リンクを使用するとリバース プロキシが機能しますが、パスを使用すると 404 エラーが発生します。
app.foo.bar/dev = 404 エラー devapp.foo.bar = 成功
app.foo.bar/dev で何を間違えたのでしょうか?
以下は動作しているリバース プロキシの設定ですが、私は使用しません。
server {
listen 80; # DEV Application Proxy
server_name devapp.foo.bar;
location / {
proxy_pass http://appserver.foo.bar:7010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect http://appserver.foo.bar:7010/ /;
proxy_connect_timeout 300;
}
}
以下は、パスを使用して実行しようとしているが、404 エラーが発生している部分です。
# APP Environment Proxy
server {
listen 80;
server_name app.foo.bar;
location /dev {
proxy_pass http://appserver.foo.bar:7010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect http://appserver.foo.bar:7010 /;
proxy_connect_timeout 300;
}
}
このタイプの設定を Google で検索しましたが、解決策が見つかりません。ご協力いただければ幸いです。
答え1
がある場合proxy_pass http://appserver.foo.bar:7010;
、nginx はバックエンドに渡されるリクエスト URL に正規化された URI を追加します。
したがって、 をリクエストするとhttp://app.foo.bar/dev
、リクエストは に送信されますhttp://appserver.foo.bar:7010/dev
。開発サーバーにこのパスがない場合は 404 が返され、nginx はそれをクライアントに返します。
で始まるすべてのリクエストhttp://app.foo.bar/dev
を送信し、http://appserver.foo.bar:7010
残りのすべての URI がバックエンド サーバー URI に追加されるようにするには、次の構成を使用できます。
location ~ ^/dev(.+)$ {
proxy_pass http://appserver.foo.bar:7010$1$is_args$args;
...
}
したがって、正規表現の後の部分を/dev
変数にキャプチャし、その変数をproxy_pass
パスの末尾に追加します。