hetemlなど、基本PHP前提のレンタルサーバーでgolangを動かしたくなってしまった時に気をつけるべき知見を得た。(そもそもPHPで書けよ、って話だが)
おまとめ(困ったこと)
- そもそもデーモンを動かせないので、net/httpを使った常駐型のhttpサーバーは実行できない。
- バックグラウンド実行できると見せかけ、ログアウトし一定時間経つと消えている。
- mod_rewriteでlocalhost:8080のgolangへリバースプロキシするという荒業を試し、リクエストが通ることは確認できたが安定稼働できないため諦めた。
- もしかするとできないこともないかもしれないが、流石に力技すぎる。(supervisord入れようかとかしたけど筋が悪い臭いがプンプン。phpで書きなおそうか考え始める。)
- golangでもcgiが作れるので、cgiを作ってそれを呼び出す。
- cronでgolangのバッチを動かしたくなったら、実行スレッド数に気をつける。runtime.GOMAXPROCS()で制御可能。
golangでCGI
net/http/cgi パッケージにcgiを作るためのライブラリがあるのでこれを使用する。
POST/GET パラメーターやCookie、Header等を使用することが可能。
ぼくは普段gin等のframework使っているのであれだが、net/httpでゴリゴリサーバー書いている人なら違和感なく作ることができるんだと思う。
プロセス制限注意
共有サーバーって制限が強い><
ulimit -u 15
たったの15・・・goroutineを使うと一発で死にます。
runtime.GOMAXPROCS(1)
などでスレッド数1に変更。
sqlのopen connectionも一応減らしておいた
db, err := sql.Open(conf.Driver, conf.Dsn) db.SetMaxIdleConns(1) db.SetMaxOpenConns(1)
AWSとかVPSとか自由な世界で生きているとレンサバ辛い。
CGIってまあアリだなぁと思った。Apache + PHP or CGIしか動かせないようなところでは。
意外と戦える!