post Image
Amazon Linux に GoLang をインストールし、NginxのWebサーバを構築 & 簡単なHTTPレスポンスを受けるまで

参考

本稿は
http://qiita.com/TECHFUND/items/1b005563a782d68f7c17
http://qiita.com/taizo/items/bf1ec35a65ad5f608d45
を参考にしています。

上記の記事が書かれてから1年以上経っていることや、HTTP/2をサポートしている Nginx 1.9 以上を使いたかったこと、実際に使えるウェブサーバを立ち上げるまでの手順をもう少し詳しく書きたかった、といった理由から、二番煎じながら本稿を書くことにしました。

バージョン

今回の環境は以下のバージョンで構築しました。

Version
OS Amazon Linux AMI 2016.03.0 (ami-f80e0596)
Nginx 1.11.0
Go 1.5.3

AWS EC2 で Amazon Linuxインスタンスを作成

使用AMI: Amazon Linux AMI 2016.03.1 (HVM), SSD Volume Type – ami-29160d47

yumのアップデート

sudo yum update
sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

nginx.repo の baseurlを変更し priority=1 と追記

/etc/yum.repos.d/nginx.repo
# nginx.repo

[nginx]
name=nginx repo
- baseurl=http://nginx.org/packages/centos/6/$basearch/
+ baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
gpgcheck=0
enabled=1
+ priority=1

nginxのインストールと設定

sudo yum install nginx

nginxのバージョンを確認

nginx -v
nginx version: nginx/1.11.0

nginx の自動起動設定と起動

sudo chkconfig nginx on
sudo service nginx start

起動確認

ブラウザからIPアドレスにアクセスし、「Welcome to nginx!」と表示されるのを確認します。

GoLang のインストール

sudo yum install golang

GoLang の バージョンを確認

go version
go version go1.5.3 linux/amd64

nginx の設定ファイルを作成

/etc/nginx/conf.d/golang.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        fastcgi_pass  127.0.0.1:9000;
        include       fastcgi_params;
    }
}

nginx を再起動します。

sudo service nginx restart

上述の手順通りに進めた場合、
おそらく「conflicting server name “localhost” on 0.0.0.0:80, ignored」
というエラーが出るはずです。
default.conf の設定を変更していないので、こちらも listen 80 で受けているからですね。
ですので、とりあえず default.conf の方のlisten を別のポート番号に変えます。

/etc/nginx/conf.d/default.conf
server {
-   listen       80;
+   listen       81;
    server_name  localhost;

nginx を再起動します。

sudo service nginx restart

GoLang のテストコードを作成

次に GoLang のテストコードを書き、実際に動かしてみます。
場所はどこでもいいんですが、とりあえず /var/golang/ というディレクトリを作り
その下に GoLang のファイルを作成することにします。

mkdir /var/golang
touch /var/golang/index.go
/var/golang/index.go
package main

import (
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:9000")
    if err != nil {
        return
    }
    http.HandleFunc("/", handler)
    fcgi.Serve(l, nil)
}

GoLangをバックグラウンドで実行します。

cd /var/golang
sudo go build index.go
./index &

ブラウザから確認

ブラウザからIPアドレスにアクセスすると、「Hello world!」と表示されるはずです。

GETリクエストを受けて、その値を表示するサンプルコードを作る

先ほど作成した index.go にコードを追記していきます。

import 内に “html” を追加。

/var/golang/index.go
import (
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
+   "html"
)

handler 関数内に GET データを受ける処理を追加。

/var/golang/index.go
func handler(w http.ResponseWriter, r *http.Request) {
    // fmt.Fprintf(w, "Hello, World!")
    var keyword string = r.FormValue("keyword")
    var body string = "<html><head></head><body><h1>GETした値: " + html.EscapeString(keyword) + "</h1></body>"
    fmt.Fprintf(w, body)
}

先ほどバックグラウンドで起動したプロセスをいったん kill します。
ps aux でプロセスの一覧を見ると ./index というプロセスがあるはずなので
その番号をkillします。

ps aux
kill (プロセスの番号)

それから再度ビルドを行い、バックグラウンドで実行します。

cd /var/golang
sudo go build index.go
./index &

ブラウザで確認

ブラウザから
(IPアドレス)?keyword=hello!
と打ち、閲覧してみます。

ブラウザには、太字で
「GETした値: hello!」
と表示されるはずです。

テンプレートファイルを使う

index.go にまたコードを追記していきます。

import 内に “text/template” を追加。

/var/golang/index.go
import (
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
    "html"
+   "text/template"
)

テンプレート作成

次にテンプレートとなるファイル layout.html を作成します。
(特に意味はありませんが、Bootstrap を使ってちょっと綺麗なテンプレートにしてみます)

/var/golang/layout.html
<!DOCTYPE html>
<html>
  <head>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <title>{{.Title}}</title>
  </head>
  <body>
    <nav class="navbar navbar-default navbar-inverse">
        <div class="navbar-header">
            <a class="navbar-brand" href="#">{{.Title}}</a>
        </div>
    </nav>
    <div class="jumbotron">
        <h1>Getした値:</h1><p>{{.Keyword}}</p>
    </div>
  </body>
</html>
/var/golang/index.go
type Page struct {
  Title string
  Keyword string
}
func handler(w http.ResponseWriter, r *http.Request) {
    value_keyword = r.FormValue("keyword")
    page := Page{"GoLang の TEST !!!", value_keyword}
    tmpl, err := template.ParseFiles("layout.html")
    if err != nil {
        panic(err)
    }
    err = tmpl.Execute(w, page)
    if err != nil {
        panic(err)
    }
}

そのままビルドすると、

./index.go:4: imported and not used: "fmt"
./index.go:8: imported and not used: "html"

というエラーが出るはずです。
fmtパッケージ と htmlパッケージ は使っていませんよ、と言ってるんですね。
なかなか親切です。
ですので、import の “fmt” と “html” をコメントアウトしてから再度ビルドを行います。

ブラウザで

(IPアドレス)?keyword=hello!

と打ち、閲覧してみましょう。

「Getした値: hello!」と表示されたら成功。

注意

上のコードを実行する際の注意ですが、ブラウザから閲覧した時に 502エラー が出ることがあります。

その場合は GoLang が
panic: open layout.html: no such file or directory
というエラーを吐いているかと思いますので、
まず index.go を置いているディレクトリに移動 ( cd /var/golang ) してからビルドし

./index &

を実行してください。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。