この記事は自分がwebアプリケーションからのリクエストをさばいてレスポンスを返す仕組みをレンタルサーバーにて実現する過程で身に着けた知識を記したものです。細かいところが間違っている可能性があります。また知った知識を順次メモ書きしていくのでこの記事は順次更新されていきます。この記事では様々な事情からサーバー側の処理言語としてGOを使用します。
現在未完
レンタルサーバーでGOを動かしリクエストをさばいていきます。レンタルサーバーはXServerを使用して行きます。
XServerはWebサーバーとしてNginxとApacheを使用していますが、ユーザーにはroot権限が渡されないのでコンフィグファイルを直接いじれず.htaccessファイルをいじることでしかファイルアクセスの方法を見つけられませんでした。そこで自分なりの解決策としてCGIを使ってGOプログラムを外部から使用することにしました。
そこで次に必要となった知識がGOでHTTPによるリクエストをさばく方法です。
CGI(Common Gateway Interface) : サーバー上にプログラムを置いてHTTPリクエストによりサーバー上でプログラムを走らせる。WebフロントにとってはJavaScriptとの違いが分かりにくくなりやすいが、JavaScriptは通常サーバー上で動くのではなく、サイトをダウンロードした際にJavaScriptプログラムもダウンロードしPC上で実行している。何らかの情報ファイルへのアクセスはAPIをPC上からJavaScriptを通して呼び出すことで行われるが、CGIとはその際に使われるサーバー上の窓口のようなものであり、HTTPによるリクエストでサーバーに関数を実行してもらう。
FCGI(FastCGI) : CGIの改良版。CGIは一呼びかけ一起動だが、FCGIは一呼びかけ一定時間起動となり高速化と負荷の軽減が実現できる。
サーバー関係の知識を整理するために各個人が持つPCからのデータの流れを一度書き記す。
HTTPリクエストをさばくサーバのことをHTTPサーバという。
HTTPサーバは自身のホスト名(IP)とポート番号(:3000, :8000等)を持つ。
HTTPサーバは一つのHTTPリクエスト(URL)に対する処理する関数を持ちこれをハンドラという。このサーバーはこのハンドラを複数持つことでさまざまなリクエストをさばくことができる。
この先の話は少しURLの知識が必要となる。
URLは通常 http://domain.com/api/function1/data1
のように記述されているが domain.comのことをドメインと呼びこれはネット上で事前に登録されたIPアドレスに変換される。例えば190.335.6466というIPアドレスのサーバーがあったとすると、このIPアドレスをdomain.comですよとネットワーク上で設定しておくことで初めて外部からdomain.comを通して各サーバにアクセスできるようになる。
このドメインを通してアクセスされたサーバは以降のapi/function1/data1の部分の処理をする。サーバはエントリポイントというものをもつ。エントリポイントとは、このフォルダ下のデータへURLをもとにアクセスしますよというものである。ここではapiをエントリポイントとしている。
話を戻して、http://domain.com/apiというURLのエントリポイントとハンドラをfunctionの部分を接続点として結びつけることをルーティングという。このルーティングによってhttp://domain.com/api/function1のURLにリクエストを送ることでサーバに特定の処理をさせることができる。
"net/http/cgi"
パッケージを使うhttp.HandleFunc("/", handler関数)
でハンドラを設定err = cgi.Serve(nil)
でCGIの処理開始[1] Goのhttp.Handlerやhttp.HandlerFuncをちゃんと理解する - oinume journal
[2] python でお気楽Webサーバを構築してCGIのテスト。 - Qiita
[3] Apache Tutorial: CGI による動的コンテンツ - Apache HTTP サーバ バージョン 2.2
[4] CGIの基礎知識
[5] Go言語のクロスコンパイル・環境設定 - Qiita