XSERVER

エックスサーバーでgolangをインストールして使ってみる

エックスサーバーでgo言語使いたいけど使えるのかな?

最初から入ってはいないけど、やってみましょう。

この記事ではエックスサーバーでgo言語を使ってみるっていうことをやってみます。

この記事で行うこと

  • エックスサーバーでgoをインストールする
  • goサーバーをエックスサーバーで動かす
  • ブラウザ・curlでAPIの実行を確認
  • goサーバーのデーモン化

エックスサーバーでgo言語を使ってみたい方は参考にしてみてください。

エックスサーバーでgo言語を使ってみましょう。

エックスサーバーにgo言語をインストールする

SSH接続する

サーバーの中で作業するのでSSH接続してやります。

エックスサーバーにSSH接続する方法は以下の記事で書いているので、よかったら参考にしてみてください。

XSERVER

エックスサーバーでSSH接続する方法を紹介します

2022/9/12  

この記事ではエックスサーバーでSSH接続する方法を書いていきます。 エックスサーバーを使っていて、自 ...

go言語をインストールする

goのダウンロードページからダウンロードリンクを取得します。

これをwgetで実行すれば取得できるのでやっていきましょう。


/usr/localなんかに入れようとしても権限がなく失敗するので、ホームディレクトリに入れます。
/home/〇〇
// 取得
$ wget https://go.dev/dl/go1.19.1.linux-amd64.tar.gz
// 解凍(goディレクトリができる)
$ tar -xzf go1.19.1.linux-amd64.tar.gz
// 圧縮ファイルを削除
$ rm -rf go1.19.1.linux-amd64.tar.gz

パスを通す

.bash_profileにgoのpathを追加します。今回はホームディレクトリは以下に入れたので以下を追加。

export PATH=$PATH:$HOME/go/bin
source ~/.bash_profile

これでgo versionするとちゃんと表示されましたね。

$ go version
go version go1.19.1 linux/amd64

GoでAPIを作成する

単純なAPIを作ります。{"message": "Hello World!!"}を返すだけです。

/home/〇〇/〇〇.xsrv.jp/public_html/main.go

package main

import (
    "encoding/json"
    "net/http"
)

func main() {
    port := "8000"
    http.HandleFunc("/", getHelloWorld)
    http.ListenAndServe(":" + port, nil)
}

func getHelloWorld(w http.ResponseWriter, _r *http.Request) {
    ping := map[string]string{"message": "Hello World!!"}
    w.Header().Set("Content-Type", "application/json")
    res, _ := json.Marshal(ping)
    w.Write(res)
}
$ go run main.go

これでgo runしてアクセスすればHello WorldがJSONで返ってくるんですが、エックスサーバーでそれを行うためにはちょっと考えないといけません。

.htaccessを使う

エックスサーバーはレンタルサーバーなので、自分で自由にWebサーバーの設定をいじったりはできません。なので.htaccessを編集してgoで起動しているサーバーにつなげようと思います。

.htaccessを開いてgoで起動するlocalhost:8000に繋げます。

$ vi /home/〇〇/〇〇.xsrv.jp/public_html/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ http://localhost:8000/ [P,L]
</IfModule>

これでドメインにアクセスされるとgoで起動するlocalhost:8000を見にいくようになりました。

ブラウザから確認する

今回は初期ドメインで試しているんだけど、ブラウザにアクセスして確かめてみるとちゃんと表示されました。

curlでも確認

curlでも確認してみるとjson形式で返ってきていますね。

$ curl http://〇〇.xsrv.jp/
{"message":"Hello World!!"}

goサーバーをデーモン化する

一応エックスサーバーでgoを使ってjsonが返ってくるのは確認できたけど、このままではすぐにサーバーが切れるのでデーモン化します。

supervisor入れようと思ったけど、インストールに手こずりそうなので、go-daemon使います。

/home/〇〇/〇〇.xsrv.jp/public_html

$ go mod init example.com/hello
$ go get github.com/sevlyar/go-daemon

go-daemonの使い方は知らないので、sample.goを参考にしつつ書いてみる。

package main

import (
    "encoding/json"
    "net/http"
    "github.com/sevlyar/go-daemon"
    "log"
)

func main() {
    cntxt := &daemon.Context{
        PidFileName: "sample.pid",
        PidFilePerm: 0644,
        LogFileName: "sample.log",
        LogFilePerm: 0640,
        WorkDir:     "./",
        Umask:       027,
        Args:        []string{"[go-daemon sample]"},
    }

    d, err := cntxt.Reborn()
    if err != nil {
        log.Fatal("Unable to run: ", err)
    }
    if d != nil {
        return
    }
    defer cntxt.Release()

    port := "8000"
    http.HandleFunc("/", getHelloWorld)
    http.ListenAndServe(":" + port, nil)
}

func getHelloWorld(w http.ResponseWriter, _r *http.Request) {
    ping := map[string]string{"message": "Hello World!!"}
    res, _ := json.Marshal(ping)
    w.Header().Set("Content-Type", "application/json")
    w.Write(res)
}

これで普通にgo runします。

$ go run main.go

何も表示されないけど、実際には動いているのでブラウザから確認するとちゃんと表示されます。

curlで実行してもちゃんとHello Worldが返ってきました。これでデーモン化は完了です。

ちなみにpublic_html配下はこんな風にコード内で指定したsample.logやsample.pidが作られています。

[〇〇@〇〇 public_html]$ ls
go.mod  go.sum  main.go  sample.log  sample.pid

デーモン化を停止させる

今回コード内でsample.pidという名称でpidファイルを指定したので、停止させたい時にはそれをkillしてやればいいようです。

kill `cat sample.pid`

実行するとちゃんと503になって停止してくれました。

まとめ

エックスサーバーでgoをインストールして使うっていうことをやってみたけど、なんとなくできましたね。今回やってみたことはこんな感じです。

  • エックスサーバーにgoをインストール
  • goでサーバーを起動
  • .htaccessを作成
  • ブラウザからアクセス・curlでアクセス
  • goサーバーのデーモン化

ただやっぱりこういうことやるならVPS使った方がいいですね。やりやすさも使用用途もそっちの方が適しているはずです。

-XSERVER