LoginSignup
0
1

More than 3 years have passed since last update.

ポンコツプログラマがGOでWebサーバを立ち上げる話

Last updated at Posted at 2020-04-19

コロナ禍の影響で休日はヒマなのでいっちょ本格的にやってみっかと思い
Goだけ使ってWebサーバを立ててみました。

この手のTIPSは何故かlocalhostで試してるものばかりなので
「いやlocalhostは分かったからクラウドサーバでやった資料ないのかよ」
って気持ちになってしまいます。。。
なんでもかんでもlocalhost:8080って勉強以外に活かせないでしょうに...

構築環境

サーバ:EC2(AmazonLinux2)
ドメイン:Route53で会社の開発用ドメインから1個サブドメインを切る
SSL:ここまで出来るか分からんけど一応LetsEncrypt
Go:表現が合ってるか分からんけどApache/PHPの代わり

構築手順(やった順)

  1. EC2インスタンスを新規作成、サブドメインを切ってAレコードでIPアドレスと紐付け
  2. certbot-autoを持ってきてLetsEncryptのSSL証明書を導入
  3. Goのインストール
  4. GoでWebサーバの立ち上げ
  5. 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

とりあえず必要最低限(と思われる)のロジックを書く

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
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番を許可しないとダメ。

スクリーンショット 2020-04-19 18.48.07.png

出来たっぽい。
今度はビルドしてバイナリファイルを作ってみる

go build (test.go) #親ディレクトリの名前で出力する場合はgo buildだけでいいっぽい

スクリーンショット 2020-04-19 18.53.29.png

なんかサイズでけーな、7.6MBもあるけど圧縮する方法とかあるのかな。
バイナリを実行する。

./test

実行中はターミナルのコマンド受け付けてくれなくなるので
ケツに&を付けて別プロセスで実行すると良いらしい。
nodeでいうところのforeverみたいなのはあるんだろうか。
この場合は終了時にプロセスをkillすることをお忘れなく。

./test &

まだhttpなのでSSLを効かせた状態でアクセス出来るようにしたい。
元のソースをちょっとイジる

test.go
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)
    }
}

スクリーンショット 2020-04-19 19.32.27.png

えぇ...ホントにこんだけでいいの...?

ただしhttpでのアクセスでエラーが出るようになったので、リダイレクトの設定は入れた方が良さそうな。
ちょっとListenAndServeTLSのパラメータの意味や
マジでこれだけなのかも含めてもうちょっと調査する必要はある。
あとポートが3000って出てるやつとかもだな...(´-`)

終わり。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1