GolangをCGIとして実行する

2020-02-11
gocgi
    

目次

概要

Golang を CGIとして実行する際のメモ

環境

golang

$ go version
go version go1.13.7 darwin/amd64

パッケージ

以下のモジュールを利用しています。

  • net/http
  • net/http/cgi
  • github.com/gorilla/mux

github.com/gorilla/mux は利用している目的は特にありません。シンプルでgithubのstar数が多かったからです。ここのサンプルを流用する場合に別のフレームワークに置き換えても問題ないです。

https://github.com/gorilla/mux

ソースと実行

package main

import (
	"fmt"
	"net/http"
	"net/http/cgi"
	"os"
	"github.com/gorilla/mux"
)

func viewHandler1(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
	fmt.Fprintln(w, "path1")
}

func viewHandler2(w http.ResponseWriter, r *http.Request) {
	param := mux.Vars(r)
	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
	fmt.Fprintln(w, "path2")
	fmt.Fprintln(w, param["id"])
}

func main() {
	router := mux.NewRouter()
	rootPath := os.Getenv("SCRIPT_NAME")
	router.HandleFunc(rootPath+"/path1/", viewHandler1).Methods("GET")
	router.HandleFunc(rootPath+"/path2/{id}/", viewHandler2).Methods("GET")
	cgi.Serve(router)
}

ソースの説明は後で説明

ビルドとサーバ実行

次のコマンドでファイルをsever.cgiという名前でビルドする。

$ go build -ldflags "-s -w" -o server.cgi server.go

実行バイナリをCGI実行環境下のディレクトリに配置する。\nディレクトリ構成は次のようにした。

./web
└── cgi-bin
    └── server.cgi

今回はPythonでCGIサーバを立てる。

$ pwd
/path/to/web
$ python -m http.server 8080 --cgi
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

"http://0.0.0.0:8080/cgi-bin/server.cgi/path1/" にアクセスする\n「path1」と表示されていればOK

ここでソースの説明

rootPath := os.Getenv("SCRIPT_NAME")

でスクリプトのパスを取得する。今回の場合は /cgi-bin/server.cgi となる。

したがって、rootPath+"/path1/" は /cgi-bin/server.cgi/path1/ にルーティングされる。

標準ライブラリのみ

標準ライブラリのみで実行するならこう

package main

import (
	"fmt"
	"net/http"
	"net/http/cgi"
)

func viewHandler(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
	fmt.Fprintln(w, "Hello World")
}

func main() {
	http.HandleFunc("/", viewHandler)
	cgi.Serve(nil)
}
    
s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV

最新の投稿

Python poetryでパッケージ開発 PyPIで公開 Pytestでテスト CIをGitHub Actionsで回す
Poetry でパッケージ開発 pytest でユニットテストを実施しカバレッジを算出する パッケージをビルドし PyPI で公開する 検証環境にデプロイする 本番環境にデプロイする GitHub Actions で CI を回す codecovの設定 GitHub…

Perlでconstant(定数)をhashのキーに使う
ハマった事象 解決方法 1 括弧をつける 2 & をつける 参考にしたサイト Perlでconstant(定数)をhash…

php-fpmのステータスページを表示 Apache & htaccess
試した環境 php-fpm の pm.status_path について php-fpmのconfの設定 .htaccess の設定 アクセスしてみる 参考にしたサイト Apache環境で php-fpm のステータスページを htaccess…

DBクライアントツールはDBeaverをおすすめしたい
DBeaver について 特徴 対応DB 対応OS 利用環境 アーカイブ インストール windows mac Linux コネクションの作成 SQLを実行する その他 CloudBeaverについて 今までいくつかのDB…

CentOS8 に Oracle12.2 clientをインストールする
実施した環境 セットアップ clientツールの 準備 インストール 環境変数にパスを通す 実行 libnsl.so.1: cannot open shared object file と表示される場合 CentOS8 に Oracle12.2 client…

フェールセーフやフェールソフト・フールプルーフ 障害対策用語の整理

JSで32ビット符号付き整数に対してのビット演算でハマった
具体例 参考にしたサイト JSでサブネットマスクの計算を行おうとしたとき、ビット演算でハマりました。その時のメモです。 JSでサブネットマスクの計算 JSでビット演算子を利用する場合 3…

Gitにプロキシを設定する
プロキシを設定する 確認 Gitでプロキシを通しておくメモです。 プロキシを設定する 以下のコマンドでproxyを通します。 ※ がプロキシのURL…

JSでIPアドレスがサブネットマスクで指定した範囲内にあるか判定する
IPアドレスが指定した範囲内にあるかどうか判定 参考にしたサイト JSでIPアドレス(IPv4)が指定したサブネットの範囲に含まれるか判定するロジックを作った時の記録です。 IPアドレスが指定した範囲内にあるかどうか判定 処理としては、IP…

プログラムの数値計算で発生する誤差の種類 丸め誤差・打ち切り誤差・桁落ち
はじめに 誤差の種類 丸め誤差 打ち切り誤差 桁落ち 情報落ち 桁溢れ誤差 参考にしたサイト コンピュータで出てくる誤差はいくつかありますが、 それらをコードに落として整理しました。 はじめに 例えば の計算の答えは 0.6666666666…

Tags

Dates

© 2021   404 motivation not found