元RX-7乗りの適当な日々 このページをアンテナに追加 RSSフィード Twitter

RX-7(FD3S)WRX STI関連のキーワードで検索されて来られた方へ。
右サイドのカテゴリ『』をクリックすると関連する項目だけが表示されます。
日々の写真は『Flickr』で公開しています。

2013/02/22

「3分でわかる(気になれる)AWS OpsWorks」のLT資料を公開します


Engine Yardさんのオフィスで開催された「初めてのChefの教室」に主催者の[twitter:@yando]さんからお誘いいただきまして、タイトル通りのLTをしてきました。

いつも運用事例的な話をしているのと、LT(5分)ということもあって、思い切って旬な話題を取り上げようと、公開されたばかりの「AWS OpsWorks」の紹介をしてきました。


駄菓子菓子!


僕の完全な調査不足だったのですが、前段でAWSの中の人がまさかの「AWS OpsWorks」のデモをやってくださったので、おおとりをつとめた僕の発表は、完全にダイジェスト版&デモの補足という笑いの種で終わりましたwすいませんでしたw

(質問で普段の運用の話とかもしましたが。昨日の時点でAWS OpsWorksのLTエントリはなかったはずw)



一昨日に2時間ほど触ってわかったことを、3分ほどで説明する趣旨だったのですが、↑の資料だけではあまり伝わらないと思うので、今度エントリにでもまとめてみようと思います。

尚、質問の時間にて、普段の運用の話をするときに使った資料は、"DevLOVE Conference 2012"で使った資料なので、それもあわせて紹介しておきます。



リアルシェフハット

登壇者対象に、リアルシェフハットが配られまして、、、

リアルシェフハット

これをつけてLTしましたっ><


それにしても、皆さんの色々な話&情報交換させてもらって、僕も色々勉強になりました。ありがとうございました!

それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


Test-Driven Infrastructure With Chef

Test-Driven Infrastructure With Chef



まとめ


2013/02/06

Apache(DSO有効)でmod_sslを追加したときに躓いたアレコレ


最近の定番パターンですが、若手があれこれ苦労していたので、一緒になってハマってみたログです。

タイトル通りですが、DSO(Dynamic Shared Object)サポートが有効になっているApacheに、後からmod_sslを追加しようとしたのですが、どうも apxs の実行で失敗して悩んでいるとの事。

ちなみに、環境はCentOS 6.2に、Apache 2.2.23。

どれどれ、と見てみると、、、


error: #error "Unrecognized SSL Toolkit!"

# cd (Apacheのソースディレクトリ)/modules/ssl/
# /usr/local/apache2/bin/apxs -c -i -a *.c
/usr/local/apache2/build/libtool --silent --mode=compile gcc -prefer-pic   -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pth                                        read -I/usr/local/apache2/include  -I/usr/local/apache2/include   -I/usr/local/apache2/include   -c -o mod_ssl.lo mod_ssl.c                                         && touch mod_ssl.slo
In file included from ssl_private.h:60,
                 from mod_ssl.c:27:
ssl_toolkit_compat.h:261:2: error: #error "Unrecognized SSL Toolkit!"
In file included from ssl_private.h:67,
                 from mod_ssl.c:27:
ssl_util_ssl.h:78: error: expected ‘)’ before ‘*’ token
ssl_util_ssl.h:79: error: expected ‘)’ before ‘*’ token
ssl_util_ssl.h:80: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token

・・・・・省略・・・・・

ssl_private.h:601: error: declaration for parameter ‘ssl_init_ModuleKill’ but no such parameter
ssl_private.h:600: error: declaration for parameter ‘ssl_init_Child’ but no such parameter
mod_ssl.c:567: error: expected ‘{’ at end of input
apxs:Error: Command failed with rc=65536
.

こんな感じでエラーが出ておりました。というわけで、さっぱりわからないので、


ssl_toolkit_compat.h:261:2: error: #error "Unrecognized SSL Toolkit!"

ここ(ssl_toolkit_compat.h:261)を見てみることにします。


259 #else /** ! HAVE_OPENSSL && ! HAVE_SSLC */
260
261 #error "Unrecognized SSL Toolkit!"
262
263 #endif /* ! HAVE_OPENSSL && ! HAVE_SSLC */

ほうほう。↑とのことなので、ssl_toolkit_compat.hの中を"HAVE_OPENSSL"でひっかけてみると、


 30 #ifdef HAVE_OPENSSL
 31
 32 /** OpenSSL headers */
 33 #include <openssl/ssl.h>
 34 #include <openssl/err.h>
 35 #include <openssl/x509.h>
 36 #include <openssl/pem.h>
 37 #include <openssl/crypto.h>
 38 #include <openssl/evp.h>
 39 #include <openssl/rand.h>
 40 #include <openssl/x509v3.h>

こんな感じで書かれていて、"HAVE_OPENSSL"というマクロが定義されていないとheaderファイルがincludeされないということか。

というわけで、"-D"でマクロを定義してapxsを再実行してみます。


# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c
/usr/local/apache2/build/libtool --silent --mode=compile gcc -prefer-pic   -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache2/include  -I/usr/local/apache2/include   -I/usr/local/apache2/include  -DHAVE_OPENSSL=1  -c -o mod_ssl.lo mod_ssl.c && touch mod_ssl.slo
In file included from ssl_private.h:60,
                 from mod_ssl.c:27:
ssl_toolkit_compat.h:33:25: error: openssl/ssl.h: No such file or directory
ssl_toolkit_compat.h:34:25: error: openssl/err.h: No such file or directory
ssl_toolkit_compat.h:35:26: error: openssl/x509.h: No such file or directory

・・・・・省略・・・・・

あ、ヘッダファイルが見つからない、、、これは初歩的なミス・・・。


# yum install -y openssl-devel

を実行しなおした後だと、


# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c

・・・省略・・・

Libraries have been installed in:
   /usr/local/apache2/modules

・・・省略・・・

お、うまくいったらしい。では、動作確認。


# /usr/local/apache2/bin/apachectl configtest
httpd: Syntax error on line 54 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_INFO_free

と、"undefined symbol: X509_INFO_free"とエラーが出ます。


undefined symbol: X509_INFO_free

ちょっと参照しているライブラリまわりを調べてみると、

# ldd /usr/local/apache2/modules/mod_ssl.so
        linux-vdso.so.1 =>  (0x00007fff299ff000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f076144c000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003fdf600000)

これは明らかに少ない・・・。


# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto

ということで、↑な感じでオプションを足してコンパイルしなおしてみます。で、動作確認。


# /usr/local/apache2/bin/apachectl configtest
httpd: Syntax error on line 54 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: SSL_set_ex_data

エラーが変わりました。(undefined symbol: SSL_set_ex_data)


undefined symbol: SSL_set_ex_data

これはSSLまわりがくさいので、

# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto -lssl

こんな感じでライブラリオプションを足してやり直し。


# /usr/local/apache2/bin/apachectl configtest
Syntax OK

お、Syntax OKになりました!


# ldd /usr/local/apache2/modules/mod_ssl.so
        linux-vdso.so.1 =>  (0x00007fffe7dd6000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f236f085000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f236ee2a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f236ea88000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f236e884000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f236e66e000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f236e42b000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f236e14c000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f236df48000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f236dd1b000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003fdf600000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f236db10000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f236d90d000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f236d6f2000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f236d4d6000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f236d2b7000)

さっきよりも随分増えています。


ちなみに、Apacheのconfigureを見てみると...

Apacheのソースディレクトリで、

# ./configure --enable-ssl=shared --enable-so --with-mpm=worker

こんな感じで、SSLを有効にしてconfigureを実行してみると、mod_sslの部分は、


・・・省略・・・

checking whether to enable mod_ssl... checking dependencies
checking for SSL/TLS toolkit base... none
checking for OpenSSL version... checking openssl/opensslv.h usability... yes
checking openssl/opensslv.h presence... yes
checking for openssl/opensslv.h... yes
checking openssl/ssl.h usability... yes
checking openssl/ssl.h presence... yes
checking for openssl/ssl.h... yes
OK
  adding "-L/usr/lib6464" to LDFLAGS
  forcing SSL_LIBS to "-lssl -lcrypto -ldl -lz  "
  adding "-lssl" to LIBS
  adding "-lcrypto" to LIBS
  adding "-ldl" to LIBS
  adding "-lz" to LIBS
checking openssl/engine.h usability... yes
checking openssl/engine.h presence... yes
checking for openssl/engine.h... yes
checking for SSLeay_version... yes
checking for SSL_CTX_new... yes
checking for ENGINE_init... yes
checking for ENGINE_load_builtin_engines... yes
checking for SSL_set_cert_store... no
  forcing MOD_SSL_LDADD to "$(SSL_LIBS)"
checking whether Distcache is required... no (default)
  adding "-export-symbols-regex" to MOD_SSL_LDADD
  adding "ssl_module" to MOD_SSL_LDADD
checking whether to enable mod_ssl... shared
  adding "-I$(top_srcdir)/modules/ssl" to INCLUDES

・・・省略・・・

こういった出力が出ているので、正確な追加オプションとしては

"-lssl -lcrypto -ldl -lz -export-symbols-regex ssl_module"

が正しいかも。(ちゃんと深くまで見てないけど・・・汗)


なので、apxsの実行オプションをまとめると、

/usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lssl -lcrypto -ldl -lz -export-symbols-regex ssl_module

こんな感じです。

というわけで、今日もメモ程度ですが、こんな感じでこのエントリを残しておきます。

それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


Linuxプログラミングインタフェース

Linuxプログラミングインタフェース

2013/02/01

なぜかJenkinsを起動させたらパケットロスが多発しまくったのを無理やり直した話


※ まず、はじめに、僕があまりJenkins自体の挙動に詳しくないので、誰か正しい直し方をご存知の方がいらっしゃったら、教えてほしいです。


本題。これは明らかな環境依存下(特にネットワークまわり)での話なのですが、KVM上でのLinux(CentOS 5/6系)な環境で、Jenkinsを起動するとパケットロスが多発して全然使い物にならないケースがありました。

(Jenkinsを落とすと普通に復旧しちゃうんですよね。。。)


で、こんな感じで若手が苦しんでいたので、ちょっとOS上で色々と調べていたのですが、どうもtcpdumpを眺めていると、

11:31:14.427406 IP xxx.xxx.40.102 > 239.77.124.213: igmp v2 report 239.77.124.213
11:31:17.905397 IP xxx.xxx.40.102 > 239.77.124.213: igmp v2 report 239.77.124.213

このパケットが発射された直後に、パケロスが発生することがある、ということがわかりました。パケロスする期間は様々で、一瞬のときもあれば10秒くらい返ってこないことも・・・。

$ ping xxx.xxx.40.102
PING xxx.xxx.40.102 (xxx.xxx.40.102) 56(84) bytes of data.
64 bytes from xxx.xxx.40.102: icmp_req=1 ttl=57 time=6.27 ms
64 bytes from xxx.xxx.40.102: icmp_req=2 ttl=57 time=1.19 ms
64 bytes from xxx.xxx.40.102: icmp_req=3 ttl=57 time=2.78 ms
64 bytes from xxx.xxx.40.102: icmp_req=5 ttl=57 time=3.70 ms
64 bytes from xxx.xxx.40.102: icmp_req=6 ttl=57 time=2.23 ms
64 bytes from xxx.xxx.40.102: icmp_req=10 ttl=57 time=2.14 ms

こういう感じでパケロスが。。。


で、僕がJenkinsの挙動や機能をわかっていなさすぎて、なんでこんなマルチキャストパケットを送ってるかってところなのですが、JenkinsにAuto-discoveringなる機能があって、IGMPなパケット(UDP multicast packet)を放っているとな。


今回は、特に複数台でクラスタを組んでいるわけでもないので、上記だけだったら特に機能しなくても問題なさそうなので、該当パケットを破棄(drop)してやることにしてみた。

(本当は、Auto-discoveringとやらを設定で切れるなら、そうしたいんですが、jenkins力が低すぎてよくわからなかった...w ま、UDP multicastだから、破棄しても問題ないかと思いまして。)


というわけで、力技ですが、iptablesを有効に(起動)して、

# iptables -A OUTPUT -d 239.77.124.213 -p igmp -j DROP

こんな感じで流し込んだところ、問題は再発しなくなりました。


一応、これでjenkinsが使えるようにはなるのですが、そもそも何故この環境だけパケロスが発生するのかっていう根本原因と、↑の設定を入れることによる副作用(僕のjenkins力の問題)がわかっていません・・・w


という具合に、いったんメモ程度な感じでこのエントリに残しておきます。

それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́



オススメ (一部は、最近読んでいる本とも言う)
Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus) クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ [Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ) エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド [24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 Linux-DB システム構築/運用入門 (DB Magazine SELECTION) キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置 スケーラブルWebサイト 実践ハイパフォーマンスMySQL 第3版 ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE) SQLアンチパターン インターネットのカタチ―もろさが織り成す粘り強い世界― ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化 Linuxの教科書―ホントに読んでほしいroot入門講座 (IDGムックシリーズ)