golangもNginxも始めたばかりなので、他のブログの記事を参考にしつつ試験中
Nginxのconfにlocation追加
1 2 3 4 |
location /app1 { fastcgi_pass 127.0.0.1:8000; include fastcgi_params; } |
golang
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package main import( "net" "net/http" "net/http/fcgi" "text/template" ) type Html struct{ Title string Get string } func handler(w http.ResponseWriter, r *http.Request){ tmp := r.FormValue("word") t, err := template.ParseFiles("base.html") if err != nil{ return } err = t.Execute(w, &Html{ Title: "boom", Get: tmp, }) } func main(){ l, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil{ return } http.HandleFunc("/", handler) fcgi.Serve(l, nil) } |
ちょっと違う書き方
1 2 3 4 5 6 7 8 9 |
upstream app2 { server 127.0.0.1:8000; } ... location /app2 { proxy_pass http://app2/; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package main import( "net/http" ) func main(){ //NewServeMux.Handle(パターン, Handler)となっている //ServeMuxとはパスごとの処理を登録する構造体 //HandlerFunc(パターン、ハンドラ)が用意されている m := http.NewServeMux() h := new(MyHandler) m.Handle("/", h) //ServerはHTTPサーバーのパラメータを指定できる s := http.Server{ Addr: ":8000", Handler: m, } s.ListenAndServe() } //MyHandlerはServeHTTPを実装している //ServeHTTPはHandler Interfaceに定義されている type MyHandler struct{ } func (h *MyHandler) ServeHTTP (w http.ResponseWriter, r *http.Request){ w.Write([]byte("app2!!")) } |
サーバーの開始
func http.ListenAndServe(addr string, handler Handler) err
http.ListenAndServe(“:81”, nil)
第1引数にTCPアドレス
第2引数にHandlerを引数に受け取りサーバーを起動する。
Handlerというのは、http.Handlerインターフェースを実装していればいい。
ちなみに、内部でhttp.server.ListenAndServeを呼んでいる。http.server.ListenAndServeは内部でhttp.Server.Serveを呼んでいる。http.Server.Serveはforループでリクエストごとにgoroutineを立ち上げる。
http.Handle(r)とは
ServeHTTPメソッドを持つインターフェース。
ServeHTTPはリクエストとレスポンスが記述される。
type Handler interface { ServeHTTP(ResponseWriter, *Request) }
http.Handleとは
func Handle(pattern string, handler Handler)
URLとhttp.Handerを実装した構造体を受け取り、ルータに登録。
http.HandleFuncとは
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
URLとhttp.Handerを受け取り、ルータに登録。
HandleだとServeHTTPを定義しHandlerを実装した構造体を渡す必要があるが、HandleFuncの場合Funcのまま受け取れる。
http.HandleとHandleFuncについて
http内でDefaultServeMux(ServeMux)が定義されており、DefaultServeMux.Handler、DefaultServeMux.HandleFuncが呼ばれている。
http.ServerMuxとは
ServerMuxはURLとhandlerを登録しておく構造体。
ServeMux自体、ServeHTTPメソッドを実装している→Handler
mux := http.NewServeMux()
mux.Handle(“/echo”, echoHandler)
http.Handle(r)Funcとは
type HandlerFunc func(ResponseWriter, *Request)
func(ResponseWriter, *Request)の別名でServerHTTPが定義(実装)されている。
1 2 3 4 5 6 7 8 9 |
func main() { m := http.NewServeMux() m.Handle("/test", http.HandlerFunc(f)) } func f(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "Hello World") } |
Handle(r)FuncとHandleFuncについて
そっくりで混乱するが、HandleFuncはURLとHandlerをServerMuxに登録する。Handle(r)Funcの方は、func(ResponseWriter, *Request)の別名でhttp.Handlerとして使える。
http.ServeMux.HandleFuncとは
URLとfunc(ResponseWriter, *Request)を受け取りルータに登録している
内部でfunc(ResponseWriter, *Request)をHandle(r)FuncにキャストしているHandleに登録している。
1 2 3 4 5 |
m := http.NewServeMux() m.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "Hello World") }) |
http.ServerMux.Handleとは
ServeMuxにURLとHandlerを登録する。
1 2 3 4 5 6 7 8 9 10 11 |
func main() { m := http.NewServeMux() m.Handle("/test", handler) } type handler struct{} func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "Hello World") } |
出力関係
Print
標準出力へ
Fprint
出力先を指定
Sprint
文字列で返す。
接尾のfはフォーマット