コロナ禍の影響で休日はヒマなのでいっちょ本格的にやってみっかと思い
Goだけ使ってWebサーバを立ててみました。
この手のTIPSは何故かlocalhostで試してるものばかりなので
「いやlocalhostは分かったからクラウドサーバでやった資料ないのかよ」
って気持ちになってしまいます。。。
なんでもかんでもlocalhost:8080って勉強以外に活かせないでしょうに...
構築環境
サーバ:EC2(AmazonLinux2)
ドメイン:Route53で会社の開発用ドメインから1個サブドメインを切る
SSL:ここまで出来るか分からんけど一応LetsEncrypt
Go:表現が合ってるか分からんけどApache/PHPの代わり
構築手順(やった順)
- EC2インスタンスを新規作成、サブドメインを切ってAレコードでIPアドレスと紐付け
- certbot-autoを持ってきてLetsEncryptのSSL証明書を導入
- Goのインストール
- GoでWebサーバの立ち上げ
- 3000番でアクセスして閲覧出来ることを確認
各作業詳細
1,2は端折りまして3から。
特に難しい作業無し
ひとまずrootでやります。
#wgetで公式からGoのモジュール一式持ってくる
wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
#/usr/local配下にgoを展開
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz
shin_developで実行したいのでユーザを切り替えてPATHを追加
su shin_develop
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.14.2 linux/amd64 #コレ出たらOK
とりあえずドキュメントルート的なとこでwebサーバ用のファイルを作る
cd /var/www/golang
mkdir sources && cd sources
vi test.go
とりあえず必要最低限(と思われる)のロジックを書く
package main
import (
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("../public_html"))
http.Handle("/", fs)
http.ListenAndServe(":3000", nil)
}
整形して中身を見てみる(一番やってみたかったやつ)
go fmt test.go
package main
import (
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("../public_html"))
http.Handle("/", fs)
http.ListenAndServe(":3000", nil)
}
インデントが1個増えた。見づれぇ。
テキトーなhtmlをpublic_htmlに置いて実行してみる。
go run test.go
3000番ポート指定でアクセスしてみる。
ちなみにEC2のセキュリティグループにはもちろん3000番を許可しないとダメ。
出来たっぽい。
今度はビルドしてバイナリファイルを作ってみる
go build (test.go) #親ディレクトリの名前で出力する場合はgo buildだけでいいっぽい
なんかサイズでけーな、7.6MBもあるけど圧縮する方法とかあるのかな。
バイナリを実行する。
./test
実行中はターミナルのコマンド受け付けてくれなくなるので
ケツに&を付けて別プロセスで実行すると良いらしい。
nodeでいうところのforeverみたいなのはあるんだろうか。
この場合は終了時にプロセスをkillすることをお忘れなく。
./test &
まだhttpなのでSSLを効かせた状態でアクセス出来るようにしたい。
元のソースをちょっとイジる
func main() {
fs := http.FileServer(http.Dir("../public_html"))
http.Handle("/", fs)
//ここを改変(logも使ってるけど)
//http.ListenAndServe(":3000", nil)
err := http.ListenAndServeTLS(
":3000",
"/path/to/CertificateFile",
"/path/to/CertificateKeyFile",
nil
)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
えぇ...ホントにこんだけでいいの...?
ただしhttpでのアクセスでエラーが出るようになったので、リダイレクトの設定は入れた方が良さそうな。
ちょっとListenAndServeTLSのパラメータの意味や
マジでこれだけなのかも含めてもうちょっと調査する必要はある。
あとポートが3000って出てるやつとかもだな...(´-`)
終わり。