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)
}
    

最新の投稿

Node.js で作成した REST API を Docker化
Node.jsでREST APIを作成 コンテナ化 コンテナ化定義 コンテナ化作業 参考 Node.js で作成した REST API を Docker化した際のメモです。 Node.jsでREST APIを作成 まずはNode.js…

JavaScriptで優先度付きキューを実装する
優先度付きキューについて ソース 参考 JavaScriptで優先度付きキュー (プライオリティキュー) を実装する 優先度付きキューについて 具体的には次のような機能があります。 キューに対して要素を優先度付きで追加 (push…

AWS Amplify で コンテナベースのデプロイを行い REST API を構築
検証した環境 やってみる 初期準備 パイプラインを確認 終了処理 参考 AWS Amplify で コンテナベースのデプロイを行い REST API を構築した際のメモです。 検証した環境 amplify 5.1.…

Pythonでソケット通信を実装しメッセージの送受信を行う
ソース server.py client.py 動かしてみる 参考 Pythonでソケット通信を実現する方法です。 ソース server.py サーバ側のソースです。 client.py…

next_permutationをJSで実装する
ソース 使い方 参考 C++で提供されている順列を生成する next_permutation のJS実装です。 ソース 順列が存在する場合はtrueを返し、そうでなければfalse…

応用情報技術者試験の合格体験記
受験時のステータス 受験結果 対策 スケジュール 午前問題 午後問題 参考書等 令和…

[JS]ラジアンから度数に度数からラジアンに変換する
コード 度数からラジアンへ ラジアンから度数へ サンプル ラジアンから度数に度数からラジアンに変換する際のスニペット。 コード 度数からラジアンへ ラジアンから度数へ サンプル

CentOS8 に Python + OpenCV をインストール
インストール テスト CentOS8 で標準で提供されているパッケージで Python + OpenCV 環境を構築する方法です。 検証した環境は CentOS8.3 (Docker) です。 インストール まず opencv…

[Perl] CentOS8 に plenv をインストール
インストール Step1 事前準備 Step2 PATHを通す (README通りにインストール) Step2 PATHを通す ($HOME以外にplenvをインストール) Step3 Perlインストール Step4 cpanmインストール CentOS…

JS/TSのclassでclass名を取得する
コード JS/TSのconstructorを利用して自分自身のクラス名を取得する際のメモ。 コード このコードの結果は次のようになります。

Tags

Dates

s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV
© 2021   404 motivation not found