Go言語でいろいろ開発をしています。
Go言語で開発したものをブラウザで実行する際、よくこうしますよね。
http://127.0.0.1:9999
とか
http://localhost:9999
でもこれって、自分で扱ったりテストする分にはいいですが、いざWEBアプリとして公開しようとすると、このURLでは、はて???となってしまいます。
そこで、ドメインでアクセスでき、ポート番号の指定も不要にしてWEBアプリを公開する方法をまとめておきたいと思います。
Go言語によるWEBアプリ
まずは公開するWEBアプリを作成しましょう。
ここでは当ブログで公開中のWEBアプリを使って解説していきます。
参考にするWEBアプリ(PDFファイル→PNG画像変換)はこちら
肝のソース部分の抜粋です。
package main
import (
"net"
"net/http"
"net/http/fcgi"
)
func main() {
l, err := net.Listen("tcp", "127.0.0.1:9999")
if err != nil {
return
}
http.Handle("/", http.FileServer(http.Dir("./")))
fcgi.Serve(l, nil)
}
このソースだけでは、もちろん何も動きませんが、今回は、Go言語のWEBアプリ開発はできるという人に向けた、最終のWEBアプリ公開手順の開発となりますのでご了承ください。
このソースを基本に実行したときの挙動は以下のとおりです。
- http:// 127.0.0.1:9999 にアクセス
- 別に用意されているindex.htmlが表示される
となります。
Nginxのconfファイルの編集
筆者は新しいプロジェクトを立ち上げるとき、KUSANAGIでWEBアプリの実行環境を整えています。
KUSANAGIの良いところは、簡単にSSL環境を伴ったスペースが構築される点です。
参考アプリもKUSANAGIで公開環境を整えましたので、自然とhttpsでの公開が可能となっています。
それでは、KUSANAGIによって自動生成されたNginxのconfを編集していきます。
pdftopng_lancers_work_ssl.conf
server {
listen 443 ssl http2;
server_name pdftopng.lancers.work;
location / {
fastcgi_pass 127.0.0.1:9999;
include fastcgi_params;
}
server_nameに公開したいドメイン名を記述します。
locationで公開するポートを指定します。
Go言語のソースで指定したポートと同じ9999番ポートをここでは指定しています。
これにより、pdftopng.lancers.workにアクセスがあると、127.0.0.1:9999へ転送され、Go言語WEBアプリが見られるようになります。
fast_cgiでパスを指定していますが、Go言語のソースを見ると、
fcgi.Serve(l, nil)
というコードがあります。
Go言語側でもFastCGI接続を行っていますので、これで正しくリクエストが処理されます。
今回の問題の解決のカギはfcgiパッケージを使うことにありました。
まとめ
ドメインによるGo言語WEBアプリの公開手法、いかがだったでしょうか?
筆者も最初はどうやったらポート番号無しでGo言語アプリが公開されるのか相当悩みました。
答えは簡単で、既述の通りfcgiパッケージを使い、Nginxのconf設定で、指定のポートへリクエストを流してあげるだけでした。
筆者も詳細には理解しきれていないかもしれませんが、これで稼働していますので、初心者の皆さんの参考になればと思います。