サーバセットアップ - pjmtdw/kagetra GitHub Wiki
以下はLightsailで景虎をセットアップしたときの手順書である. sshでサーバログインしてcdやlsしたりvimでのファイル編集ぐらいはできることが前提なので,前提条件を満たさない人はLPICのLinux標準教科書あたりを読んでおくといいかも.
使っているインスタンスプランは月5$(USD)でメモリ1GB,ディスク40GBと安い割にかなり高性能なプランとなっている. バックアップ(コンテナのスナップショット)も自由に取ることができる(0.05$/GB). OSはCentOS7を選択した.
VultrのVPSの同じ料金のプランではメモリは変わらないが,ディスクサイズが25GBと少し小さくなってしまう. ただし,障害時にgrubメニューからリカバリできる.
- サーバの基本的な設定
- PostgreSQLの設定
- Ruby周りの設定
- 景虎の設定と起動
- nginx+unicornの設定
VPSを契約したとにきにまず始めにすべきことはsshのポート番号を変えることである.
22番ポートは中国などから常時攻撃を受けており,仮に突破されないとしてもログに残るので超ウザい.
という訳で /etc/ssh/sshd_config
を編集する.
Port <Port Number> # 適当な番号に変える
PermitRootLogin no # rootログインを拒否
PasswordAuthentication no # パスワードを使ったログインも拒否(sshのみにする)
SELinuxがデフォルトでONなので semanage port -a -t ssh_port_t -p tcp <Port Number>
した後, systemctl restart sshd
しよう.
また,Lightsailではコンソールからファイアウォールを設定でき,初期設定ではSSH用のTCP22番とHTTP用の80番だけがオープンになっている. ここも22番を閉じて必要なポートを開けておく.
デフォルトでは日本になっていないの設定する.ちなみにVPSサーバはコンテナの中であり,ホスト側で時刻は設定してくれてるっぽいのでntpは必要ない.以下のコマンドを打つだけ.
# timedatectl set-timezone Asia/Tokyo
デフォルトではスワップ領域は0になっているのでスワップ領域を確保する.
(2GBをスワップ領域として設定する)
# dd if=/dev/zero of=/swapfile bs=1M count=2048
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile
(再起動時に自動設定する)
# vi /etc/fstab
(以下の行を追加)
/swapfile swap swap defaults 0 0
まずは yum update
で各ソフトをupdateしておこう.
# yum -y install bzip2 gcc-c++ patch epel-release ruby-devel ruby openssl-devel readline-devel sqlite-devel ImageMagick-devel postgresql postgresql-server postgresql-devel git nginx
node.jsはCentOSの公式rpmは提供されていないのでyumリポジトリを追加してインストール
# curl -sL https://rpm.nodesource.com/setup_8.x | bash -
# yum -y install nodejs
景虎はSequelというORMを使用していてバックエンドには色々なRDBMSが使えるが,フリーソフトかつ性能や実績の観点から言うと実質MySQLとPostgreSQLの二択になる.
locale指定しないとcollateとかがen_USになって日本語でorder byするときにメチャクチャになる.
# su - postgres
$ initdb -E UTF8 --locale=ja_JP.UTF-8
$ pg_ctl start -D /var/lib/pgsql/data -s -w -t 300
$ psql
postgres=# ALTER USER postgres PASSWORD 'postgres';
(Ctrl-D で終了)
$ vim /var/lib/pgsql/9.4/data/pg_hba.conf
(methodを md5 に変更)
$ pg_ctl restart -D /var/lib/pgsql/data -s -w -t 300
( psql -U postgres で接続確認 )
景虎はぶっちゃけそこまで頻繁に使われるサービスじゃないのでidleな時にはPostgreSQLへの通信を切断しておきたい. 通信の維持にもメモリはそこそこかかって,VPSは1GBしかメモリないのでちょっとでも節約しておきたい. そこで pgbouncer というソフトを使う.PostgreSQLへのProxy的なもので,idleな通信は自動的に切断してくれる.
$ rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.2/redhat/rhel-7-x86_64/pgdg-centos92-9.2-3.noarch.rpm
$ yum install pgbouncer
$ vim /etc/pgbouncer/pgbouncer.ini
[databases]
kagetra = host=127.0.0.1 port=5432 dbname=kagetra
hiroshima = host=127.0.0.1 port=5432 dbname=hiroshima
[pgbouncer]
auth_type = md5
server_idle_timeout = 180
pool_mode = transaction
listen_addr = 127.0.0.1
listen_port = 6432
$ vim /etc/pgbouncer/userlist.txt
"postgres" "postgres"
# systemctl start pgbouncer
これで景虎のDBの接続先を localhost:5432 から localhost:6432 に変えれば180秒以上DBへの接続がない場合は自動的に切断される.
systemctl enable postgresql
systemctl enable pgbouncer
あと /etc/rc.local に
su - kagetra bash -c '/home/kagetra/kagetra/scripts/unicorn_ctl.sh start'
とか書いておくと良いかもしれない.
まずは実際に景虎を実行するユーザを作る.以下は特に指定しない限りこのユーザで作業する
# useradd -G wheel,nginx,postgres kagetra
# su - kagetra
rubyのバージョン切り替えをrbenvを使って行う.まずはrbenvのインストール.
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
~/.bashrc
に下記を追加してsource ~/.bashrc
する
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
rbenv install 2.5.3
でRuby 2.5.3をインストールしておく.
まずは景虎のソースを落としてきて必要なgemやnodejsモジュールをインストール.
# su - kagetra
$ git clone https://github.com/pjmtdw/kagetra.git
$ cd kagetra
$ rbenv local 2.5.3
$ gem install bundler
$ rbenv rehash
$ bundle install --path .vendor/bundle
bundle install の際に
No pg_config... trying anyway. If building fails, please try again with
--with-pg-config=/path/to/pg_config
とか出る場合は
$ bundle config build.pg --with-pg-config=/usr/pgsql-9.4/bin/pg_config --with-pg-include=/usr/pgsql-9.4/include/
を実行しておく
次にブラウザ側で使われるJavaScriptライブラリをインストールしてビルドする.
# 旧版(Backbone+CoffeeScript+Foundation)の場合
$ npm install [email protected] requirejs bower # CoffeeScriptは言語仕様が変わったため(?),最新版では動かなかった
$ ./node_modules/bower/bin/bower install
$ cd ~/kagetra/deploy
$ make clean
$ make
# views/app.scssのimportを相対パスに書き換えないとmakeできなかった.これもバージョンアップが原因(?).
# 新板(Vue)の場合
$ npm install
$ npm run build
次に設定ファイルを書く.cp conf.rb.sample conf.rb
してからCONF_DB_USERNAME
などを書き換える.
あとは共通パスワードや初期属性などの初期設定を行うために
$ bundle exec ./scripts/initial_config.rb
を実行する.
さていよいよ景虎を起動してみよう.下記のコマンドを実行すると9292番ポートで景虎が起動できる.これは実際には使わない試用専用サーバなのでページをちゃんと見られることを確認したらCtrl-C
で終了させること.
$ bundle exec rackup
ただしiptablesで9292番ポートは閉じているので画面確認するにはsshでポートフォワードする.ローカルマシンで下記を実行.
$ ssh -L 1234:localhost:9292 <VPSサーバ>
この状態でローカルマシンのブラウザで http://localhost:1234/
を見るとVPSサーバの9292番パートにアクセスできる.
景虎のログイン画面が表示されたら景虎の起動は正常に行えている.
bundle exec rackup
で起動できるSinatra組み込みサーバは遅いので実際はnginx+unicornで運営することになる.unicornがSinatraのアプリケーションを実行しnginxが80番ポートからリクエストを受け取りunicornに渡すという役割分担になっている.
まずはデフォルトではnginxのgzip圧縮機能は無効になっているので有効化しておく
-- /etc/nginx/nginx.conf に以下を記述
gzip on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
次にデフォルトのServerBlock(Apacheで言うところのVirtualHostみたいなもの)を無効化して景虎の設定に差し替える.
# cd /etc/nginx/conf.d/
# cp /home/kagetra/kagetra/deploy/nginx.site.example ./kagetra.conf
-- kagetra.conf の以下の行を変更
server unix:/home/kagetra/kagetra/deploy/sock/unicorn.sock
root /home/kagetra/kagetra/public
これで sudo systemctl start nginx
すれば無事nginxが起動するはずである.ただしまだunicornを起動していないのでhttp://<VPSサーバ>/
にアクセスしても 502 Bad Gateway エラーが出る.
kagetraユーザに戻りunicornを起動する
# su - kagetra
$ ~/kagetra/scripts/unicorn_ctl.sh start
ただしこのままではnginxが ~/kagetra/public と ~/kagetra/deploy/sock にアクセスできないのでパーミッションの設定が必要になる.とりあえず/home/kagetraのgroupをnginxに変更してアクセスできるようにする
# chgrp nginx /home/kagetra
# chmod g+rx /home/kagetra
これで http://<VPSサーバ>/
にアクセスするとちゃんと景虎のログイン画面が表示されるはずである.以上でセットアップは完了.
an upstream response is buffered to a temporary file
という警告が /var/log/nginx/error.log に出る場合は
/etc/nginx/conf.d/kagetra.conf
の server{} の中に以下を追加
proxy_buffers 8 64k;
proxy_buffer_size 64k;
フォルダ/ファイルのパーミッションに問題がないのにconnect() to unix:/home/kagetra/kagetra/deploy/sock/unicorn.sock failed (13: Permission denied)
というエラーが /var/log/nginx/error.log に出る場合は
nginxに対するSELinuxの制限を無効化
semanage permissive -a httpd_t