GolangのWebパッケージginを用いて作ったWEBアプリをLinuxサーバーで公開するためのメモ。ポートとかの話の続きです。
今回はアプリ永続化のための部分。
一度実行したらアップデートなどで止めるまで動き続けてくれるようにします。
Linux環境: Ubuntu 16.04.5GolangのWebパッケージginを用いて作ったWEBアプリをLinuxサーバーで公開するためのメモ。ポートとかの話の続きです。
今回はアプリ永続化のための部分。
一度実行したらアップデートなどで止めるまで動き続けてくれるようにします。
Linux環境: Ubuntu 16.04.5golangではtypeによる型定義とレシーバと呼ばれるメソッド定義ができます。
複数の外部パッケージを同時使用するときなどにレシーバ追加をしたいときがあるんですが、言語規則のためそのままだと追加できません。
基本的なことからおさらいしつつ対策を考えます。
bitnamiのwordpressが動いているサーバーにgolangのWEBサービスを追加します。
アプリ自体は8080ポートで実行してサブディレクトリにマップする形です。
Apacheで他WEBサーバーを動かす場合も同様のやり方で行けると思います。
golangで定期処理などを書きたくなったのでどうやって書くか考えます。
とりあえずtimeパッケージかcontextパッケージあたりを使うと良さそうなので2つとも使ってみます。
配列の中身つ1つに対してPrintf系のフォーマットにかけることを考えます。
さらにそれを利用して独自のSprintf関数を作ったりしてみる。
桁数を指定せずに大きな数値や精度の高い数値をそのまま文字列にしようとすると、途中で切れたり指数表記になったりする。
float64
の数値をそのまま(非指数表記)でstring
に変換したい。
簡単そうで意外にできなかったので方法を覚書きしておく。
template/htmlを使ってHTML表示を行う時、テンプレートの一部の表示方法を変えたいときがあります。
変えたい部分だけ変えたテンプレートを複数用意する方法もありますが、面倒というか煩雑になるのでパース部分に直接HTMLタグを書いて変更させたい。
そのままやるとタグ部分が文字列になったのでその対策方法メモ。
Execute部分などはgin-gonic/ginを使っているので省略。
ginでシングルバイナリからファイルサーブすることを考えた。
用途を考えるとシングルバイナリ化する利点はあまりないこともあり、標準メソッドだけではできなかったので実装メモです。
以前に書いた記事も参考にした。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//パッケージのインストール //statikコマンドを使えるようになる go get github.com/rakyll/statik //assetフォルダをgoファイル化する statik asset ... import ( "github.com/rakyll/statik/fs" _ "projectname/statik" // TODO: Replace with the absolute import path ) ... |
http.FileSystem
として扱えるようになる。
ファイルシステムの静的ファイルをサーブできるメソッド。
1 2 3 4 5 6 |
statikFS, err := fs.New() if err != nil { log.Fatal(err) } r:= gin.Default() r.StaticFS("/asset", statikFS) |
これが一番簡単だけどルートアクセスに設定できません。
ミドルウェアを使うことでルートに設定可能です。
1 |
r.Use(static.Serve("/", static.LocalFile("./assets", true))) |
これをstatikで使えるようにします。
Serve
の第2引数はServeFileSystem
なのでインターフェースを満たす必要がある。
1 2 3 4 |
type ServeFileSystem interface { http.FileSystem Exists(prefix string, path string) bool } |
Exists
メソッドが必要そうなのでミドルウェアの実装から必要なものを抜き出して実装してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
type statikFileSystem struct { fs http.FileSystem } func (b *statikFileSystem) Open(name string) (http.File, error) { return b.fs.Open(name) } func (b *statikFileSystem) Exists(prefix string, filepath string) bool { if _, err := b.fs.Open(filepath); err != nil { return false } return true } func StatikFileSystem(fs http.FileSystem) *statikFileSystem{ return &statikFileSystem{ fs, } } |
1 |
r.Use(static.Serve("/", StatikFileSystem(statikFS))) |
これでルートからでもファイルサーブできるようになった。
HTMLヘッダ内のメタタグ(<meta name="" content="">
)を編集(ない場合は作成も)をするスクリプトを書いてみました。
以前にOGPなどの外部表示設定を確認したのでスクリプトで動的に変えてみたかったのが理由です。
ただツイッターなどのサービスではOGPのためのアクセスでスクリプト実行までしてなさそうなので、サーバーサイドで書き換える必要があります。
なので今回のスクリプトはnode.js向け、あるいはタイトルのみの編集向けです。