【Go】デプロイしたときにnet/httpでハマったこと
最近GoでAWSにデプロイしてハマったのでそのときの事を。
サーバー起動でハマる
まずGoでWebサーバーを立てるときは、net/httpパッケージを使うと思います。
他のルーティングを行うパッケージを使っていても基本的なしくみは同じです。
私の開発環境(mac)で実際にbuildして動いていたのでAWS環境(amazon linux)でも動くだろうと。
だけど現実は甘くなかった。
func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8000", nil)) }
普通にnet/httpを使って標準的な方法だとこれで起動だと思います。
が、今回、ルーティングを行う為にgolila/muxというパッケージを使ってルーティングしてました。
これが仇となった。
func main() { router := mux.NewRouter() router.HandleFunc("/route/{param1}/{param2}", func1) router.HandleFunc("/route/{param1}", func2) router.HandleFunc("/route2/{param1}", func3) srv := &http.Server{ Handler: router, Addr: "127.0.0.1:3000", WriteTimeout: 30 * time.Second, ReadTimeout: 30 * time.Second, } log.Fatal(srv.ListenAndServe()) }
こんな感じで起動していました。
で、全く動かずと。
curlしても返ってくるのは502のみ・・・
サンプルで入れたHelloWorldは出たので明らかにインフラのせいではありません
結論から言えば、&http.Serverで設定して、それをListenAndServeで起動してたのが間違いでした。
func main() { router := mux.NewRouter() router.HandleFunc("/route/{param1}/{param2}", func1) router.HandleFunc("/route/{param1}", func2) router.HandleFunc("/route2/{param1}", func3) log.Fatal(http.ListenAndServe(":8000", router)) }
これで成功し無事レスポンスが返ってくるように。
その原因と考察
macでビルドしてバイナリ実行したときは全然上手くいってたので、恐らく環境依存かと。
調べても出てこない・・・が、PHPのように実行環境がOS依存なのでそれが原因かなと推測。
そもそも起動方法がドキュメント通りではないので、ちゃんと公式読みましょうと。
www.gorillatoolkit.org
golilaは有名パッケージだけあって情報が充実してます。
一次情報を見るクセつけないといけないなぁ・・・
それでは今回はこの辺りで。