Help us understand the problem. What is going on with this article?

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

コロナ禍の影響で休日はヒマなのでいっちょ本格的にやってみっかと思い
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って出てるやつとかもだな...(´-`)

終わり。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした