Webサーバの作成

Go標準ライブラリのnet/httpパッケージを利用して、Webサーバを立ち上げる方法を説明します。

最初のWebサーバ

基本を理解するため、最小限のコードでWebサーバを作成します。

main.go

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // リクエストを処理する関数を登録
    http.HandleFunc("/", handler)
    // Webサーバの起動
    // 第一引数はポート番号を指定
    // 第二引数はマルチプレクサを作成した場合に指定
    // (マルチプレクサについては以降のページで説明)
    http.ListenAndServe(":8080", nil)
}

// リクエストを処理する関数
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World.")
}

このプログラムのポイントは次の通りです。

  • http.HandleFunc関数を用いて、リクエストを処理する関数(今回はhandler関数が該当)を登録する
  • http.ListenAndServe関数を用いて、サーバを起動する

これだけでWebサーバの作成は完了です。 他のプログラミング言語のように、TomcatやUnicornなどのWebアプリケーションサーバを別途インストールする必要はありません。

次の手順で実際に動かしてみましょう。

  • ターミナルでgo run main.goを実行してWebサーバを起動する
  • Webブラウザでhttp://localhost:8080にアクセスする
  • Webブラウザに『Hello, World.』と表示されることを確認する
  • ターミナルでCtrl + cを入力してWebサーバを終了する

Webサーバの設定

先ほどはデフォルトのサーバ設定で起動しました。 サーバの設定をするには、構造体http.Serverを使います。 そして、http.ListenAndServeの代わりにhttp.ServerListenAndServeメソッドを利用します。

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/", handler)
    // Webサーバの設定
    server := http.Server{
        // ホスト名とポート番号(ホスト名は省略できる)
        Addr:           ":8080",
        // 次のページで説明
        Handler:        nil,
        // リクエスト読み取りのタイムアウト
        ReadTimeout:    30 * time.Second,
        // レスポンス書き込みのタイムアウト
        WriteTimeout:   30 * time.Second,
        // リクエストヘッダの最大バイト長
        MaxHeaderBytes: 1 << 20,
    }
    server.ListenAndServe()
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World.")
}