始めに

この記事は自分がwebアプリケーションからのリクエストをさばいてレスポンスを返す仕組みをレンタルサーバーにて実現する過程で身に着けた知識を記したものです。細かいところが間違っている可能性があります。また知った知識を順次メモ書きしていくのでこの記事は順次更新されていきます。この記事では様々な事情からサーバー側の処理言語としてGOを使用します。

現在未完

前提

レンタルサーバーでGOを動かしリクエストをさばいていきます。レンタルサーバーはXServerを使用して行きます。

XServerはWebサーバーとしてNginxとApacheを使用していますが、ユーザーにはroot権限が渡されないのでコンフィグファイルを直接いじれず.htaccessファイルをいじることでしかファイルアクセスの方法を見つけられませんでした。そこで自分なりの解決策としてCGIを使ってGOプログラムを外部から使用することにしました。

そこで次に必要となった知識がGOでHTTPによるリクエストをさばく方法です。

本題 ~GOでHTTPリクエストをさばくために必要な知識~

基礎知識

  • プロトコル : 通信方法の規則
  • HTTP (Hyper Text Transfer Protocol) : Web通信で用いられるプロトコル
    • HTTPリクエスト : リクエスト(メソッド ex. GET)、ヘッダー(ホスト情報)、ボディからなる。
    • HTTPレスポンス : ステータス(400等)、ヘッダー(何をレスポンスしているのか)、ボディからなる。

CGI、FCGIに関する知識

概要

CGI(Common Gateway Interface) : サーバー上にプログラムを置いてHTTPリクエストによりサーバー上でプログラムを走らせる。WebフロントにとってはJavaScriptとの違いが分かりにくくなりやすいが、JavaScriptは通常サーバー上で動くのではなく、サイトをダウンロードした際にJavaScriptプログラムもダウンロードしPC上で実行している。何らかの情報ファイルへのアクセスはAPIをPC上からJavaScriptを通して呼び出すことで行われるが、CGIとはその際に使われるサーバー上の窓口のようなものであり、HTTPによるリクエストでサーバーに関数を実行してもらう。

FCGI(FastCGI) : CGIの改良版。CGIは一呼びかけ一起動だが、FCGIは一呼びかけ一定時間起動となり高速化と負荷の軽減が実現できる。

HTTPサーバー制作

HTTP通信の概要

サーバー関係の知識を整理するために各個人が持つPCからのデータの流れを一度書き記す。

  1. 各PCからネットを通じてサイトやAPIのデータを持つサーバへ、データをよこせというリクエストデータを送信する。この際、PCとサーバの間でやり取りされるデータはHTTPという通信規則(プロトコル)に則ったもので記述されて通信される。
  2. サーバは送られたHTTPリクエストをもとにプログラムを実行し、何らかの返答をHTTPレスポンスとしてPCに返却する。

HTTPサーバの概要

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にリクエストを送ることでサーバに特定の処理をさせることができる。

GOの知識

"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

[6] linux — 「バイナリファイルを実行できません」というエラーを解決するにはどうすればよいですか?

[7] Go を レンタルサーバーで動かす方法 - Qiita


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です