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

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

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

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

Q&A

解決済

3回答

2145閲覧

location ~ 正規表現のマッチでproxy_passが動作しない

tera1pacific

総合スコア3

nginx

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

0グッド

0クリップ

投稿2019/08/22 02:15

nginxにて下記のような設定でプロキシサーバを構築しております。
この設定でプロキシは正常に動作しております。
location /sub/host-a:10001/ { proxy_pass http://host-a:10001/; }
location /sub/host-a:10002/ { proxy_pass http://host-a:10002/; }
location /sub/host-a:10003/ { proxy_pass http://host-a:10003/; }
location /sub/host-b:10011/ { proxy_pass http://host-b:10011/; }
location /sub/host-b:10012/ { proxy_pass http://host-b:10012/; }
location /sub/host-b:10013/ { proxy_pass http://host-b:10013/; }
location /sub/host-c:10101/ { proxy_pass http://host-c:10101/; }
location /sub/host-c:10102/ { proxy_pass http://host-c:10102/; }
location /sub/host-c:10103/ { proxy_pass http://host-c:10103/; }
※例としてプロキシ先のホストとポートに規則性があるように書いていますが実際は不規則、且つプロキシ先の数も動的となっております。

上記のlocation設定を以下のように正規表現で記述できると思っているのですがプロキシされず404エラーとなってしまいます。
location ~ ^/sub/(.*)$ { proxy_pass http://$1; }

設定のどこがいけないのか教えていただけないでしょうか?

サーバの緒元は以下の通りです。
$ cat /etc/system-release
CentOS Linux release 7.4.1708 (Core)

$ rpm -qa | grep nginx
nginx-mod-http-geoip-1.12.2-1.el7.x86_64
nginx-mod-http-image-filter-1.12.2-1.el7.x86_64
nginx-filesystem-1.12.2-1.el7.noarch
nginx-mod-stream-1.12.2-1.el7.x86_64
nginx-mod-http-perl-1.12.2-1.el7.x86_64
nginx-1.12.2-1.el7.x86_64
nginx-all-modules-1.12.2-1.el7.noarch
nginx-mod-http-xslt-filter-1.12.2-1.el7.x86_64
nginx-mod-mail-1.12.2-1.el7.x86_64

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

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

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

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

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

TaichiYanagiya

2019/08/23 05:52

設定は合っていると思います。 Nginx の error_log に何か出力されないか、ログレベルをあげるなどして確認ください。
Y.H.

2019/08/23 06:10

試しにproxy_passではなくrewriteで301リダイレクトにした場合、 location ~ ^/sub/(.*)$ { rewrite http://$1 redirect; } レスポンスヘッダーのLocationには想定通りのもの http://host-a:10001/ が返ってくるでしょうか?
tera1pacific

2019/08/23 07:27

location ~ ^/sub/(.*)$ { rewrite http://$1 redirect; } だと正規表現がマッチしないようです。 2019/08/23 16:21:13 [debug] 1626#0: *1 http request line: "GET /sub/host-a:10001/ HTTP/1.1" 2 2019/08/23 16:21:13 [debug] 1626#0: *1 http uri: "/sub/host-a:10001/" 2019/08/23 16:21:13 [debug] 1626#0: *1 http args: "" 2019/08/23 16:21:13 [debug] 1626#0: *1 http exten: "" 2019/08/23 16:21:13 [debug] 1626#0: *1 http process request header line 2019/08/23 16:21:13 [debug] 1626#0: *1 http header: "User-Agent: curl/7.29.0" 2019/08/23 16:21:13 [debug] 1626#0: *1 http header: "Host: localhost" 2019/08/23 16:21:13 [debug] 1626#0: *1 http header: "Accept: */*" 2019/08/23 16:21:13 [debug] 1626#0: *1 http header done 2019/08/23 16:21:13 [debug] 1626#0: *1 event timer del: 7: 1566544933546 2019/08/23 16:21:13 [debug] 1626#0: *1 generic phase: 0 2019/08/23 16:21:13 [debug] 1626#0: *1 rewrite phase: 1 2019/08/23 16:21:13 [debug] 1626#0: *1 test location: "/" 2019/08/23 16:21:13 [debug] 1626#0: *1 test location: "50x.html" 2019/08/23 16:21:13 [debug] 1626#0: *1 test location: ~ "^/sub/(.*)$" 2019/08/23 16:21:13 [debug] 1626#0: *1 posix_memalign: 0000556E020C39D0:4096 @16 2019/08/23 16:21:13 [debug] 1626#0: *1 using configuration "^/sub/(.*)$" 2019/08/23 16:21:13 [debug] 1626#0: *1 http cl:-1 max:1048576 2019/08/23 16:21:13 [debug] 1626#0: *1 rewrite phase: 3 2019/08/23 16:21:13 [debug] 1626#0: *1 http script regex: "http://$1" 2019/08/23 16:21:13 [notice] 1626#0: *1 "http://$1" does not match "/sub/host-a:10001/", client: 127.0.0.1, server: _, request: "GET /sub/host-a:10001/ HTTP/1.1", host: "localhost"
TaichiYanagiya

2019/08/23 09:18

「using configuration "^/sub/(.*)$"」ですので、正規表現にはマッチしています。 rewrite の書式が違います。 「location ~ ^/sub/(.*)$ { rewrite ^/sub/(.*)$ http://$1 redirect; }」
guest

回答3

0

自己解決

私の伝え漏れなので恐縮ですがhost-aは/etc/hostsで名前解決しておりました。
が正規表現を使ったproxy_passでは/etc/hostsで名前解決されないようでしたので
location ~ ^/sub/(.*)$ {
proxy_pass http://$1;
}
2019/08/23 15:30:59 [error] 394#0: *1 no resolver defined to resolve host-a, client: 219.117.241.32, server: _, request: "GET /sub/host-a:10001/ HTTP/1.1", host: "localhost"

プロキシサーバ上でdnsmasqを稼働させ、nginxにresolver設定を追記することで無事プロキシできました。
location ~ ^/sub/(.*)$ {
resolver 127.0.0.1;
proxy_pass http://$1;
}
2019/08/24 09:11:55 [debug] 19327#0: *1 http upstream resolve: "/sub/host-a:10001/?"
2019/08/24 09:11:55 [debug] 19327#0: *1 name was resolved to 192.168.1.7

皆さま沢山のアドバイス
誠にありがとうございました。

投稿2019/08/24 00:24

tera1pacific

総合スコア3

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

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

0

:(コロン)って、URLエンコードされて%3Aでリクエストされるんじゃないでしょうか?
なので、正規表現にマッチせずプロキシサーバ自身の/sub/host-a:10001/にアクセスされてしまうのでは?

RFC3986 日本語訳の複製 Uniform Resource Identifier (URI): 一般的構文 - 2.2. 予約文字
※原文 RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax - 2.2. Reserved Characters

URI 構成要素についてのデータがデリミタとして予約されている文字の目的と競合する場合、競合するデータは URI が形成される前にパーセントエンコーディングされなければならない。

reserved = gen-delims / sub-delims

gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="

投稿2019/08/23 05:38

編集2019/08/23 05:52
Y.H.

総合スコア7914

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

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

tera1pacific

2019/08/23 05:53

ご指摘ありがとうございます。 :(コロン)の代わりに_(アンダバー)を利用して location ~ ^/sub/([^_]+)_(.*)$ { proxy_pass http://$1:$2; } の設定で http://(プロキシサーバ)/sub/host-a_10001/ にアクセスしてもプロキシサーバ自身にアクセスしてしまいました。 以下の設定であればhost-a:10001に正常にプロキシされるのですが・・・ location /sub/host-a:10001/ { proxy_pass http://host-a:10001/; }
guest

0

location ~ ^/sub/(.*)$ { proxy_pass http://$1; }

404エラー(NotFound)となっている原因は特定していますか。
期待値となるURLが生成されてないということでしょうか。
プロキシのログは確認されてますか。
ホストのログは確認されてますか。

どんなURLが生成されているかわからないのでしたら、下記を参考にログに吐き出すようにしてみたら如何でしょうか。
nginx で proxy_pass の行き先をログに出す、複数ログファイルを指定する

投稿2019/08/23 04:35

yukky1201

総合スコア2751

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

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

tera1pacific

2019/08/23 05:18

回答ありがとうございます。 生成させたいURLは プロキシサーバの設定が location ~ ^/sub/(.*)$ { proxy_pass http://$1; } の時 プロキシサーバに http://<プロキシサーバ>/sub/host-a:10001/ のアクセスが来たら http://host-a:10001/にプロキシさせたいのですがプロキシされずに プロキシサーバ自身の/sub/host-a:10001/にアクセスしてしまい404エラーとなっております。 教えていただいたサイトを参考にupstream.logの出力の設定を行いましたが、なぜかupstream.logに何も出力されませんでした。
yukky1201

2019/08/23 05:55

ログは、出力されたものをそのまま質問に追記するかたちで提示してください。事実確認のための情報源となります。 upstream.logへ出力されないのは、プロキシサーバ自身のアクセスとなっているためと推測されます。外部に行ってないため。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問