Nginxでecho(golang)でHello world
最近何か新しい言語を覚えようとしてます。
フロントじゃなくてサーバサイド。
個人的に長年使ってきたPerlは押さえつつ、なんか一個新しいのやりたい。
候補としてNode.jsとgolangまで絞り、どうせならPerlと同じスクリプト言語じゃないほうがいいかな?と思ってgolangを再勉強中です(昔一回いじったけど放置してた)。公式のチュートリアル難しすぎ。
で。
Nginxをフロントサーバとしてバックエンドでgoを使いたい!
「NginxでPSGI/Plack(Starlet)でHello world - 自分用めも」でも似たようなことをしています。この構築済みのPSGI環境にgo/echo環境を追加するのを目標としました。
Nginx側
Nginx側からするとPSGIと同じくバックエンドに渡すだけなので、設定も同じです。
ホスト名とかポート分ければ共存可能。
vim /srv/www/nginx.conf
upstream goecho_socket_server { server unix:/tmp/goecho.sock; } upstream psgi_socket_server { server unix:/tmp/psgi.sock; } server { listen 80; server_name 192.168.0.10; ~中略~ location / { proxy_set_header Host $host; proxy_pass http://goecho_socket_server; } } server { listen 81; server_name 192.168.0.10; ~中略~ location / { proxy_set_header Host $host; proxy_pass http://psgi_socket_server; } }
go -echo側
echoまでインストールが終わっていること前提。
package main import ( "net" "os" "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) // ここからソケット接続設定 --- socket_file := "/tmp/goecho.sock" os.Remove(socket_file) l, err := net.Listen("unix", socket_file) if err != nil { e.Logger.Fatal(err) } // go runユーザとnginxのユーザ(グループ)を同じにすれば777じゃなくてok err = os.Chmod(socket_file, 0777) if err != nil { e.Logger.Fatal(err) } e.Listener = l // ここまで --- e.Logger.Fatal(e.Start("")) }
golangのnetパッケージでunixドメインソケット接続を作り、
それをリスナーとしてechoに紐づけます。
マルチプロセス?にした場合?とかどうなんだろう…というのがまだ疑問だったりしますが…
とりあえずHello worldまで。
参考:
How to run server on a unix domain socket? - Echo - LabStack Forum
Customization | Echo - High performance, minimalist Go web framework
net - The Go Programming Language