maco's life

主にエンジニアリングと読書について書いていきます。

Proxyがわからん

はじめに

エンジニアを生業として、いつの間にか10年が過ぎました。10年という年月は過ぎましたが、恥ずかしながらProxyについてはあまり理解が深くなく、正直以下ぐらいの認識でした。

  • Proxyはリクエストをよしなに流してくれる機構
  • 有名なものだとReverse Proxyとして、Nginxがある

Nginxで何ができるかとかはよく理解していますが、ProxyとReverse Proxy違いってなんだと言われるとちゃんと答えられないなとおもったので、今回はそれについて調べた備忘録になります。

普段これ系の調べ事をブログにすることはあまりないのですが、文字に起こさないと記憶に定着しにくいという点と、ブログにすることで少しは調べて書こうという意識が働くかなと思い今回はブログにしています。

RFCを調べる

RFC 9110に HTTPに関する基本的な概念がまとまっていて、その中にもProxy、Reverse Proxyについての説明がありました。以下引用。

Proxy

A "proxy" is a message-forwarding agent that is chosen by the client, usually via local configuration rules, to receive requests for some type(s) of absolute URI and attempt to satisfy those requests via translation through the HTTP interface. Some translations are minimal, such as for proxy requests for "http" URIs, whereas other requests might require translation to and from entirely different application-level protocols. Proxies are often used to group an organization's HTTP requests through a common intermediary for the sake of security services, annotation services, or shared caching. Some proxies are designed to apply transformations to selected messages or content while they are being forwarded, as described in Section 7.7.

「プロキシ」は、通常、ローカル構成ルールを介してクライアントによって選択され、絶対URIの何らかのタイプのリクエストを受信し、HTTPインターフェイスを介して翻訳を介してそれらのリクエストを満たそうとするメッセージに選択されるメッセージです。「HTTP」URIのプロキシリクエストなど、一部の翻訳は最小限ですが、他のリクエストでは、まったく異なるアプリケーションレベルのプロトコルとの翻訳が必要になる場合があります。プロキシは、セキュリティサービス、注釈サービス、または共有キャッシュのために、一般的な仲介者を通じて組織のHTTP要求をグループ化するためによく使用されます。一部のプロキシは、セクション7.7で説明されているように、転送中に選択されたメッセージまたはコンテンツに変換を適用するように設計されています。

ちょっと翻訳は難しいけど、組織のHTTP要求のグループ化とあるので以下のような使い方がProxyサーバーを指していそう。

クライアントPC -->  プロキシサーバー -->  インターネット -->  目的のサーバー

組織内で特定のサイトへのアクセスを弾いたり、通信の効率化をしたりなど同じネットワーク内のでoutbound-gateway的なものを指していそう。

Reverse Proxy

A "gateway" (a.k.a. "reverse proxy") is an intermediary that acts as an origin server for the outbound connection but translates received requests and forwards them inbound to another server or servers. Gateways are often used to encapsulate legacy or untrusted information services, to improve server performance through "accelerator" caching, and to enable partitioning or load balancing of HTTP services across multiple machines.

「ゲートウェイ」(別名「リバースプロキシ」)は、アウトバウンド接続のオリジンサーバーとして機能するが、受信したリクエストを変換し、別のサーバーまたはサーバーにインバウンドする仲介者です。ゲートウェイは、レガシーまたは信頼できない情報サービスをカプセル化し、「アクセラレータ」キャッシングを介したサーバーのパフォーマンスを改善し、複数のマシンにわたるHTTPサービスのパーティションまたはロードバランスを有効にするために、多くの場合使用されます。

そもそもリバースプロキシではなく、ゲートウェイが正式っぽい名称ということを今知った。 こちらはインバウンドする仲介者という独特な表現になっているが以下のように、外からのリクエストに対して処理を行っている。

クライアントPC --> インターネット -- > リバースプロキシサーバー --> 内部サーバー

Proxyと逆の立場にいるからReverse(逆) Proxyって呼ばれてるっぽい。

雑まとめ

どちらも似たような機構だけど、端的にクライアントとサーバーどちら側の代わりに返答するかが一番の違い。 Proxyは間に挟むことでIP隠すとかできるし(串ってやつ)、Reverse Proxyはサーバーの負荷分散に使えたりという目的の違いがでてくる。 しかし基本的な考えは一緒で、RFC 9110にProxyは◯◯であるべき、〇〇をしてはいけないがいたるところに書いてあるので、それを守っているのが(Reverse)Proxyサーバーとよべる。

Proxyの指定とか

http clientでProxyオプションを指定できる。例えば私が慣れ親しんでいるRuby gemのFaradayでは以下のように指定できる。

connection = Faraday.new(url: 'http://example.com') do |faraday|
  faraday.proxy 'http://proxy.example.com:8080'
end

この場合、Faradayとしてはリクエスト先は http://proxy.example.com:8080になるが、プロキシサーバーには以下をおくる。

GET http://example.com/path HTTP/1.1
Host: example.com
Connection: close

Proxyサーバーからターゲットサーバーへは宛先URIで送ることで、Proxyを実現している

GET /path HTTP/1.1
Host: example.com
Connection: close

RFCを深く終えてないが前者は完全URIなので、それによってProxyを期待されてきたリクエストかどうかを判別する仕組みになってそう。 2006年の日経techにもそれっぽい記載があった。 Webアクセスの基本(6) | 日経クロステック(xTECH)

まとめ

日経techの記事のタイトルが「Webアクセスの基本」となっており、エンジニア10年以上やってそんなのことも知らなかったとお恥ずかしい限りです。 まだまだ知らないことがあるので勉強していきます...λ