2013年7月31日水曜日

【apache】Limitを使ってHTTPメソッドごとにアクセス制限をする

■概要
前回、Locationを使ってIP制限をかける方法を紹介しました
http://kakakikikeke.blogspot.jp/2013/07/apachex-forwarded-for.html
今回は更にLocation+Limitを使ってアクセスされたパスとHTTPメソッドを
判断してアクセス制御する方法を紹介します

■設定
vim /etc/httpd/sites-enabled/000-default
<VirtualHost *:80>
    SetEnvIf X-Forwarded-For "192.168.10.101" deny_ip
    SetEnvIf X-Forwarded-For "192.168.10.102" deny_ip

    <Location /test>
        <Limit POST>
            Order deny,allow
            Deny from all
            Allow from env=deny_ip
            ProxyPass ajp://192.168.20.100:8009/sample-app/
        </Limit>
        <LimitExcept POST>
            Order allow,deny
            Allow from all
        </LimitExcept>
    </Location>
</VirtualHost>

上記設定後にターミナルから以下を実行して設定が反映されているか確認します

  • curl -X GET https://192.168.20.100/
  • ⇒deny_ipに登録されていればアクセスできる
  • curl -X POST https://192.168.20.100/
  • ⇒deny_ipに登録されていないとアクセスできない(apacheの403がそのまま返ってくることを確認する)

結果の通りですが、POSTをHTTPメソッドで指定した場合はエラーが返却されます

また設定に際してLimitとLimitExceptは基本ペアで設定するようにしてください
参考サイト:http://httpd.apache.org/docs/2.2/ja/mod/core.html

2013年7月30日火曜日

lsyncで所有者権限を維持する方法

■概要
/usr/local/sync_dirのフォルダ同士をlsyncを使って同期します
/usr/local/sysc_dirの所有者がrootになっており、lsyncdプロセスを起動したユーザもrootとします

上記のケースで/usr/local/sysc_dir配下にtestuserが作成したファイルを同期したいと思います
testuserが作成したファイルの権限は当たり前ですが、tsetuser:testuserの権限となります
デフォルトの設定で上記ファイルを同期をすると同期元のファイルはtestuser:testuserのままですが、
同期先のファイルがroot:rootに変更になってしまいます

今回は同期先の所有者権限をtestuser:testuserに維持する方法をご紹介します

なおlsyncのバージョンは「Version: 2.1.4」とします

■設定
vim /etc/lsyncd.conf
settings {
  statusFile = "/tmp/lsyncd.stat",
  logfile = "/var/log/lsyncd.log",
  statusInterval = 1,
}

sync {
  default.rsync,
  source="/lsync",
  target="192.168.10.101:/lsync",
  rsync = {
    owner = true,
    group = true
  }
}

ポイントは「owner = true」「group = true」の箇所です
これをtrueにすることで所有者情報を維持したまま同期することができます
上記書き換え後にlsyncdプロセスを再起動すれば完了です

実はlsyncはバージョン2以降で指定できるパラメータの方法が変わりました
以前、http://kakakikikeke.blogspot.jp/2013/05/lsyncd.htmlを書いたのですが
ここで記載している設定ファイルはバージョン1系でのみ有効なして方法となります
特に「rsyncOps = "-av"」の部分は2系では有効にならないため権限情報もrootに変換されてしまいます

2系のdefault.rsyncで指定できるパラメータの情報は以下が公式で参考になります
https://github.com/axkibe/lsyncd/wiki/Lsyncd%202.1.x%20%E2%80%96%20Layer%204%20Config%20%E2%80%96%20Default%20Behavior

gitWikiのせいなのかGoogle先生のSEOが悪いのかはわかりませんがググっても公式サイトがあまり出てこないんですよね

2013年7月28日日曜日

【Windows7】コマンドプロンプトで右クリックからメニューを表示してコピー&ペーストできるようにする方法

■概要
コマンドプロントでコピー&ペーストをやろうとすると左上のアイコンをクリックして出るメニューから
編集→範囲指定→範囲を指定してEnter
その後
編集→貼り付け
とやる必要があるこのめんどくさいメニューの表示をコマンドプロントのどこかを右クリックすることで表示できるようにする方法です

■設定
  1. 左上メニューからプロパティをクリック
  2. オプションタブを選択
  3. 編集オプションのチェックボックスで「簡易編集モード」のチェックを外す

これだけでOKです
ちなみに簡易編集モードは右クリックで貼り付けをいきなり行うことができるモードです
また、コピーも入力済みの文字列を選択してEnterするだけでコピーできる設定です
(右クリックでメニューも何も表示されない場合は簡易編集モードがONでクリップボードにも何も情報がないときです)
が、右クリックでメニューを出すことができないので、この辺はお好みですがメニュー出したい場合は上記を行なってください

【apache】X-Forwarded-Forの設定方法と使い方(LocationごとにIP制限)

■概要
そもそもX-Forwarded-Forを使う場合ですが基本はロードバランサを使っているときです
Webサーバに到達した際にアクセス元のIPがロードバランサになってしまうので
本当のアクセス元IPを取得するためにX-Forwarded-Forの設定を実施します

今回はログの出し方とX-Forwarded-Forを使ったIP制限の方法を紹介します
またapacheのインストールはchefを元に実施しているものとします

■前提条件
X-Forwarded-Forはhttpで受ける際に取得することができる値です
http(LB)→http(server)

httpsでX-Forwarded-Forを使いたいときには
SSLアクセラレータ付きのLBを使用しておりかつサーバ証明書を取得しておりかつサーバ側は80番ポートで受ける必要があります
https(LB + SSLアクセラレータ + 証明書)→http(server)

■ログの出し方
vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" combined

vim /etc/httpd/sites-enabled/000-default
000-defaultは環境によって異なります
VirtualHostを設定している設定ファイルを編集してください
CustomLog /var/log/httpd/access_default.log combined
combined になっていることを確認する

■X-Forwarded-Forを使ったIP制限方法
あるIPの場合はdenyするようにしてみます
vim /etc/httpd/sites-enabled/000-default
<VirtualHost *:80>
    SetEnvIf X-Forwarded-For "192.168.10.101" deny_ip
    SetEnvIf X-Forwarded-For "192.168.10.102" deny_ip

        <Location />
            Order allow,deny
            Allow from all
            Deny from env=deny_ip
            ProxyPass ajp://192.168.20.100:8009/sample-app/
        </Location>

        <Location /*/test/>
            Order deny,allow
            Deny from all
            Allow from env=deny_ip
            ProxyPass ajp://192.168.20.100:8009/sample-app/
        </Location>
</VirtualHost>

SetEnvIfでX-Forwarded-ForでフィルタリングするIPを指定します(正規表現での指定も可能なのでCIDR指定出来ます、今回はしてません)
当たり前ですが、80番のVirtualHostで受けています

「/」のLocationに対しては指定のIPを拒否する設定をしています
ポイントとしては allow,deny の順番で指定することで全許可してから指定のIPだけ許可しています

「/*/test/」のLocationに対しては指定のIPを許可する設定をしています
ポイントとしては deny,allow の順番で指定することで全拒否してから指定のIPだけ許可しています

LocationMatchディレクティブを使うと更に高度な正規表現を使用することができます

2013年7月26日金曜日

【apache】ロードバランサ+SSLアクセラレータがある場合のhttp→httpsリダイレクト方法

■概要
ロードバランサ(LB)にSSLアクセラレータ機能がある場合、LBで443を受け、後ろのWebサーバは
80で受けるのが定石になっています
その場合、追加のポートとしてLBで80を受けてWebサーバの80に流すことはできますが、その場合は
当たり前ですがhttpでのアクセスになります
httpでアクセスしてもhttpsにリダイレクトされる方法をapacheを使って紹介します

■構成
80で受けた場合はリダイレクト用のポートに流してあげます
ここではリダイレクト用のポートを1080とします
80(LB)→1080(Web)→リダイレクト→443(LB)→80(Web)

■設定
VirtualHost 1080用の設定ファイルにリダイレクトするための設定を記載します
<Virtualhost *:1080>
  ServerName www.test.com

  RewriteEngine On
  RewriteLog "logs/ssl_rewrite_log"
  RewriteLogLevel 0
  RewriteCond %{SERVER_PORT} !^443$
  RewriteRule ^(.*)$ https://www.test.com%{REQUEST_URI} [R,L]
</Virtualhost>

ServerNameは必要に応じて設定してください
mod_rewriteが必要になりますのでapacheで有効にしてください
mod_rewriteのインストール方法も紹介しています
http://kakakikikeke.blogspot.jp/2013/06/apachehttphttps.html

RewriteCond は443以外のアクセスだった場合としています
この場合は絶対443にはならないのでその後のRewriteRuleでhttpsのURLに強制リダイレクトします


やっていることは非常に単純ですが、これでhttpにアクセスしてもhttpsにリダイレクトされるようになります
他にもやる方法はあると思いますので参考までに見てください

2013年7月23日火曜日

【eclipse】Antで実行するJavaのバージョンを指定する方法


  1. 実行するant形式のXMLファイルを右クリックして、「Run As」へマウスオーバ
  2. サブメニューから「External Tools Configurations」を選択
  3. 設定のダイアログが表示されたら右側のメインペイン内にJREタブがあるので選択
  4. Execution Enviromentにチェックすると実行したいJavaのバージョンを選択できるようになる
  5. デフォルトではRun in the same JRE as the workspaceの選択となっておりワークスペースで設定しているデフォルトのJavaで実行されてしまいます
  6. Execution Evriromentに実行したバージョンがない場合にはSeparate JREを選択し、Installed JREsから自分が設定したJREを選択することも可能

2013年7月22日月曜日

Windowsで文字コードを一括変更する方法

http://www.kashim.com/kanjitranslator/


自分が使いたかったのは、eclipseでShift_JISからUTF-8に変換したかったので使いました
eclipse上で文字コードを変換するとワークスペースの文字コードは変換してくれますが
ファイルやソースコードそのものの文字コードは変更してくれないので別途変更する必要があります

フォルダをドラッグ&ドロップすると再帰的にファイルを探しに行ってくれるので
srcフォルダを投げて文字コードと改行コードを選択して「変換」をクリックすれば一括で変更できます

Linuxではnkfコマンドとかあるのですが、WindowsのコマンドプロンプトにはないのでGUI系のツールで変換するので手っ取り早いです

2013年7月21日日曜日

ESTAの申請方法

■概要
アメリカに海外旅行に行く際にはパスポートやビザの他にESTA(Electronic System for Travel Authorization)と呼ばれる証明書の申請が必要です
(ビザは長期滞在しないのであれば不要です)
仕組み的には事前に電子登録しておいて入国時にチェックするようです

■申請方法
1. サイトにアクセス
https://esta.cbp.dhs.gov/esta/
日本語で申請できるみたいですので日本語表示に切り替えます

新規で申請の場合は左側の申請からスタートします

2. 申請の免責事項に同意する
免責事項を読んで同意するにチェックします
チェックしたら次へをクリックします


3. 2009年旅行促進法に同意する
2番同様、読んでチェックして次へ


4. 個人情報の入力
必ずすべて英語で入力する必要があります
入力した情報は念のため個人で保管しておきましょう
また入力が必須ではない項目が多いですが念のため入力しておくといいでしょう(旅行先のホテルの住所やメールアドレスなど)
アンケート項目に関しては基本「いいえ」で大丈夫です
必要な項目をすべて入力したら一番下の次へをクリックします

確認画面(申請書の提出)に行くと再度「パスポート番号」「性名」「国籍」「生年月日」を入力させられるので入力します(下部)
入力したら申請をクリックします


5. 支払い
申請情報をすべて入力すると支払い画面に遷移する前に申請の一覧画面に移動します
ここで申請内容の確認を実施することも可能です

支払いをそのまま実施する場合は同意のチェックボックスをONにして次へをクリックします


支払い情報の入力は基本的にカードとなります
また、ドル払いになりますので使えるカードが限られていることに注意しましょう
請求情報を入力する場合も英語にする必要がありますので以下のサイト等で英語に変換して入力しましょう
http://judress.tsukuenoue.com/

請求情報とカード情報を入力して支払いをクリックすると処理が開始されます
処理は数分かかりますのでその間ブラウザを閉じたりタブを閉じたりしないように注意してください
完了すると結果表示のページに遷移します
自分はこのページと「申請の表示」のページと「請求書の表示」のページのスクリーンショットを取得して保管しておきました


これで申請は完了です
終了を押してください

一応、旅行の際には先ほど保存したスクリーンショットをスマホ等の保存して持って行きましょう
きっと問題なく入国できると思いますが、念のため。。。

2013年7月20日土曜日

Jenkinsでビルド履歴をすべて削除する方法

■情報
Jenkinsのデータを管理するフォルダ:/var/lib/jenkins/jenkins-data/
ビルド履歴を削除するジョブ名:test-job

とします

■削除方法
rm -rf /var/lib/jenkins/jenkins-data/jobs/test-job/builds
echo 1 > /var/lib/jenkins/jenkins-data/jobs/test-job/nextBuildNumber

buildsフォルダを削除し、ジョブを管理するフォルダ配下のnextBuildNumberファイルの値を1に修正します
その後Jenkinsを再起動します
すると、ビルド履歴が全削除されビルドの実行番号も1番からとなります

ポイントはフォルダの削除とファイルの修正を実施したあとにちゃんと再起動をするところ
Jenkinsはどうやら一旦ファイルの情報をJVM上にキャッシュしているようでJenkinsを実行中に削除や変更をしても
設定が反映されません

■応用
すべてのジョブに対して一括で実施するなら以下のようなシェルスクリプトを実行すればいけます
JENKINS_JOBS_HOME="/var/lib/jenkins/jenkins-data/jobs/";
for i in `ls ${JENKINS_JOBS_HOME}`; do cd ${JENKINS_JOBS_HOME}; rm -rf $i/builds; echo 1 > $i/nextBuildNumber;  done;

/etc/init.d/jenkins restart


ということができるプラグインを作ればいんじゃないかなーと思いました

2013年7月19日金曜日

GrowthForecastをインストール

■環境
CentOS release 6.3 (Final) 64bit

■rpmパッケージインストール
yum -y groupinstall "Development Tools"
yum -y install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel

■cpanmインストール
cd /usr/local/bin
curl -LOk http://xrl.us/cpanm
chmod +x cpanm
cpanm local::lib

■perlbrewインストール
curl -L http://install.perlbrew.pl | bash
cpan App::perlbrew
perlbrew init
perlbrew install perl-5.16.0

■GrowthForecastインストール
perlbrew switch perl-5.16.0
bash-4.1# cpanm -n GrowthForecast
依存関係のあるモジュールをすべてインストールしてくれます
bash-4.1# growthforecat.pl
http://localhost:5125/にアクセスすると表示されます

■サンプルグラフ作成
curl -F number=10 http://localhost:5125/api/sample_game/member/register
グラフの作成ができます、値はとりあえず10を入れておきます
crontab -e
5 * * * * curl -F "number=`echo ${RANDOM}`" "http://localhost:5125/api/sample_graph/member/register"
20分くらい放置してグラフを確かめるとグラフが作成されています

■所感
通常のcpanとperlでインストールすると大変なことになります
cpanがインストールされていた既存のサーバ環境でインストールしてみようとしたのですが、
依存関係ではまり一度アンインストールしようとしたのですが、できず結局あきらめました

レスポンスのJSONにerrorというkeyがありますが、これは0ならばerrorじゃないですよという意味みたいです

非常に簡単で何でもグラフ化できそうです
基本的には数値として値が取れれば何でも可視化できますね、便利すぎ
感覚的にはZabbixのユーザパラメータに似ていると感じましたがAPIで登録できるのと設定ファイル等に定義する必要はないのでユーザパラメータよりかは断然簡単に使えます

グラフ自体もAPIで取得可能で設定もAPIで可能です

■参考サイト

2013年7月18日木曜日

【perl】cpanをインストールする方法

■インストール
yum install perl-CPAN
cpanのインストール
perl -MCPAN -e shell
cpanの起動

cpan> o conf
設定状況を確認
cpan> o conf init
対話的にcpanの設定することができる
ex)モジュールの取得先のpemモジュールのインストール先など
cpan> o conf prerequisites_policy follow
個別に設定を変更することも可能
o conf で確認できる値をそのまま key, value で引数として与えればOK
ex)上記はインストール時のyes入力をすべて省略する設定
cpan> o conf commit
設定をファイルに保存する
必ず最後に実施してください、次回cpan起動時にも設定が引き継がれます

Can't locate CPAN.pm
というエラーが出たらそもそもcpanがインストールされていない状況ですので上記のインストール手順を実施します

2013年7月16日火曜日

【Java】log4j2やってみた

https://github.com/kakakikikeke/java-log4j2-sample

いつの間にかメジャーバージョンアップしていたので検証してみました
設定ファイルの形式でpropertiesが廃止されてXMLとJSONがサポートされていたのでいいと思いました
あとはFlumeAppenderというのがあってflumeにログを遅れる機能も追加されたようです

まだ、beta版なので仕様変更が入るかもしれませんが、期待できそうなLoggerになってくれそうです

2013年7月14日日曜日

【Windows7】msconfigからサービスでCNG Key Isolationを停止にすると無線LANがつながらなくなる

タイトルの通り
ハマったんで書いておきます

msconfigでいろいろと無効にすると起動は早くなるんですが、たまーに壊れるんで気をつけてください
ちゃんとメモしながらやればいいと思います

2013年7月13日土曜日

Jenkinsでビルドを強制的に停止する方法

ビルドを実行しているホストを特定する
ビルドで何を実行しているか確認する(ビルドの設定とかで)
例えばjavaを実行しているとする

pa aux | grep java

を実行するとあきらかにそれJenkins上で実行しているビルドでしょ
というのが出てくるのでそのプロセスをkillする

kill [process_number]

するとJenkins上でもビルドが強制的に終了している
これでkillするとビルド結果は絶対エラーになる(と思います)

ちなみになんでこんな状態になったかはよくわからないのですが、たぶんビルド実行中にJenkinsの再起動とか
サーバ自体の再起動とかをやってしまったんだろう(覚えていないが)


P.S 原因わかりましたー

他のサーバにSSHログインしてビルドするところで、パスワード入力の部分でずっと待っていたみたいです orz

2013年7月12日金曜日

【JMX】Password file not found

/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/jmxremote.password
がないと言って怒られます
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/jmxremote.password.template
というファイルがあるはずなのです
これをコピーします
cd /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/
cp jmxremote.password.template jmxremote.password

コピーしただけだと次に
Password file read access must be restricted
と言って怒られるので権限を変更します
cd /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/
chmod 600 jmxremote.password

とやってもずっと怒られているのでなんでだろうと思っていたら以下の設定がjava起動時にありませんでした
-Dcom.sun.management.jmxremote.authenticate=false

これを追加して解決しました
要するに認証をなしにしたからパスワードファイルもいらないよということです

2013年7月11日木曜日

mongoDBで現在どのサーバがPRIMARYかをshellで調べる方法

mongo --quiet --port 30003 --eval 'printjson(rs.status());' | grep -B 3 PRIMARY | grep name | awk -F ":" '{print $2, $3}'

かなり力技です
30003で指定しているポートはmongoを実行するホスト上で起動しているReplicaSet用のどっかポートを指定すればOKです
mViewerを使うときにPRIMARYのポートを指定しないとダメなので調べました

これをJenkinsで定期的に回すようにすればビルド結果を見ることでPRIMARYの情報をすぐに見つけることができるようになると思ってます

2013年7月8日月曜日

mongoDBの中身をWebUIで確認できる「mViewer」を試してみた

■環境
CentOS release 5.9 (Final)
mongodb 2.4.4
Tomcat 7.0.27
Java 1.7.0_05

mongoは事前にインストールしておいてください
インストール方法は以下
http://kakakikikeke.blogspot.jp/2012/07/mongodbperl.html

■mViewerダウンロード
wget https://github.com/downloads/Imaginea/mViewer/mViewer-v0.9.1.tar.gz
tar xvzf mViewer-v0.9.1.tar.gz

■Tomcat上で動作させてみる
cp mViewer.war /usr/local/tomcat/webapps/
service tomcat restart

オートデプロイをONにしている場合は待っていれば展開されます
http://hostname:8080/mViewer/
にアクセスするとmViewerのログイン画面が表示されるかと思います

■Javaコマンドから動作させてみる
service tomcat stop
デフォルトでは8080で動作することになるのでポートが被っているtomcatを停止します

sh start_mViewer.sh
mViewerを展開したフォルダに移動してスタート用のシェルを実行
Using Http Port : 8080
[Winstone 2013/07/05 18:49:03] - Beginning extraction from war file
[Winstone 2013/07/05 18:49:03] - HTTP Listener started: port=8080
[Winstone 2013/07/05 18:49:03] - Winstone Servlet Engine v0.9.10 running: controlPort=disabled
と表示されてエラーがでなければ起動完了です

バックグランド実行ではないのでもう一つターミナルを立ちあげて
netstat -an | grep 8080
でポートがLISTENしているか確認してください

http://hostname:8080/
にアクセスするとmViewerのログイン画面が表示されるかと思います
Tomcatをインストールしていない場合は直接Javaコマンドから起動することもできます
Javaで直接アクセスした場合は「/」にアクセスしてください

■アクセスして使ってみる
ログイン画面のデフォルトは
IP:127.0.0.1
Port:27017
になっています
シャーディング等で色々とポートを分けているPRIMARYを指定してログインしてください
ユーザとパスワードも設定して入れば設定してください


左メニューにDBやコレクションの一覧があるようです
DBを選択するとその中にあるコレクションの一覧がCOLLECTIONS配下に表示されます


適当にコレクションとオブジェクトの追加を行なってみました
追加はコレクションの隣の歯車マークからできます
すごい簡単過ぎます
オブジェクトを追加するとコレクションを選択したときに右側のメインペインに検索フィールドが出てきます
JSONを入れれば検索ができます
何もいれないと10件ずつ表示してくれます

あとはクエリー数のグラフ描画とかコンソール画面とか見れたりします
グラフはほっておくとどんどんタイムスタンプが増えていきます
が、横軸の数字が何を表しているかは不明(現在時間からの経過秒かな)

ということで以上です
ユーザ系の設定とかもできるのかなーこのUI上でリードオンリーユーザとか作れると結構熱いんだけどなー


P.S mViewerのいけてないところ(20130820)
  • 実行したmongo queryを表示することができない(CRUD系すべて)
  • コレクション一覧でコレクション名が全文字表示されていないのでCtrl+F等でコレクション検索できない
  • find以外の検索クエリが投げられない

2013年7月6日土曜日

【fluentd】リモートホストにapacheのログを転送してみた

■概要
2台のサーバを準備します
server-a(192.168.1.14)・・・apacheおよびfluentdのインストール
server-b(192.168.1.15)・・・fluentdのインストール
※今回はVMware上の仮想マシン2台で試しました

server-a から server-b に対して apache のログを転送してみます
fluentdのインストールは下記を参照してください
http://kakakikikeke.blogspot.jp/2012/07/fluentd.html

■設定
■server-b(受信側)
vim /etc/fluent/fluent.conf
<source>
  type forward
  port 24224
</source>
<match apache.access>
  type file
  path /var/log/fluent/access_log
</match>
fluentd
起動後エラーが表示されないことを確認する

■server-a(送信側)
vim /etc/fluent/fluent.conf
<source>
  type tail
  format apache
  path /var/log/httpd/access_log
  pos_file /var/log/fluent/messages.pos
  tag apache.access
</source>

<match apache.access>
  type forward
  flush_interval 5s
  <server>
    name server-b
    host 192.168.1.15
    port 24224
    weight 60
  </server>
</match>
fluentd
起動後エラーが表示されないことを確認する

として server-a および server-b で fluentd を起動してき server-a の apache にアクセスするとserver-b 側の /var/log/fluent/access_log にログが出力されます

server-a と server-b の fluentd のプロセスですが、server-b を先に起動したほうがいいです
server-b を先に起動しないと server-a が転送先のサーバを見つけれられずに

2013-07-05 11:34:35 +0900 [info]: detached forwarding server 'server-b' host="192.168.1.15" port=24224 hard_timeout=true

となり転送できません
上記が発生した場合は送信側のfluentdのプロセスを再起動してあげないとダメです

■通信要件
詳しくはちょっとわからなかったのですが、双方向でTCPおよびUDP通信できないといけないポートがあるようです
(UDPは死活監視で使っているようです)
今回は server-a と server-b 間はお互いに全開放状態にしました

また、VM間同士だとUDP問題がありうまく動かない現象もあるようです
http://ameblo.jp/nidbooks/entry-11240865520.html
http://blog.chrhsmt.com/2013/01/fluentd.php
http://d.hatena.ne.jp/oranie/20120323/1332498317

上記、UDP問題の場合は以下ようなエラーが表示されるようです
起動後にしばらく置いておくと送信側で発生します

2013-07-05 11:39:40 +0900 [warn]: temporarily failed to flush the buffer. next_retry=2013-07-05 11:39:40 +0900 error_class="RuntimeError" error="no nodes are available" instance=167157580

今回の検証はVMware上でしたが、やはり上記のエラーがでました
動作的には「不安定」といった感じでfluentdの起動直後はうまく転送できるのですが、ある程度時間が経つと上記エラーが発生し以降はうまく転送されなくなるといった感じでした

UDPパケットに無理矢理データを追加して小さいUDPを送らないようにするといった方法もあるようですが現状根本解決には至ってないようです
https://gist.github.com/seraphr/4586164


P.S 20130707
どうやらgithub本体でも問題視されておりUDPではなくTCPでheartbeatできる修正パッチが作られているようです
https://github.com/fluent/fluentd/pull/74
まだ試してませんが、これを使えばVM上での問題は解決できるかもしれません

2013年7月5日金曜日

ターミナル上で巨大文字が作れる「figlet」が便利だった

■インストール&サンプル実行
cd /usr/local/src
lftp ftp://ftp.figlet.org/pub/figlet/program/unix/
tar xvzf figlet-2.2.4.tar.gz
cd figlet-2.2.4
make
make install
hash -r
wget ftp://ftp.figlet.org/pub/figlet/fonts/contributed.tar.gz
gunzip -dc ./contributed.tar.gz | tar vfx -
find ./contributed -type f \( -name '*.flf' -or -name '*.flc' \) -exec sudo /bin/cp {} /usr/local/share/figlet/ \;
showfigfonts hoge > hoge_list
less hoge_list
好きなものを選択して/etc/motdにコピペすればログイン時に好きな巨大文字を出力することができます

■参考サイト

2013年7月4日木曜日

ChefでインストールしたZabbix Serverのタイムゾーンを変更する方法

/etc/httpd/sites-enabled/localhost.conf



php_admin_value date.timezone "Asia/Tokyo"

の部分を変更します
そして変更後はZabbix Serverじゃなくてhttpdを再起動しましょう
変更してるのはapacheの設定ファイルですからね


「zabbix」「タイムゾーン」とかでググると/etc/php.iniを変更してください
という記事が多いんだけどChefでインストールしたZabbix Serverの場合は設定ファイルが違うところにあるみたい

/etc/httpd/conf.d/zabbix.confを変更してください
という記事もあったのでどちらかと言うとそっちのほうが今回の設定には近いと思う

apacheがdebian方式でインストールされるのでZabbix Serverの設定ファイルも違うところに保存されるといった感じでしょうか

2013年7月3日水曜日

ZabbixでJMXの監視設定を行なってみた

■概要
今回もchefでapacheをインストールした場合の手順です
chefでのapacheインストール方法は以下を参照ください
http://kakakikikeke.blogspot.jp/2013/05/opscodecookbooks.html

■環境
CentOS release 6.2 (Final)
Zabbix 2.0.3
Tomcat 7.0.32.0

以下「zabbix-server」をZabbixサーバのホスト名とし
「tomcat-server」をTomcatサーバのホスト名とします

■tomatのJMXを有効にする
vi /etc/default/tomcat7
JMX_OPTS="$JMX_OPTS\
-Dcom.sun.management.jmxremote=true\
-Dcom.sun.management.jmxremote.port=10080\
-Djava.rmi.server.hostname=tomcat-server\
-Dcom.sun.management.jmxremote.ssl=false\
-Dcom.sun.management.jmxremote.authenticate=false"
service tomcat restart

■ZabbixのJMX有効化
/etc/init.d/zabbix_server stop
/etc/init.d/zabbix_agentd stop
yum install java-1.7.0-openjdk-devel
cd /opt/zabbix-2.0.3-server
./configure --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --enable-java
make clean
make
make install
ls /opt/zabbix-2.0.3-server/src/zabbix_java
※実施したあとで気がついたがchefでインストールした場合はやらなくても良さそう

■Zabbix Java Gateway の設定
cd /opt/zabbix-2.0.3-server/src/zabbix_java
vim settings.sh
以下のようにコメントアウトされている部分のコメントを外して設定します
#LISTEN_IP="0.0.0.0"

LISTEN_IP="zabbix-server"

#LISTEN_PORT=10052

LISTEN_PORT=10052

#START_POLLERS=5

START_POLLERS=2
/opt/zabbix-2.0.3-server/src/zabbix_java/startup.sh
フルパスで実行する必要あり

tail /tmp/zabbix_java.log
ls /tmp/zabbix_java.pig
ログにエラーがないこととpidファイルが存在することを確認する

netstat -an | grep 10052
ps aux | grep java
Java Gateway 用のプロセスが起動していることを確認する

■Zabbix Server にJava Gateway を認識させる
vim /etc/zabbix/zabbix_server.conf
# for java gateway
JavaGateway=zabbix-server
JavaGatewayPort=10052
StartJavaPollers=2
上記で設定した情報と同じようにzabbix_server.confにも記載します
/etc/init.d/zabbix_server restart

■ホスト作成(or 設定)
設定→ホスト→ホストの作成を実行
エージェントのインタフェースでJMXインタフェースを追加する
既存のホストに対してJMXインタフェースを追加してもOK

■アイテム作成
設定→アイテム→アイテムの作成を実行
タイプにJMXエージェントを選択し
キーにjmx["java.lang:type=Memory","HeapMemoryUsage.used"]を記載して保存します
ついでにグラフも作成するといいと思います

■ACL確認
Zabbixサーバ側からTomcatサーバに対する10080で通信できることを確認する
Zabbixサーバ側からTomcatサーバに対する36197で通信できることを確認する
telnet tomcat-server 10080
telnet tomcat-server 36197
※36179は理由がよくわからないのですが、通信できてないとダメみたいです
※しかもTomcatを再起動するたびに受付ポートが変わる可能性があるので結構大変です
※なのでZabbixサーバからTomcatサーバへの通信は全ポートオープンにしたほうがいいかもしれません

■監視できているか確認
設定→ホストの一覧からJMXエージェントが有効になっているか確認する
なっていない場合はログ等を見て状況を確認する
tailf /tmp/zabbix_java.log
※ステータスがONにならないのはACL系が多いです、iptablesやFWを再度確認してみてください

2013年7月2日火曜日

無料のgitプライベートリポジトリが使える「codebreak」を試してみた

■概要
codebread自体はビズリーチさんが公開したエンジニアのためのコミュニティサービス全体を指します
その中にgitBREAKというサービスがありそれがgitでバージョン管理できるサービスです
和製githubとのこと
基本は無料で使えますが容量に制限があるようです、この記事を書いたときは200MBまでとなってました
https://www.codebreak.com/gitrepo/getrepo/ 

■ユーザ登録
Twitter,facebook,LinkedIn,github で使っているアカウントが使えます
申し込み後、メールアドレスの登録を行い
「メールアドレス確認」「ユーザ名登録」「git push 時のhttpsのパスワード設定」を実施します
登録したらログインしてみましょう
https://www.codebreak.com/mypage/
codebreakのマイページに行くと「gitBREAK」へのリンクがあるので移動してみましょう

■リポジトリの作成
https://www.codebreak.com/gitrepo/dashboard/
上記URLがリポジトリを管理するページです
右上にリポジトリの作成があるので作成してみます


リポジトリ名、説明と公開範囲を入力したら登録します
もちろん日本語の入力も可能ですし非公開リポジトリの数に制限はありません
※レジュメが承認されないとプライベートリポジトリは1つしか作成できません
と表示された場合はプロフィールを登録すると無制限にプライベートリポジトリを作成できるようになります

■pushしてみる
CentOSからpushしてみます
mkdir gitbreak
cd gitbreak/
git clone https://git.codebreak.com/kakakikikeke/test-repository.git
初期設定で登録したユーザ名とパスワードを入力します
cd test-repository
touch README.md
git add .
git commit -m "01 first commit"
git push -u origin master
初期設定で登録したユーザ名とパスワードを入力します
コミット後リポジトリのURLにブラウザでアクセスするとコミットログを確認できます
https://www.codebreak.com/git/[ユーザ名]/[リポジトリ名]/
EX) https://www.codebreak.com/git/kakakikikeke/test-repository/
あとは普通にgitと同じコマンドが使えるようになります

■その他
  • 「fork」「pull request」など github が独自で提供している機能はまだ提供していないようです
  • issue機能に相当するBCT機能はありません
  • gitwiki、gitpagesなどのホスティング機能もありません
  • push方法はhttpsによる認証のみでsshによるpush機能はありません
  • スキルや経歴を入力すると他のサービス「cafeTERIA」や「viewPORT」といったサービスでリクルート活動的なこともできるみたいです(gitだけを使う分には必要なし)
  • リポジトリを共有する機能があり、共同開発したい人を招待することができます
  • 無制限のプライベートリポジトリと言いつつプロフィールを入力してかつ審査が通らないと作れるようになりません、自分の場合は審査は当日中に完了して連絡がきました

■所感
完全にプライベートリポジトリとして使う分には特に不便はないと思います
ただソーシャル性を求めるとちょっと微妙はところはありますが、そのへんはcafeTERIAとかでカバーしていくのかなーとか思いました

2013年7月1日月曜日

Jenkinsの文字コードを変更する方法

■概要
今回もchefでJenkinsをインストールした場合の手順です
chefでのJenkinsインストール方法は以下を参照ください
http://kakakikikeke.blogspot.jp/2013/05/opscodecookbooks.html

■手順
vi /etc/sv/jenkins/run
#!/bin/sh
cd /var/lib/jenkins
touch jenkins.start
exec chpst -u jenkins -U jenkins \
  env HOME=/var/lib/jenkins \
  JENKINS_HOME=/var/lib/jenkins/jenkins-data \
  java -Dfile.encoding=UTF-8 -jar jenkins.war \
  -Xloggc:/var/log/jenkins/gclog.log \
  --httpPort=8080
上記のrunファイルに対して「-Dfile.encoding=UTF-8」を追記して再起動します

sv restart jenkins
http://jenkins-server/safeRestart では反映されないので注意してください


ついでにですが以下のようにするとJenkinsが使っているJVMの状況をJMX経由で監視できるようになります
監視は別途zabbix等で行なってください
#!/bin/sh
cd /var/lib/jenkins
touch jenkins.start
  exec chpst -u jenkins -U jenkins \
  env HOME=/var/lib/jenkins \
  JENKINS_HOME=/var/lib/jenkins/jenkins-data \
  java -Dfile.encoding=UTF-8 \
  -Dcom.sun.management.jmxremote=true \
  -Dcom.sun.management.jmxremote.port=10080 \
  -Djava.rmi.server.hostname=jenkins-server-ip-or-hostname \
  -Dcom.sun.management.jmxremote.ssl=false \  -Dcom.sun.management.jmxremote.authenticate=false \
  -jar jenkins.war \
  -Xloggc:/var/log/jenkins/gclog.log \
  --httpPort=8080