質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

解決済

2回答

7011閲覧

nginx でパスによりリバースプロキシ先を変更する方法

extusr

総合スコア31

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

0クリップ

投稿2016/08/19 06:32

編集2016/08/19 11:53

###前提・実現したいこと
nginx でパスによりリバースプロキシ先を変更したいと考えています。
具体的には、下記を実現したいです。
・基本、192.168.0.2 をリバースプロキシ先とする
・/test/… というパスのみローカルをリバースプロキシ先とする

###該当のソースコード
nginx.conf に下記のような記載をしました。

user nginx nginx; … http { upstream backend { server 192.168.0.2:80; } server { listen 80; root /var/www; … location / { proxy_pass http://backend; } location /test/ { proxy_pass http://127.0.0.1/:80; } } }

###エラー等
上記を設定の上、/test/ にアクセスしますと、リバースプロキシ先が 192.168.0.2 になってしまうようなのです。
nginx のログを見ると下記の表記が見られます。
… upstream: "http://192.168.0.2:80/", …

正しい設定の仕方をご助言願えないでしょうか。

###補足情報(言語/FW/ツール等のバージョンなど)
・CentOS 7.2
・nginx 1.11.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

「/test/」のプロキシ「http://127.0.0.1:80」は nginx 自身ですか?
「/test/foo.html」→「http://127.0.0.1:80/test/foo.html」となるので、バーチャルホストで分けているのでなければ、ループするのではないでしょうか。

http://127.0.0.1:80/」(最後にスラッシュあり)であれば、パスを変換しますので、「/test/foo.html」→「http://127.0.0.1:80/foo.html」→location / で処理→「192.168.0.2:80/foo.html」となります。

###(2016/08/20 00:16) 追記
http://127.0.0.1/:80」だと余計おかしくなりませんか?

「/test/」でローカルの「/var/www/」ディレクトリ以下を参照したいということであれば、リバースプロキシーにするのではなく、root や alias でディレクトリを指定すればいいと思います。

(設定例) location /test/ { alias /var/www/; index index.html index.htm; }

投稿2016/08/19 10:57

編集2016/08/19 15:16
TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extusr

2016/08/19 11:52 編集

大変貴重なご助言をたまわりまして誠にありがとうございます。 ご確認いただいた事項についてですが、http://127.0.0.1:80 は nginx 自身ということでお間違いありません。 失礼しました。 質問内容に記載した conf には誤りがありました。 実際には http://127.0.0.1/:80 となっておりました。 そのため、後者にある「パス変換により location / で処理されてしまった」パターンになっていたという理解でお間違いないでしょうか。 バーチャルホストの場合は単純に取り扱いができないのですね…。 プロキシの振り分け条件としまして、ローカルで処理したいものは「/test/」であることと「ホスト名が IP であること」の2点があります。 それを利用して、今度は下記のようにホスト名が IP であるならば、という条件で振り分けをおこなおうとしました。 … if ($host ~* ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$) { location / { proxy_pass http://127.0.0.1/:80; break; } } … しかしながら、"location" directive is not allowed here エラーとなってしまいした。 if 内には location の記述ができないということのようですが、なにか解法はありませんでしょうか。 あらためまして、ご助言をいただけましたらうれしいです。
extusr

2016/08/19 21:49

ありがとうございます! 期待どおりの挙動となりました! お恥ずかしながら、proxy_pass が設定のベース、必須となる項目であると勘違いしておりました。 大変勉強になりました。 心より感謝申し上げます!
guest

0

以下の順にすればいかがでしょうか?

location /test/ location /

投稿2016/08/19 06:50

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extusr

2016/08/19 06:51

ご助言いただきましてありがとうございます。 逆順にしても同様の結果となりました。
moonphase

2016/08/19 06:54

細かい話で申し訳ありませんが、設定変更後にreloadまたはrestartは実施しましたでしょうか?
extusr

2016/08/19 07:05

ご指摘たまわりまして誠にありがとうございます。 conf 変更後 restart をしております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問