エックスサーバーでgo言語使いたいけど使えるのかな?
最初から入ってはいないけど、やってみましょう。
この記事ではエックスサーバーでgo言語を使ってみるっていうことをやってみます。
この記事で行うこと
- エックスサーバーでgoをインストールする
- goサーバーをエックスサーバーで動かす
- ブラウザ・curlでAPIの実行を確認
- goサーバーのデーモン化
エックスサーバーでgo言語を使ってみたい方は参考にしてみてください。
エックスサーバーでgo言語を使ってみましょう。
エックスサーバーにgo言語をインストールする
SSH接続する
サーバーの中で作業するのでSSH接続してやります。
エックスサーバーにSSH接続する方法は以下の記事で書いているので、よかったら参考にしてみてください。
-
エックスサーバーで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使った方がいいですね。やりやすさも使用用途もそっちの方が適しているはずです。