tech.farend

技術メモ置き場

Ubuntuのデフォルトのエディタをvimに変更する

1
update-alternatives --config editor

--config の後ろにはeditor以外にもさまざまなパラメータを指定できる。指定できるものは /etc/alternatives 以下にあるシンボリックリンクの名称。

lxc-createの -t オプションで指定できるテンプレートの一覧

lxc-createコマンドで新しいLXCコンテナを作成するとき、 -t オプションによってどのテンプレートを使うか(どのディストリビューションのコンテナを作成するか)指定する。

指定できるテンプレート名を確認するには /usr/share/lxc/templates ディレクトリを参照すればよい。テンプレートのファイル名から lxc- を除いたものが指定できる。

具体的には下記の通り。

  • alpine
  • altlinux
  • archlinux
  • busybox
  • centos
  • cirros
  • debian
  • fedora
  • gentoo
  • openmandriva
  • opensuse
  • oracle
  • plamo
  • sshd
  • ubuntu
  • ubuntu-cloud

SHIRASAGIをインストールする手順(3)

SHIRASAGIをインストールする手順(2)の続きです。

ここからはSHIRASAGI公式サイトのインストール手順に従って進めます。

Packages

1
# yum -y install ImageMagick ImageMagick-devel  

MongoDB

ここでMongoDBをインストールします
※先にインストールすると既にあるものとぶつかり合ってしまいます

1
# vi /etc/yum.repos.d/CentOS-Base.repo  

以下を一番最後に追記する

1
2
3
4
5
[10gen]  
name=10gen Repository  
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/  
gpgcheck=0  
enabled=0  
1
# yum -y --enablerepo=10gen install mongo-10gen mongo-10gen-server  

(バージョン確認してみるとインストールできたことが分かります)

1
2
# mongo -version  
MongoDB shell version: 2.6.7  
1
2
3
# /sbin/service mongod start  
Starting mongod:                                           [  OK  ]  
# /sbin/chkconfig mongod on  

Ruby (RVM)

1
# \curl -sSL https://get.rvm.io | sudo bash -s stable  

警告が出ました

示してある通りにする

1
sudo gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3  

再度行う

1
2
3
4
5
# \curl -sSL https://get.rvm.io | sudo bash -s stable  

# source /etc/profile  

# rvm install 2.1.2  

(rvmのバージョンを確認したい場合は)

1
2
# rvm -v  
rvm 1.26.9 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]  

SHIRASAGI

1
2
# git clone -b stable --depth 1 https://github.com/shirasagi/shirasagi /var/www/shirasagi  
-bash: git: コマンドが見つかりません  

gitがないと言われたのでインストールします
参考:Gitのインストール

1
# yum install git  

最後に「完了しました!」と表示されたらOK

再度行う

1
2
3
4
5
6
# git clone -b stable --depth 1 https://github.com/shirasagi/shirasagi /var/www/shirasagi  
# cd /var/www/shirasagi  
# cp config/samples/* config/  
# bundle install  
# rake unicorn:start  
bundle exec unicorn_rails -c /var/www/shirasagi/config/unicorn.rb -E production -D  

http://localhost:3000/.mypage にアクセスしてください」と書いてある(インストール手順)

でも、今はVirtualBox上の仮想マシンなので
いつも通りブラウザではアクセスしても表示されません。

(ちなみに http://192.168.56.101:3000/.mypage/ にもアクセスできない)

ターミナル上でアクセスする

1
2
# curl http://localhost:3000/.mypage  
<html><body>You are being <a href="http://localhost:3000/.mypage/login">redirected</a>.</body></html>  

言われた通りに http://localhost:3000/.mypage/login へアクセスする

1
2
3
4
5
6
7
8
9
# curl http://localhost:3000/.mypage/login  
<!doctype html>  
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">  
<head>  
.
.
.
</body>  
</html>  

ターミナルにhtmlが表示され、アクセスできた

こちらにもアクセスできます

1
# curl http://192.168.56.101:3000/.mypage/login  

ブラウザでアクセスできるようにします

1
# service iptables stop  

ブラウザを起動してアクセスする
http://192.168.56.101:3000/.mypage/login

画面が表示されました!

ふりがな機能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# cd /usr/local/src  
# wget http://mecab.googlecode.com/files/mecab-0.996.tar.gz \  
       http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz \  
       http://mecab.googlecode.com/files/mecab-ruby-0.996.tar.gz  

# cd /usr/local/src  
# tar xvzf mecab-0.996.tar.gz && cd mecab-0.996  
# ./configure --enable-utf8-only && make && make install  

# cd /usr/local/src  
# tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz && cd mecab-ipadic-2.7.0-20070801  
# ./configure --with-charset=utf8 && make && make install  

# cd /usr/local/src  
# tar xvzf mecab-ruby-0.996.tar.gz && cd mecab-ruby-0.996  
# ruby extconf.rb && make && make install  

# echo "/usr/local/lib" >> /etc/ld.so.conf  
# ldconfig  

問題なくできました。

データベース操作

インデックスの作成

1
2
# cd /var/www/shirasagi  
# rake db:create_indexes  

管理者ユーザーの作成

1
# rake ss:create_user data='{ name: "システム管理者", email: "sys@example.jp", password: "pass" }'  

サイトの作成

1
# rake ss:create_site data='{ name: "サイト名", host: "www", domains: "localhost:3000" }'  

サンプルデータ

ユーザー、グループデータの登録

1
# rake db:seed name=users site=www  

サイトデータの登録

1
# rake db:seed name=demo site=www  

ブラウザのログイン画面で入力してみる
Email:sys@example.jp
Password:pass

ログインできました!
これでSHIRASAGIのインストールは完了です。おつかれさまでした。

GlusterFS構築手順

Linuxにおいてファイル領域を冗長化したい場面は多いと思います。
例えばファイルサーバやNFSサーバなどの共有領域は冗長構成にしておきたい場面は多いのでは無いでしょうか。
オンプレなサーバであれば、媒体自体をハードウェアRAIDやソフトウェアRAIDでミラーリングしたり、DRBD等のツールでクラスタ化することが多いと思います。 クラウドを使った場合は、いろいろと仕様的な制限があったりで、使えない場合があります。
今回は簡単に構築でき、マスターレスで動作する分散ファイルシステム GlusterFS の設定について書きます。

ホストの用意

今回CentOS6、Amazon Linuxにて検証
※2台のVolume提供サーバをそれぞれ gfs_sv1・gfs_sv2、クライアントをgfs_clと仮定します。

提供領域の確保(※Volume提供サーバの作業)

提供用の領域を準備する

クラウドやアーキテクチャに従い作業
なお、提供領域が外部volumeで無い場合は、下記 /etc/fstab への追記までの作業は不要。

増設領域のマウントポイントを作る

今回の例は/var/glustervols

1
# mkdir /var/glustervols

領域をマウント

下記はext4でマウントしている

1
# mount -t ext4 /dev/xxx /var/glustervols

再起動時に自動マウントするように、 /etc/fstab に追記する

1
/dev/xxx /var/glustervols ext4 defaults 0 0

領域のユーザをアプリケーションサーバと同じにし、パーミッションを変更する

※UIDに注意

今回の例では、apacheの領域として設定

1
2
3
# groupadd -g 600 apache
# useradd -g 600 -s /sbin/nologin -u 600 -d /var/glustervols apache
# chown -R apache:apache /var/glustervols

すべての機器にGlusterFSを導入する

Glusterよりリポジトリサイトを登録

1
2
3
# cd /etc/yum.repos.d/
# yum -y install wget
# wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo

/etc/yum.repos.d/glusterfs-epel.repoenabled=1enabled=0 に書き換え、指定時以外はyumリポジトリを参照しないようにする。

1
# sed -i -e 's/enabled=1/enabled=0/g' /etc/yum.repos.d/glusterfs-epel.repo

GlusterFSをインストールし、起動する

※Amazon Linuxの場合$releaseverの値が取得できないので、yumの実行前に /etc/yum.repo.d/glusterfs-epel.repo$releasever6など適切な物に 書き換える

1
2
3
# yum --enablerepo=glusterfs-epel -y install glusterfs-server
# /etc/init.d/glusterd start
# chkconfig glusterd on

DNSが使用できないときのために、 /etc/hosts に追記する

1
2
3
xxx.xxx.xxx.xxx gfs_sv1
xxx.xxx.xxx.yyy gfs_sv2
xxx.xxx.xxx.zzz gfs_cl

Volume提供サーバ(の内、どちらか一方)にてVolumeを構成する。

例ではgfs_sv1において、replicaモードで2つの領域( gfs_sv1の /var/glustervolsgfs_sv2の /var/glustervols )を一つの vol01 という仮想ボリュームとして構成している

1
2
3
4
# gluster peer probe gfs_sv2
# gluster peer probe gfs_cl
# gluster volume create vol01 replica 2 transport tcp gfs_sv1:/var/glustervols gfs_sv2:/var/glustervols
# gluster volume start vol01

注意する点としては、 gluster peer probe コマンドで連携するホストを指定するが、 Glusterクライアントの gfs_cl も含めている ところ。

クライアントにてlocalhostをマウントする

今回の例では、gfs_clでの作業

1
2
3
# mkdir /var/app01
# chown -R apache:apache /var/app01
# mount -t glusterfs localhost:/vol01 /var/app01

起動時に自動マウントする場合は /etc/fstab に下記を追記する。

1
localhost:/vol01 /var/app01 glusterfs defaults,_netdev 0 0

これでクライアントであるgfs_clにおいて、 /var/app01 にファイルやディレクトリを作成すると、両方のVolume提供サーバの /var/glustervols にファイルが作成され冗長構成が実現する。
その後の編集なども同期され冗長化は維持される。

その他

クライアントがglusterfsファイルシステムを利用出来ない場合は、nfsでマウントすることも可能。
この場合クライアントからはVolume提供サーバのどちらかを指定しマウントすることになる。

GlusterFSは、マスターを持たないのでどちらを指定しても良い。
ただし、Volume提供サーバの物理的な故障などで冗長化が壊れた場合、glusterfsマウントした場合は自動的に動作中のVolume提供サーバと通信し、サービス可動が維持できるが、 NFSマウントした場合は指定したVolume提供サーバが落ちた場合は停止する ことになる。

SHIRASAGIをインストールする手順(2)

SHIRASAGIをインストールする手順(1)の続きです。

ここからの手順は、前提としてVirtualBoxにCentOS6.5 64bitがインストールされた状態です。

SHIRASAGI公式サイトの動作環境に記載されているものをインストールしていきます

  • CentOS 6.5 64bit ←済
  • nginx または Apache ←ここではApacheをインストールします
  • Unicorn
  • MongoDB ←まだインストールしない
  • Ruby 2.1.2
  • Ruby on Rails 4.1.6

1.Apacheのインストール

1
# yum -y install httpd

最後に「完了しました!」と表示されたらOK

バージョンの確認

1
2
3
# apachectl -v
Server version: Apache/2.2.15 (Unix)
Server built:   Oct 16 2014 14:48:21

インストールされたことが確認できました。

2.Rubyのインストール

参考:Rubyのインストール
以下のコマンドでインストールすると、現時点(2015年1月)では古いバージョン(1.8.7)がインストールされるのでしないように気をつける。

1
# yum install ruby ←これはしない!

今回は「Ruby2.1.2」という指定があるので、次の方法でインストールします。
参考:Ruby2.0をソースからインストールする手順 (CentOS/RedHat)

ダウンロードします

1
2
3
# cd /usr/local/src
# wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz
-bash: wget: コマンドが見つかりません

wgetがないと言われたのでインストールします

1
# yum install wget

最後に「完了しました!」と表示されたらOK

再度ダウンロードします

1
# wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz

最後に「完了しました!」と表示されたらOK

展開します

1
# tar zxvf ruby-2.1.2.tar.gz

コンパイル・インストールします

1
2
3
4
# cd /usr/local/src/ruby-2.1.2
# ./configure
# make
make: *** ターゲットが指定されておらず, makefile も見つかりません.  中止.

このエラーを解決するためにはgccのインストールが必要らしい

1
# yum -y install gcc

最後に「完了しました!」と表示されたらOK

再度

1
2
# make
# make install

バージョンを確認します

1
2
# ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

インストールされていることが確認できました!

次の作業のためにディレクトリを移動します

1
# cd /root/

3.Unicornのインストール

参考:Unicorn: Rack HTTP server for fast clients and Unix

インストールします

1
2
3
4
5
# gem install unicorn
ERROR:  Loading command: install (LoadError)
  cannot load such file -- zlib
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

zlibがないらしいので入れます

1
# yum install zlib-devel

最後に「完了しました!」と表示されたらOK

改めてインストール

1
2
3
4
5
# gem install unicorn
ERROR:  Loading command: install (LoadError)
  cannot load such file -- zlib
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

さっきと同じエラーが出たので入ってないらしい

参考:centOS6.4にrail4をいれる

zlibというディレクトリに移動して実行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# cd /usr/local/src/ruby-2.1.2/ext/zlib/

# ruby extconf.rb
checking for deflateReset() in -lz... yes
checking for zlib.h... yes
checking for crc32_combine() in zlib.h... yes
checking for adler32_combine() in zlib.h... yes
checking for z_crc_t in zlib.h... no
creating Makefile

# make install
compiling zlib.c
linking shared-object zlib.so
/usr/bin/install -c -m 0755 zlib.so /usr/local/lib/ruby/site_ruby/2.1.0/x86_64-linux
installing default zlib libraries

改めてインストール

1
2
3
# gem install unicorn
ERROR:  While executing gem ... (Gem::Exception)
    Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

さっきのエラーはなくなったけど別のエラーが発生しました…

opensslをインストールしないといけないらしいのでインストールします

opensslというディレクトリに移動して実行

1
2
3
4
5
6
7
8
9
10
# cd /usr/local/src/ruby-2.1.2/ext/openssl

# ruby extconf.rb
checking for t_open() in -lnsl... no
checking for socket() in -lsocket... no
checking for assert.h... yes
checking for openssl/ssl.h... no

# make
make: *** `ossl.o' に必要なターゲット `/thread_native.h' を make  するルールがありません.  中止.

エラーが発生しました

参考:rubyのインストール

1
2
3
4
5
6
7
8
9
10
11
12
13
# find / -name thread_native.h
*/usr/local/src/ruby-2.1.2/*thread_native.h

# vi Makefile
topdir = /usr/local/include/ruby-2.1.0
top_srcdir = */usr/local/src/ruby-2.1.2/* ←追記

# make
linking shared-object openssl.so

# sudo make install
/usr/bin/install -c -m 0755 openssl.so /usr/local/lib/ruby/site_ruby/2.1.0/x86_64-linux
installing default openssl libraries

改めてインストールします

1
# gem install unicorn

バージョンを確認します

1
2
# unicorn -v
unicorn v4.8.3

無事にインストールされたことが確認できました!

4.Ruby on Rails 4.1.6のインストール

参考:Ruby on Rails: Download    第1章 ゼロからデプロイまで

今回は4.1.6をインストールしたいのでバージョン指定します

1
# gem install rails --version 4.1.6

バージョンを確認します

1
2
# rails -v
Rails 4.1.6

インストールされたことが確認できました!

これで環境が整いました。
MongoDBをまだインストールしていませんが、あとで行います。
(このときにインストールすると手間がかかるため)

SHIRASAGIをインストールする手順(1)

SHIRASAGI公式サイトダウンロードページにアクセスします。
インストール手順がありますが、前提として動作環境に記載された状態にする必要があります。

動作環境に記載されている通り、 OSは以下のどちらかにする必要があります。
* CentOS 6.5 64bit
* ubuntu Server 14.04LTS

今回はCentOS 6.5 64bitをインストールします。

VirtualBoxに新規の仮想マシンを作成し、CentOS6.5をインストールする

(※ はじめにVirtualBoxをインストールする必要があります。)

この手順は詳しく書きませんが、以下のページを参考にしたらできました。
* VirtualBoxのネットワーク設定とCentOS6.5のインストール
* macにVirtualBoxをインストールしてCentOSを起動してホストとssh接続、最後に共有ディレクトリの設定まで

<気をつけたこと>
* 容量不足になるといけないのでファイルサイズを20GBにした
* 言語設定では日本語を選択するが、キーボードではアメリカ合衆国(U.S)を選択する

これでOSの準備ができました!

起動後、ログインします。

1
2
localhost login: root
Password: パスワードを入力する

ログインできました!

—– 以下はしなくてもいいけど、やっておくと便利なこと —–

ターミナルからssh接続する

VirtualBoxのCentOS上の画面での操作は慣れないと不便な点
(スクロールできない、コピー&ペーストできない等)があるので
ターミナルからssh接続できるようにしました。

参考:macにVirtualBoxをインストールしてCentOSを起動してホストとssh接続、最後に共有ディレクトリの設定まで

手順は次のようになります。
1. ホストオンリーネットワークを作成
2. 仮想マシンでホストオンリーアダプタを設定
3. 2つのファイルを編集

以下は補足として3. 2つのファイルを編集するときの操作を詳しく書きました。

1
# vi /etc/sysconfig/network-scripts/ifcfg-eth0

「i」キーを押す (下に「– INSERT –」と出れば入力モードになる)

下記のように書き換える

1
2
3
4
5
6
DEVICE=eth0
HWADDR=08:00:27:xx:xx:xx
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp

<気をつけたこと>
* カーソルを見失った場合は「command」キーを押して切り替え
* スクロールはできないので、キー操作で移動する

編集し終わったら…
「esc」キーを押す
「:wq」と入力する(上書き保存して終了)

同じように下記も書き換える

1
# vi /etc/sysconfig/network-scripts/ifcfg-eth1

「esc」キーを押して、「i」キーを押す

1
2
3
4
5
6
7
8
9
10
DEVICE=eth1
HWADDR=08:00:27:xx:xx:xx
TYPE=Ethernet
UUID=xxxxxx-xxxx-xxxxx-xxxxx-xxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.56.101
NETMASK=255.255.255.0
NETWORK=192.168.56.0

「esc」キーを押して、「:wq」と入力する

2つの編集が終われば、ネットワークの再起動をする

1
# /etc/init.d/network restart

ターミナル(Macの場合)を起動して接続します
(Finder > アプリケーション > ユーティリティ > ターミナル)

1
2
$ ssh root@192.168.56.101
root@192.168.56.101’s password: パスワードを入力する

これでターミナルからssh接続できるようになりました!

ダミーファイルをいっぱい作る

ファイル関係のテスト用にダミーファイルがいっぱい必要な事ありますよね。

シェルスクリプトが面倒なのでRubyでつくりました。
ただし、実際のファイル作成についてはddコマンドを実行しています。 ループとファイル名作成はRubyで、ファイルそのものはコマンドを使うという怠け者( => オレ)です。

1
2
3
4
5
6
7
8
9
10
DIR = '/testvolume/'
0.upto(99) do |i|
  i = "%02d" % i
  TARGET_DIR = DIR + 'testdir' + i.to_s + '/'
  0.upto(99) do |j|
    j = "%02d" % j
    file_name = TARGET_DIR + "testfile#{j.to_s}"
    system("dd if=/dev/zero of=#{file_name} bs=1024 count=100")
  end
end

/testvolumeディレクトリの中に、さらにtestdir00〜testdir99というディレクトリを作成し、各ディレクトリにtestfile00〜testfile99という100KBのファイルを作成しています。
ファイルサイズはsystemコマンド中のddコマンドでbsとcountを変更することで調節できます。

  • bs => ブロックサイズ( bs=1024 で1KByte)
  • count => サイズ( count=100 で上記ブロックサイズx100)

Man page of DD

VPC内のサーバ用にProxyを立てる

EIPやパブリックIPがアタッチされていないインスタンスは外部との接続ができない。
このため、yumやwgetなどができないが、それ以外にインターネットとの通信が不要の場合はproxyを経由するのが簡単。
インターネットとつながっているインスタンスにProxyを立てて、これを経由させる。

今回はCentOS6およびAmazon Linuxが対象

squidのインストールと設定

squidインストール

1
yum -y install squid

squidの設定

/etc/squid.conf を編集(主な設定のみ記載。例では経由するサーバは172.16.0.0/16にあるものとする)

1
2
3
4
5
6
7
8
9
10
11
12
13
acl localhost src 127.0.0.1/32 ::1
acl localnet src 172.16.0.0/16

acl Safe_ports port 80        # http
acl Safe_ports port 21        # ftp
acl Safe_ports port 443        # https
acl CONNECT method CONNECT
http_access allow localnet
http_access allow localhost

http_access deny all

http_port 3128

squid起動

1
2
/etc/init.d/squid start
chkconfig squid on

Proxyを経由するサーバの設定

(上記Proxyサーバを172.16.1.100と想定)

yum

/etc/yum.conf の最終行に下記を追記

1
2
#proxy settings
proxy=http://172.16.1.100:3128

apt-get

/etc/apt/apt.conf.d/80proxy を作成(ファイル名は何でも良いです。)

1
2
3
Acquire::ftp::proxy "ftp://172.16.1.100:3128";
Acquire::http::proxy "http://172.16.1.100:3128";
Acquire::https::proxy "https://172.16.1.100:3128";

wget

/etc/wgetrc 中の内容を下記の様に修正

1
2
3
https_proxy = http://172.16.1.100:3128/
http_proxy = http://172.16.1.100:3128/
ftp_proxy = http://172.16.1.100:3128/

curl

ホームディレクトリに .curlrc を作成

1
proxy = "http://172.16.1.100:3128"

Nginx簡単インストール on ubuntu

ubuntuのリポジトリのnginxは古いので新しいものをnginx本家からインストールできる様にする。

Nginx本家よりubuntu用Keyをダウンロード

1
2
3
cd /tmp
curl -L -O http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

/etc/apt/sources.listに下記(ubuntu14.04設定)を追記

1
2
deb http://nginx.org/packages/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/ubuntu/ trusty nginx

aptの情報を更新しインストール

1
2
apt-get update
apt-get -y install nginx