自分用めも

初心者ちっくなプログラムネタを中心に、自分用の覚え書きをメモっていくための場所です。

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