旅するえんじにあ - Engineers to Travel -

旅するエンジニアの気まま備忘録

【Windows】 IPv6よりもIPv4を優先させる設定

自宅からノートPCは全てMacなんですが、今開発端末でWindowsを使っています。 そこでたまに困る事があるんです。

指定されたGitlabへ接続するのにVPNに接続してcloneしようとしても名前解決ができない。

鍵登録してるし、VPN繋いでるし何が悪いんだと思ってローカルに作ったVirtualboxからではなく Windowsコマンドプロンプトを使ってpingを打ってみると、見事にIPv6で表示されている。

今使っているWindows7ではどうやらIPv4よりもIPv6が優先されてしまっているようです。

前まではIPv6を無効にするみたいなことをしていたのですが、時期が時期ですし、Microsoftも非推奨。 さらにいつの間にかIPv4が枯渇してしまい、サービスがIPv6に変わっていたなんて事も考えると無効にするのはナンセンスなので 優先順位を変える対応をしたいと思います。

Windowsコマンドプロンプトを管理者として実行し以下のコマンドを実行

netsh interface ipv6 show prefixpolicies

すると

C:\Windows\system32>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::1/128
        40      1  ::/0
        30      2  2002::/16
        20      3  ::/96
        10      4  ::ffff:0:0/96
         5      5  2001::/32

こんな感じで表示されました。

40      1  ::/0

上記がIPv6です。

10      4  ::ffff:0:0/96

そしてこれがIPv4

この順番を変更してあげます。

netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 50 0
netsh interface ipv6 set prefixpolicy ::1/128 40 1
netsh interface ipv6 set prefixpolicy ::/0 30 2
netsh interface ipv6 set prefixpolicy 2002::/16 20 3
netsh interface ipv6 set prefixpolicy ::/96 10 4

上記コマンドを一つずつ叩いていくと一回毎に「OK」という表示が出てきます。

全て打ち終えたら再度確認します。

C:\Windows\system32>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::ffff:0:0/96
        40      1  ::1/128
        30      2  ::/0
        20      3  2002::/16
        10      4  ::/96
         5      5  2001::/32

このような形でIPv4を優先にしてあげればIPv4が優先となり、pingを打つとIPv4で名前解決されると思います。

IPv6がいつ始まるのかと数年前からそわそわしてますが、こういうところにも弊害が出てくるんですね。

一応覚書として。

【PHP】 PHPでの静的解析 SonarQubeを使ってみた

最近ネタもなく、日々テストとLibraryの作成を行っていました。 という言い訳で更新しないのは悪だと思っているので、ちょっと心いれかえて。

今回はPHPの静的解析についてです。 前々から静的解析ツールについては良い物が見当たらず、もちろんあるっちゃあるのですが コレジャナイ感が強かったのですが、勧められたツールがあったのでそれを今回は導入していきたいと思います。

静的解析って?

まずは静的解析とは何か。

静的解析とはプログラムを実行せずに、コードの問題点を見つける。 特定のコーディングパターンに違反している箇所を指摘する。

というのもになります。 少人数で開発していたとしてもレガシーなコードは増えていきます。 コピーして同じロジックが出来上がっていたり、コーディング規約に沿った書き方でない部分 動くけど、これっていいのかな?って思う部分を指摘してくれるわけです。

静的解析ツール

・Scrutinizer

・CodeClimate

・PHPMD

等があるのだが、どうもどれもぱっとしない。 Scrutinizerは使いやすかったけど、なんかいまいち欲しい機能がなかったり、解析速度が遅かったり 1人で使う分にはいいんだけど、実は無料版だと1ヶ月しか解析結果を保持してくれなかったり。

そんな時に見つけたのがSonarQube

対応言語も豊富でユニットテスト連携可(これは他も一緒ですが)、細かく解析が可能な上に、結構WEBが見やすい。 さらにライセンスがLGPLで公開されているので、無料で拡張までできる優れものです。

ということで早速インストールして解析してみました。

ローカル環境

Java jdk jdk-8u45-linux-x64 (jdk1.8.0_45) mysql Ver 14.14 Distrib 5.5.46, for Linux (x86_64) using readline 5.1 sonarqube-5.4 sonar-scanner-2.5

まずはJavaのインストールです。

ソースは基本/usr/local/srcにdownloadするものとします。 wgetにてJDKをダウンロード

cd /usr/local/src

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz"
tar xvf jdk-8u45-linux-x64.tar.gz

解凍したフィアルを移動 /usr/local/javaがない場合は作成

mkdir /usr/local/java
mv /usr/local/src/jdk1.8.0_45 /usr/local/java/

わかりやすいようにシンボリックリンクを張る

ln -s /usr/local/java/jdk1.8.0_45 latest

環境変数JAVA_HOMEを設定する

touch /etc/profile.d/javaenv.sh
touch /etc/profile.d/javaenv.csh
vim /etc/profile.d/javaenv.sh

export JAVA_HOME=/usr/local/java/latest
export PATH=$PATH:$JAVA_HOME/bin
vim /etc/profile.d/javaenv.csh

setenv JAVA_HOME=/usr/local/java/latest
setenv PATH=$PATH:$JAVA_HOME/bin

mysql設定

既にmysqlはインストール済を想定しています ユーザ作成及び権限付与

CREATE USER 'sonar'@'localhost' IDENTIFIED by 'sonar';
GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost';

SonarQube用のDatabase作成

CREATE DATABASE sonar;
FLUSH PRIVILEGES;

SonarQubeインストール及び設定

ソースディレクトリに移動してwgetでSonarQubeをダウンロード、解凍

cd /usr/local/src
wget "http://dist.sonar.codehaus.org/sonarqube-5.4.zip"
unzip sonarqube-5.4.zip

解凍したフィアルを移動 移動先ディレクトリは/usr/local/sonarqubeとし、ディレクトリがない場合は作成し、わかりやすいようにシンボリックリンクを張る

mkdir /usr/local/sonarqube
mv /usr/local/src/sonarqube-5.4 /usr/local/src/sonarqube/
ln -s /usr/local/src/sonarqube-5.4 sonar

JAVA同様に環境変数SONAR_HOMEを設定します。

touch /etc/profile.d/sonarenv.sh
touch /etc/profile.d/sonarenv.csh
vim /etc/profile.d/sonarenv.sh
export SONAR_HOME=/usr/local/sonarqube/sonar
export PATH=$PATH:$SONAR_HOME/bin/linux-x86-64
vim /etc/profile.d/sonarenv.csh
setenv SONAR_HOME=/usr/local/sonarqube/sonar
setenv PATH=$PATH:$SONAR_HOME/bin/linux-x86-64

SonarQubeでMySQLを使うので、SonarQubeの設定を書き換えます。

vim /usr/local/sonarqube/sonar/conf/sonar.properties

 #--------------------------------------------------------------------------------------------------
 # DATABASE
 #
 # IMPORTANT: the embedded H2 database is used by default. It is recommended for tests but not for
 # production use. Supported databases are MySQL, Oracle, PostgreSQL and Microsoft SQLServer.

 # User credentials.
 # Permissions to create tables, indices and triggers must be granted to JDBC user.
 # The schema must be created first.
 sonar.jdbc.username=sonar // mysqlのユーザ
 sonar.jdbc.password=sonar // mysqlのパスワード

 #----- Embedded Database (default)
 # H2 embedded database server listening port, defaults to 9092
 #sonar.embeddedDatabase.port=9092


 #----- MySQL 5.x
 # Only InnoDB storage engine is supported (not myISAM).
 # Only the bundled driver is supported. It can not be changed.
 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance // コメントアウトを外す

serviceから起動できるように、"/usr/local/sonarqube/sonar/conf/wrapper.conf"を編集

vim /usr/local/sonarqube/sonar/conf/wrapper.conf
wrapper.java.command=/usr/local/java/latest/bin/java

init.d以下にシンボリックリンクを張る

ln -s /usr/local/sonarqube/sonar/bin/linux-x86-64/sonar.sh /etc/init.d/sonar

サービス開始とサービス停止

service sonar start
service sonar stop

SonarQubeへ接続 http://192.168.56.10:9000/

初期ユーザはID/PASS共にadminです。

これで下準備及びWEB画面の設定が完了です。

ここから解析をしていくのですが、冒頭でも説明したように、SonarQubeは色々な言語をサポートしています。 PHPに関してはPluginを導入する必要があります。 一緒に日本語パッケージもあるのでインストールしましょう。

SonarQubeに今回解析の対象となるPHPPluginを導入 Administration > System > Update Center

以下Pluginを導入 ・PHP ・Japanese Pack

これが導入されればPHPの解析及び日本語化が可能となります。

更に解析にはSonar scannerというツールが必要になります。 このScannerで解析した結果をMySQLに突っ込んで、それをWEBから見るという仕組みになります。

それではScannerのインストールです。

cd /usr/local/src/
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.5.zip
unzip sonar-scanner-2.5.zip

コピーを取って/usr/lcoalへ移動、リンクを貼る

cp -R sonar-scanner-2.5 /usr/local/sonarqube/
cd /usr/local/sonarqube/
ln -s sonar-scanner-2.5 sonar-scanner

※srcディレクトリに不要だと思ったらmvでも良いと思います。 自分は何をインストールしたのかを見ておきたいので、容量が圧迫されない限りsrcディレクトリはDLしたファイルそのまま残ってます。。。

対象のソース配下にprojectファイルを設置することによって解析が可能となります。

vim /var/www/app/src/sonar-project.properties
sonar-project.properties
# Required metadata
sonar.projectKey=org.sonarqube:php-test-scanner
sonar.projectName=PHP :: test php project :: SonarQube Scanner
sonar.projectVersion=1.0
# Comma-separated paths to directories with sources (required)
sonar.sources=src
# Language
sonar.language=php
# Encoding of the source files
sonar.sourceEncoding=UTF-8
# exclusions
sonar.exclusions=src/vendor/**,src/tests/**

内容は見ればわかると思いますが、解析するディレクトリ、プロジェクト名(任意の名前)、言語の設定やファイルのエンコード、exclusionsは除外ディレクトリですね。

List Distributions
sonar.exclusions 除外設定
sonar.language 対象言語。 省略化するとマルチ言語として処理
sonar.projectKey プロジェクトを識別するためのキー。使用している環境で一意(ユニーク)にならなければならない。使用可能文字は アルファベットの小文字、数字、'-'、'_'、'.'、':' の記号。ただし、数字のみは不可。
sonar.projectName プロジェクト名。 Web 上でのプロジェクトの表示名となる。
sonar.projectVersion プロジェクトのバージョン
sonar.sourceEncoding ソースファイルの文字コード
sonar.sources ソースのあるフォルダー。プロジェクトファイルからの相対パスで指定
sonar.exclusions 除外するディレクトリ及びファイル

解析の時には対象のディレクトリまで移動し、sonar-runnerを実行します。

cd /var/www/app/src/
/usr/local/sonarqube/sonar-scanner/bin/sonar-runner
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://localhost:9000/api/ce/task?id=AVODDZ_yE0cjnG_A0amQ
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 43.834s
INFO: Final Memory: 43M/255M
INFO: ------------------------------------------------------------------------

上記SUCCESSが出力されれれば完了となります。

先ほども書きましたが、SonarQubeはソースをSonarQube Scannerで読み取り、DBに保存、SonarQubeでDBから解析情報を取得し、表示するというのが一連の流れです。

ScannerがSUCCESSとなった後はWEB画面にsonar-project.propertiesで設定したプロジェクト名が表示されているはずです。

これでDuplication(重複コード)や規約に添っていない危険なコードの検出ができているので、確認しながら潰していくようにします。 CIとの連携はまた別途!

WEBで管理できる上に該当部分だけピックアップしてくれ、担当者やコメント、ステータス管理までできるから重宝しています!

もしPHPの静的解析が必要な場合は、一度試してみてください!

【PHP】 filemtime関数の罠

APCでデータのキャッシュをさせつつ、色々とロジックを組んでテストしている最中にテストが通らなかったのでメモ

やりたかった事としては

・ファイルをオープンして配列化 ・配列化したデータをAPCにキャッシュ ・キャッシュさせたデータにファイルの変更日付を持たせる ・ファイルが更新されたらファイルオープンして配列化してデータをAPCに上書き

こんな処理をするmethodを作成しました。

このテストの一部に以下のテストを実施しました。

CSVファイルを設置し、配列化したデータをAPCキャッシュにstore ・ファイルの変更日時を更新 ・APCに入れているデータの日付とファイル変更をしたファイルの日付を比較 ・変更したファイルのデータを配列化して上書きする

上記のテストを実行したのだけどどうも通らない。

もちろん自分の書いたプログラムなんて信用できない。 だからテストを行っているのですが、そのテストが通らない。 テストのテストを書くか。。。いやいやいやいやいや。

ってことで書いたプログラムをにらめっこしてても解決せず。 dumpしながら確認していった結果、ファイルの時間を取得する部分がうまく動いていない。

ファイルを変更したにも関わらず、最初に入れた時の時間を返す。

もしかしたらtouch関数が何か邪魔をしているのかと思いつつ sleepさせながら確認してみたけど、やっぱりfimemtimeっぽい。

ということで困ったときのPHPマニュアル

この関数は、ファイルのブロックデータが書き込まれた時間を返します。 これは、ファイルの内容が変更された際の時間です。


返り値 ¶

ファイルの最終更新時刻を返し、失敗した場合に FALSE を返します 時間は Unix タイムスタンプとして返されます。 この関数の結果は date() 等で使用できます。

OK,言ってる事はわかるよ。 やりたいのそれですからね。

そこまで見て実装していたのが悪かったです。

注意: この関数の結果は キャッシュされます。詳細は、clearstatcache() を参照してください。

ははーんこれか。 ファイルの情報キャッシュされて変更日はキャッシュした日付を取ってきているのか。 っていうことで、処理の手前にclearstatcache(path)を入れて解決。

まさかキャッシュされているとは思わず。。。

【PHP】 APCu apc.shm_sizeを超えるとどうなるか

さてAPCuを使うようになり、まず気になるところがキャッシュと云えど限界はある。 そう、apc.shm_sizeだ。

毎回悩ましいのが、どれくらいの容量を設定していればいいのか。 実際にはttlに設定されている(実際にはプログラム上で明示的に指定するのだけど)時間でクリアされるため そこまで大きなメモリを確保する必要はない、けれども、一体どれくらいを設定したらいいのか。 更に言うと、設定したメモリを超えてしまった時、どういったことが起きるのか。

今回のAPCuはCSVデータを保存しておく(消えても問題ないようなデータ)ことが利用目的です。 どれくらい確保するかについては実際保存するだろうCSVデータなりを運用することを想定として多めに作成し、実際にAPCuに保存した上で容量を確認すれば問題ないかと思っています。 もちろんバッファも考えて多めに確保はします。

問題はその想定を超えて、オーバフローしてしまった時に何が起こるかです。

色々と検索してみたのですが、APCuについての記述が少ないため、実際に行ってみることにしました。

APCuの設定についてはphp.iniに記述をしているため、php.iniのAPCuの設定の apc.shm_sizeを変更していきます。

[APCu]
; add apc
apc.enabled=1
apc.enable_cli=1
apc.shm_size=1M
apc.ttl=3600
apc.gc_ttl=3600

このような形でshm_sizeを1Mと小さめに設定しました。

そして適当に配列を作ってAPCuに突っ込んでいきます。

とりあえず用意したのは以下methodです。

<?php

    // apcuのキャッシュクリア
    public function apcu_clear()
    {
        var_dump(apcu_clear_cache());
    }

    // apcuの情報取得
    public function apcu_info()
    {
        var_dump(apcu_cache_info());
    }

    // apcuへ追加
    public function apcu_test_store()
    {
        $loopCount = 2950;

        for ($i=0; $i < $loopCount; $i++) {
            $key = 'test' . $i;
            $data = [
                $key,
                'hoge' => [
                    'foo' => 'bar',
                    'hogehoge',
                    'true'
                ],
                'hoge2' => [
                    'foo' => 'bar',
                    'hogehoge',
                    'true'
                ]
            ];

            apcu_store($key, $data);

        }
        var_dump(apcu_cache_info());
    }

とりあえず適当にさくっと組んだのでプログラム自体は簡単なものになっています。

まずはapcu_clear_cache()を使ってAPCuを綺麗にします。 そこからapcu_test_storeを使って指定回数分だけデータを突っ込んで、shm_sizeを超えるまでループでデータを入れます。

apcu_storeはkeyが同一であれば上書きを、keyが存在しない場合は追加をします。

$loopCountを使ってapcuにデータを入れていくのですが、2950回データを入れていくと以下のような形でapcu_cache_info()が表示されます。

array (size=13)
  'num_slots' => int 4099
  'ttl' => int 3600
  'num_hits' => float 0
  'num_misses' => float 0
  'num_inserts' => float 1475
  'num_entries' => int 1475
  'expunges' => float 1
  'start_time' => int 1452565478
  'mem_size' => float 967600
  'memory_type' => string 'mmap' (length=4)
  'cache_list' => 
    array (size=1475)
    0=> ...
    ...
    ...
    ...

mem_sizeを見てみるとギリギリ1Mないくらいですね。 cache_listのarray sizeは1475です。

そしてここで一度apcu_clear_cache()して、apcu_test_store methodの$loopCountを2951に設定して再度検証してみます。 すると結果は以下のようになりました。

array (size=13)
  'num_slots' => int 4099
  'ttl' => int 3600
  'num_hits' => float 0
  'num_misses' => float 0
  'num_inserts' => float 1
  'num_entries' => int 1
  'expunges' => float 2
  'start_time' => int 1452565676
  'mem_size' => float 656
  'memory_type' => string 'mmap' (length=4)
  'cache_list' => 
    array (size=1)
      0 => 
        array (size=9)
          'info' => string 'test2950' (length=8)
          'ttl' => int 0
          'num_hits' => float 0
          'mtime' => int 1452565676
          'creation_time' => int 1452565676
          'deletion_time' => int 0
          'access_time' => int 1452565676
          'ref_count' => int 0
          'mem_size' => int 656
  'deleted_list' => 
    array (size=0)
      empty
  'slot_distribution' => 
    array (size=1)
      3049 => int 1

なんということでしょう。 cache_listのarray sizeが1になっています。

そうです。mem_sizeがオーバーフローした結果、今までのデータが吹っ飛んで、一番最後の1つだけが追加されたのです。

ということで、shm_sizeをぎりぎりとかにして運用していると大変なことになります。 基本的には全部同時に入れることはないとは思いますが、どこかでこういったことが起きる可能性はあるということです。

問題はsetしたデータがgetできなくなるだけではありません。

どういう挙動をしているかはわからないのですが、オーバーフローするときにapcu_clear_cacheのようなものが走った時、今は1Mに設定しているデータが消えているだけですが、数Gのデータがクリアされるとなるとパフォーマンスにも大きく影響を与える可能性があります。 APCuの全キャッシュクリアは、同じプロセスの処理をすべてブロックするため、高負荷による影響が出てくると考えられます。

こうならないためにも適切且つ余裕のあるメモリサイズを確保しましょう。

【PHP】 APCuでfetchに失敗する

最近はlibraryのテストしたり検証をしたり 大抵はここはこうしたほうがいいとかこういうルールでやるならこっちのほうがいいんじゃないかっていう討論だけ繰り広げている状態です。 話がまとまれば作業は早いのですが。

さてそんな中今まで意識していないかったAPCuというものを使って作業をする部分が出てきました。 やりたいことはAPCuに配列のデータを突っ込むことです。 memcachedのような使い方をしたいということですね。

プロセス間通信も発生しないので爆速で動くのではということでAPCuについて調査しているところで以下に躓きました。

適当にテストファイルを作り、コマンドラインより実行させようとした時 以下のようなエラーが発生しました。

<?php

$key = 'hoge';

$data = [
    'test',
    'hoge' => [
        'fuga',
        'foo' => 'bar'
    ]
];

apcu_store($key, $data);

print_r(apcu_cache_info());

apcu_fetch($key);

本当に単純な処理ですね。 ここから作ったファイルをコマンドラインから実行してみると以下エラーが発生しました。

Warning: apcu_cache_info(): No APC info available.  Perhaps APC is not enabled? Check apc.enabled in your ini

APCuが有効になっていないかも?ってことで、ああ、なるほどと。 ということでphpinfoを確認

php -r 'phpinfo();' | grep apc.enable
apc.enable_cli => Off => Off
apc.enabled => On => On

有効になっている・・・ ここで見つけたのがapc.enable_cliの記述 もしかしたらと思い、php.iniに以下を追加

[APCu]
; add apc
apc.enabled=1

apc.enable_cli=1 ; add cli

apc.shm_size=64M
apc.ttl=3600
apc.gc_ttl=3600

するとうまく動くようになりました。 どうやらapc.enable_cliコマンドラインから叩く場合APCuを有効にする設定だったようです。 さて、色々調べながらこれからAPCuの有用性について調べていきます。

【MySQL】 外部からVirtualBox環境のMySQLへ接続する

今開発環境はWindowsを使用しているのですが、もちろんVirtualBoxの環境はCentOSなわけで。 Mac環境にすればいくらか楽なのですが、なんでか行く先々でWindowsが用意されているので 開発についてはWindowsに慣れてしまっています。 もちろん個人で開発したり、自宅は全てMac環境なのですが。

更にデータ管理者やプランナーにデータベースの説明をしたり テーブル構造について相談するときにターミナルだととても嫌がるというか 見難いと思われるようです。 エンジニア同士だったら問題ないのですが、、、

ということで毎回IDE的なものを入れてたりするのですが、毎回接続できなくて調べるので 接続についてのポイントを書いておこうと思います。

今回はHeidiSQLというGUIツールを試してみました。 ※どんなツールでも変わらないのですが

インストールも終わり、いざ接続というところで

sql error host is not allowed to connect to this mysql server

と出てくるわけです。

MySQLのVersionにもよるのですが、

Can't connect to MySQL server

というエラーを吐くこともあります。

この2点について解決していきたいと思います。

Can't connect to MySQL serverについてはmy.cnf内にbind-adressという設定をしている時に出てくることが多いです。

VirtualBox上のMySQLの設定を見ていきます。 bind-addressとは指定IPからの接続を許可するものになります。 こちらが設定されている場合、指定したIPからの接続しか許可されていないために接続ができないとエラーが出るわけです。 セキュリティの事を考えるとここのbind-addressを接続したいマシンのIPアドレスを入れる事によって解決しますが 今回のようにローカルマシンで接続する場合にはbind-addressをコメントアウトすることによってどのIPからも接続することができます。

次にhost is not allowed to connect to this mysql serverについてです。 このエラーについてはallowedつまり権限がないというエラーになっています。 なのでこちらについてはMySQLユーザに対して権限を付与してあげます。

GRANT ALL PRIVILEGES ON *.* TO root@'192.168.%' IDENTIFIED BY 'root のパスワード' WITH GRANT OPTION;

上記のコマンドについてはrootユーザに対して権限を付与しています。

これで接続が可能となるはずです。 毎回これで調べてるのに忘れているってことは実践とこういったブログなどでのアウトプットまでしないとダメですね。 最近わからないことを調べようとする度にこのブログにあったなぁと思って見るようになってきました。 毎日じゃなくても、わからないことがあったらブログ等でアウトプットする事を習慣化することは重要ですね。

【Redis】 CentOSにRedisをインストールして簡単な動作検証

今回はRedisの導入をしてみました。 最近はKVSといえばRedisみたいになってきましたね。 そんなことないかもですが。

昔はTokyo TyrantとかKyoto Tycoonとかあったもんですがね。 最近全然聞かず、話に出しても「懐かしー」って感じになってきましたね。

Redisはメモリ上で動作する高速なKVSで、メモリ上にあるってことは動作停止やハードの再起動とか電源が切れたりしたら保存されているデータが消えてしまうんじゃないかって不安があると思うのですが、データをディスクに持たせることができるのでキャッシュ用のデータベースとしても優秀なのですが、データストアとしても利用できるように設計されているみたいです。 すごいですね。

早速やっていきましょ!

makeして入れるので必要なソフトウェアが入っているか確認 必要なのは以下の3つ。 環境作っている人なら大体必須なので入っているはず?

wget, gcc, make

まずはwgetでRedisを落とします。 今回は指定があったので3.0.3を落としました。

# wget http://download.redis.io/releases/redis-3.0.3.tar.gz

ちなみに最新版で言うと現時点では3.0.5が最新になります。

http://redis.io/

インストールはお馴染みの感じなのでさくっと

# mv redis-3.0.3.tar.gz
# cd redis-3.0.3.tar.gz /usr/local/src/
# tar xzvf redis-3.0.3.tar.gz
# cd redis-3.0.3
# make
# make install

これでインストールは完了です。 次に設定ファイルを編集します。

設定ファイルは解凍したredisのフォルダ内にあるのですが、他のミドルウェアと同様に/etc配下に置いちゃいました。 わかりやすいからね。

mkdir /etc/redis/
cp /usr/local/src/redis-3.0.3/redis.conf /etc/redis/

さて、設定していきましょう。

daemonize no
↓
daemonize yes

logfile ""
↓
logfile "/var/log/redis.log"

上記2点ですね。

redisの起動方法は先程設定したconfを指定して起動させます。

# /usr/local/bin/redis-server /etc/redis/redis.conf

これで動作しているはずです。

psコマンドなどで確認してみましょう

# ps -aux | grep redis

立ち上がっていることが確認できたら 早速動作確認をしてみましょう。

# redis-cli
127.0.0.1:6379> set key "hello world"
OK
127.0.0.1:6379> get key
"hello world"
127.0.0.1:6379> exit

set して getできればOKですね。

これでRedisのインストールから動作検証までが完了となります!