Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
177 lines (137 sloc) 6.8 KB

プロキシサーバを作って覚えるHTTP

@tsucchi

自己紹介

  • 土田 拓也(つちだ たくや)

  • @tsucchi とか blog(http://tsucchi.github.io/)とか

    • こんなかんじのアイコンです
    • Perlミルキィホームズが好きです
  • 株式会社シャノンというところで、エンジニアやってます

    • Perl とか SQL とか書いたり
    • パフォーマンスとかセキュリティのこと考えたり
    • たまにスクラムっぽいことやってたり、そんな感じ

今回のテーマ

  • 「エンジニアとして何を考え、何をみて、どんな行動をしているか?」 又は、「エンジニア以外の立場から視たエンジニアについて」
  • で、今日のタイトル

プロキシサーバを作って覚えるHTTP

@tsucchi

今回のテーマ

  • すいません。あんまり関係なかったかも...

背景

  • 昨今のWebアプリケーションは、複数のサービスを組み合わせて動かしています
  • 一方で、サービスのドメインは単一だったりします
    • 顧客から見ると、ワンストップの方が安心感があるから(?)
    • そもそもモノリシックだったものを管理性のためにマイクロサービス化してたりとか

  • /static 以下の画像, CSS, JSなどは CDN(CloudFrontとかAkamaiとかFastly etc)に
  • /aaa 以下は「サービスAに」
  • /bbb 以下は「サービスBに」

...みたいな

困っていること

  • 開発時に複数のサービスを立てたい
  • 本番と同じように、複数のサービスに振り分けるやつが欲しい

困っていること

  • 開発時に複数のサービスを立てたい
    • foreman(Ruby) とか Proclet(Perl)とか使えば可能
  • 本番と同じように、複数のサービスに振り分けるやつが欲しい
    • プロキシサーバを立てれば可能

プロキシサーバを立てれば可能

プロキシサーバを立てれば可能

  • そうなんだけど、割と面倒くさい
    • 最近は docker あるので、nginx か apache のイメージ配ればいいんだけど...
      • ので他のメンバーはそうしてもらっている
  • 僕は開発用のプロキシを分けたかった
    • 次回のメンテで実施する為の設定を試してたりする
    • 設定を頻繁に変えてるので、開発環境の想定と齟齬が出て割と困る

そうだ、プロキシサーバを作ろう

今回のテーマ

  • 「エンジニアとして何を考え、何をみて、どんな行動をしているか?」 又は、「エンジニア以外の立場から視たエンジニアについて」

よかった。テーマっぽい話ができた(本当か?)

そうだ、プロキシサーバを作ろう

  • 実際にプロキシサーバを作ってみると、色々ハマりどころがあって、HTTP の理解が進みます

本質的な部分

だけ

ハマりどころ1(リダイレクト)

  • https://gist.github.com/tsucchi/582f2b5eb0cea09236348b95d15e5e9e#file-reproxy-pl-L16
  • Furl などの HTTP クライアントは「いい感じに」リダイレクトを処理してくれる
  • 一方、プロキシサーバは勝手にリダイレクトされると困る
    • リダイレクト前にブラウザに渡している色々な情報が欠落して訳分からない動作になる
    • その辺を処理してあげてもいいかもだけど、リダイレクトをやめてブラウザにやらせる方が楽

ハマりどころ2(ヘッダ)

ハマりどころ3(レスポンスの圧縮)

ハマりどころ4(body)

ハマりどころ4(body)

my $uri_for_body = URI->new();
$uri_for_body->query_form( $c->req->body_parameters );
(my $body = $uri_for_body->as_string) =~ s{\A\?}{};
return $body
  • とはいえ、POSTパラメータだけでしょ?
    • そうなんだけど、そうじゃない

ハマりどころ4(body)

ハマりどころ4(body)

That's all?

  • この辺の対応を入れたら、ほぼそれっぽく動くようになった
  • 完璧かどうか、と言われると微妙

まとめ

  • プロキシサーバを作ってみました
  • シンプルだけど、微妙にハマりどころがある
    • ブラウザからもらった値をサーバに渡す
    • サーバから返った値をブラウザに返す
    • ...だけなんだけど、だけじゃない
  • 作ってみると、HTTP の知らなかったことが知れて結構楽しい
    • multipart/form-data のパラメータ渡しとか、知らなかった

おしまい