とーますメモ

Ruby on Rails / Goなどの学習メモ

【さくらVPS】Nginx + Goのインストール・設定

前回、NginxとGoをそれぞれインストールした。

thoames.hatenadiary.jp
thoames.hatenadiary.jp

ここでは以下の前提で設定する。

Goは「127.0.0.1:5050」で既に動作しているという前提で
話をすすめる。

$ ./app &


nginxの設定を以下のようにすれば動作する。

設定

default.conf

server {
    listen              80;
    server_name  localhost;

    location / {
        proxy_pass  http://127.0.0.1:5050;
    }
}

GoでFastCGIを使用するため
"net/http/fcgi"パッケージを使用する場合は、
以下のように設定できるっぽい。

server {
    listen              80;
    server_name  localhost;

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

再起動

$ sudo service nginx restart

【Go】Goアプリをデーモン化(常駐化)させてみた。

Supervisorという「プロセス管理/デーモン化」ツールが便利そう。
色んなサイトで紹介されていたので、使用してみる。

インストール

$ sudo yum install supervisor

設定ファイル編集

$vi /etc/supervisord.conf

一番下にGoアプリの設定を以下のように追記。
アプリ名:sample
アプリのディレクトリ:/home/xxxxx/go_deploy/
アプリ実行ファイル名:app
ユーザ名:YYYYY

[program:sample]
command=/home/xxxxx/go_deploy/app
autostart=true
autorestart=true
stopsignal=TERM
stdout_logfile=/var/log/supervisor/%(program_name).stdout.log
stderr_logfile=/var/log/supervisor/%(program_name).stderr.log
user=YYYYY

起動

$ sudo service supervisord start

autostartがtrueになっているので、自動でスタート。
細かいプロセス管理は以下の「supervisorctl」コマンドを使用する。
www.task-notes.com

動作中の全プロセス確認

$ sudo supervisorctl status

指定したアプリのみ起動

$ sudo supervisorctl start sample

指定したアプリのステータス確認

$ sudo supervisorctl status sample

指定したアプリのみ停止

$ sudo supervisorctl stop sample

ログファイルの場所

/var/log/supervisor/supervisord.log

注意:テンプレートなどをGo内で使用している場合は(つまり一つのバイナリファイル内にすべてのデータが無い場合)
go-bindataなどを使用して、テンプレートやアセット系のファイルを一つのバイナリにしてあげないとsupervisorでは動作しないっぽい。。
(自分はできなかったが、他に方法をご存じの方がいれば、ご指摘いただけるとありがたいです)

[参考]
SupervisorでGolangで書かれたアプリケーションのデーモン化をした話 - こんちゃんブログ
Supervisorで簡単にデーモン化 - Qiita
適当なスクリプトをデーモン化するのにSupervisorが便利 - id:anatooのブログ

【さくらVPS】Nginxインストール・設定

yumに入っているものは古いため、
リポジトリを登録してインストール

Nginx用のリポジトリを作成

$ vim /etc/yum.repo.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/$releasever/$basearch/
gpgcheck=0
enabled=1

インストール

$ sudo yum install -y nginx

起動設定

起動しているhttpdをまずは止めてから設定

$ chkconfig httpd off
$ service httpd stop
$ chkconfig nginx on
$ service nginx start
$ systemctl status nginx

サーバのIPアドレスにアクセスすると
以下の画面が表示されます。

f:id:Thoames1212:20180112103938p:plain


[参考]
umegusa.hatenablog.jp

【Go】CentOS(さくらVPS)に最新のGoをインストールする方法

yum経由でもインストールは可能であるが

$ yum install golang

古いバージョンが入るので、
新しいバージョンを入れたいときは以下のようにする。

取得

$ cd /usr/local/src
$ sudo wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz

解凍

$ sudo tar -xzf go1.9.linux-amd64.tar.gz -C /usr/local

GOROOT及びGOPATHなどの設定

$ vim ~/.bash_profile
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

適用

$ source ~/.bash_profile

確認

go version

※yumでインストールしているgoがある場合は削除が必要

$ sudo yum remove golang


[公式]
ask.xmodulo.com

【さくらVPS】gitの古いバージョン(1.7.x)を新しいバージョンに変更する方法

自分のVPSのgitのバージョンは1.7.1だった。
それを現時点で最新の2.15.1にする。

古いバージョンを削除

$ yum remove git

新しいバージョンをダウンロード

$ cd /usr/src
$ sudo wget https://www.kernel.org/pub/software/scm/git/git-2.15.1.tar.gz
tar xzf git-2.15.1.tar.gz

必要なライブラリを先にインストール

$ sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

Gitのインストール

/usr/local/gitにインストール

cd /usr/src/git-2.15.1
make prefix=/usr/local/git all
make prefix=/usr/local/git install

パスを通す

$ vim ~/.bash_profile

以下を保存

export PATH=$PATH:/usr/local/git/bin

反映

source ~/.bash_profile

動作確認

$ git --version

【Go入門】デプロイツール「sup」の使い方

自分用メモ。

RailsならCapistranoが有名だが、Goでも同じようなツールがないか調べてみたところ
このツールが検索に引っかかったので、使い方を調べてみた。

ツール名は「sup」。
github.com

特徴は、YAML形式の設定ファイルに対象ホストやコマンドを自分で記述して
デプロイを行うこと。また1回のコマンドで複数ホストにデプロイすることも可能。

使用方法は以下。

インストール

$ go get -u github.com/pressly/sup/cmd/sup

動作確認

$ sup -v

使い方

$ sup [OPTIONS] NETWORK COMMAND [...]

NETWORKに、設定ファイルに記述した「ネットワーク名」を指定し
COMMANDに、設定ファイルに記述した「コマンド名」を指定する。

設定ファイルを作成

Supfile」という名前ファイルをルートに作成。
envの箇所で環境変数を設定。
例ではPRODUCTION_DSTはデプロイ先のディレクトリを指定し、
hosts:ではホスト毎の情報(USER@HOST:PORT)を設定する。

以下設定例。

version: 0.4

env:
  # Environment variables for all commands
  NAME: example
  PRODUCTION_DST: /home/xxx/go_deploy

networks:
  # Groups of hosts
  dev:
    hosts:
      - localhost
  staging:
    hosts:
      - USER@HOST:PORT
  production:
    hosts:
      - USER@HOST:PORT

commands:
  start-echo:
    desc: start message
    run: echo [START] $NAME HOST[$SUP_NETWORK]

  end-echo:
    desc: ending message
    run: echo [END] $NAME HOST[$SUP_NETWORK]

  # Named set of commands to be run remotely
  ping:
    desc: Print uname and current date/time.
    run: uname -a; date

  pre-build:
    desc: Initialize directory
    run: mkdir -p $PRODUCTION_DST

  upload:
    desc: Upload dist files to all hosts
    upload:
      - src: ./
        dst: $PRODUCTION_DST

targets:
  deploy:
    - start-echo
    - pre-build
    - upload
    - end-echo

上記の例では
targetsに「deploy」を設定し
一括で処理したいショートカットを設定している。

なので以下のようにコマンドを打つと、一気に4つの処理が同時に走る。

$ sup production deploy

この状態だけだと、ただデプロイしてるだけなので
ビルドから実行までのタスクも次回は書きたい。