リバースプロキシリバースプロキシで少し凝ったことをする際、Nginx+Luaで頑張るなど、いくつか手法があります。(個人の意見ですが)どれも使い勝手がいいとは言えません。そこで、「使い勝手のよく、少し凝ったことのできるリバースプロキシサーバー」を作ってみました。実装はGoで、レポジトリはここです。github.com名前はScript+ProxyでScriproxyです。特徴スクリプトを用いて、アップストリームサーバー(プロキシ先)を動的に設定できるリバースプロキシサーバーです。リクエストヘッダーの値や、URLクエリの値、リクエストパスなどをスクリプト内で用いることができます。Tengoを使っており、Goのような直感的な文法でスクリプトを書くことができます。できた標準ライブラリもあります。アップストリームを指定するだけでなく、リクエストヘッダーの値やクエリの値、リクエストパスを書き換えることもできます。message--scriptコマンドライン引数で、スクリプトへのパスを指定します。スクリプトの例は、次のセクションで紹介します。Tengoには質の良い標準ライブラリがあり、それをスクリプト内で用いることもできます。その際は、--librariesコマンドライン引数で、使用しているライブラリを指定する必要があります。textライブラリとfmtライブラリを用いたい場合には--libraries=text,fmtのようにします。具体的な起動コマンドは以下のようになります。fmt,textスクリプト例(実際のシチュエーションを想定したものというよりも、)Scriproxyによって何が可能なのかがわかりやすいものを紹介します。これらを組み合わせて更に複雑なこともできます。スクリプト内で使える値や関数については次のセクションで補足しています。"example.com"このスクリプトによって、プロキシサーバーに対して送られたリクエストはhttps://example.comに流されます。リクエストヘッダの値やクエリパラメータの値は変更されずにプロキシ先に送られます。クエリパラメータを用いる場合アップストリームサーバーの選択にクエリパラメータを用いることができます。/foo?host=example.com&scheme=httpへのリクエストはhttp://example.com/fooに、/foo?host=example.org&scheme=httpsへのリクエストはhttps://example.org/fooへと流されます。Hostヘッダーを用いる場合リクエストヘッダーのHostの値を用いてプロキシ先を指定することもできます。example.com.secure.localが指定されていればhttps://example.comに、example.com.localが指定されていればhttp://example.comにリクエストがプロキシされます。リクエストヘッダを用いる場合Host以外のリクエストヘッダを用いることもできます。req.url.hostこのスクリプトを用いると、iPhoneからのリクエストはhttps://example.orgに、それ以外のリクエストはhttps://example.comに流されます。"...")は機能しません。Hostヘッダーを書き換える際にはreq.hostを書き換える必要があります。これは、Goのhttp.Requestの挙動に沿っています。req.url.pathが値として使え、書き換えることもできます。req.url.query.del("key")の4つの関数がクエリパラメータの参照/書き換えに使用できます。req.header.del("key")の4つの関数がリクエストヘッダの参照/書き換えに使用できます。以上の値/関数の挙動はGoのhttp.Requestと似せています。4コアマシンで秒間数千リクエスト通せるはずです。ロギングの機能も入れています。07:00少し凝ったことを(簡単に)できるリバースプロキシサーバーをGoで書いてみた関連記事2019-02-13Express/Node.jsでTypeScriptを使ってみる最近、バックエンド開発でNode.jsを用いています。特徴まとめAWSを使っている人全員が触ったことがあるであろうS3。(1)リンクホームページfeedレビューのまとめスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。