2014年4月16日水曜日

cpanmin.usのインストールで”Can't locate ExtUtils/Manifest.pm”と言われたとき

*christopher*

cpanmin.usのインストールで”Can't locate ExtUtils/Manifest.pm”と言われたときは、”perl-ExtUtils-Manifest”をインストールしてあげましょう。

# cat /etc/redhat-release
CentOS release 6.5 (Final)

# curl -L http://cpanmin.us | perl - --sudo App::cpanminus
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  262k  100  262k    0     0   830k      0 --:--:-- --:--:-- --:--:--  830k
--> Working on App::cpanminus
Fetching http://www.cpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7001.tar.gz ... OK
Configuring App-cpanminus-1.7001 ... N/A
Can't locate ExtUtils/Manifest.pm in @INC (@INC contains: CODE(0x1f76c48) /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /loader/0x1f76c48/App/cpanminus/script.pm line 99.

# yum install perl-ExtUtils-Manifest
簡単ですね!

2014年4月8日火曜日

OpenSSLのHeartbleed問題を解決する。CentOS 6.5編

My Heart Bleeds No More by LoveIsSoul
『OpenSSLの重大バグが発覚。インターネットの大部分に影響の可能性』
http://jp.techcrunch.com/2014/04/08/20140407massive-security-bug-in-openssl-could-effect-a-huge-chunk-of-the-internet/
本日こちらの記事が話題になりました。

CentOSの対応状況については、本家のフォーラムが参考になります。
『heartbleed openssl bug, need 1.0.1g openssl version』
https://www.centos.org/forums/viewtopic.php?f=9&t=45814

日本語の情報だと、こちらが詳しいです。
『 CVE-2014-0160 OpenSSL Heartbleed 脆弱性まとめ』
http://d.hatena.ne.jp/nekoruri/20140408/heartbleed
『Heartbleed脆弱性と、その背後にあるWebアプリケーションアーキテクチャの一般的欠陥について』
http://blog.kazuhooku.com/2014/04/heartbleedweb.html

以下は、OSがCentOS 6.5の場合のHTTPサーバの解決方法です。

Apacheの場合

# yum update openssl mod_ssl
# /etc/init.d/httpd restart

Nginxの場合

# yum update openssl nginx
# /etc/init.d/nginx restart

確認方法

openssl-1.0.1e-16.el6_5.7以上がインストールされればOKです。

# yum list installed | grep openssl
openssl.x86_64          1.0.1e-16.el6_5.7
openssl-devel.x86_64    1.0.1e-16.el6_5.7

# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
とくに、OpenSSLのバージョンは変わっていないので注意。

正しくアップデートされたかどうか、こちらのページでチェックできます。
イタリアのFilippo Valsordaさんが作った『Heartbleed test』です。
http://filippo.io/Heartbleed/

例えば、フォームに”www.blogger.com”と入れて[Go!]を押します。
”All good, www.blogger.com seems not affected!”と出たらOKです。

HTTPサーバ側の設定は上記で完了です。
安全のため、証明書を再発行&再設定しておきましょう。

間違っていたら教えてください。

2014年4月7日月曜日

Apache ThriftをCentOS6にインストール

HawkinsSteven

Apache Thrift(http://thrift.apache.org/)をCentOS6にインストールしようとしたのですが、エラーが出て一瞬ハマったので正解をメモしておきます。

Thriftインストールが駄目なパターン

# ./configure
# make
~~~~
libtool: link: g++ -Wall -g -O2 -o .libs/TutorialClient CppClient.o  -L/usr/lib ./.libs/libtutorialgencpp.a /usr/local/src/thrift-0.9.1/lib/cpp/.libs/libthrift.so ../../lib/cpp/.libs/libthrift.so -lssl -lcrypto -lrt -lpthread -Wl,-rpath -Wl,/usr/local/lib
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial/cpp' から出ます
Making all in py
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial/py' に入ります
../../compiler/cpp/thrift --gen py -r ../../tutorial/tutorial.thrift
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial/py' から出ます
Making all in py.twisted
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial/py.twisted' に入ります
../../compiler/cpp/thrift --gen py:twisted -r ../../tutorial/tutorial.thrift
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial/py.twisted' から出ます
Making all in py.tornado
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial/py.tornado' に入ります
../../compiler/cpp/thrift --gen py:tornado -r ../../tutorial/tutorial.thrift
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial/py.tornado' から出ます
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial' に入ります
../compiler/cpp/thrift --gen html -r ../tutorial/tutorial.thrift
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial' から出ます
make[2]: ディレクトリ `/usr/local/src/thrift-0.9.1/tutorial' から出ます
Making all in test
make[2]: ディレクトリ `/usr/local/src/thrift-0.9.1/test' に入ります
Making all in nodejs
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/test/nodejs' に入ります
make[3]: `all' に対して行うべき事はありません.
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/test/nodejs' から出ます
Making all in cpp
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/test/cpp' に入ります
Makefile:832: 警告: ターゲット `gen-cpp/ThriftTest.cpp' へのコマンドを置き換えます
Makefile:829: 警告: ターゲット `gen-cpp/ThriftTest.cpp' への古いコマンドは無視されます
/bin/sh ../../libtool --tag=CXX   --mode=link g++ -Wall -g -O2 -L/usr/lib   -o libtestgencpp.la  ThriftTest_constants.lo ThriftTest_types.lo ../../lib/cpp/libthrift.la -lssl -lcrypto -lrt -lpthread
libtool: link: ar cru .libs/libtestgencpp.a .libs/ThriftTest_constants.o .libs/ThriftTest_types.o
ar: .libs/ThriftTest_constants.o: No such file or directory
make[3]: *** [libtestgencpp.la] エラー 1
make[3]: ディレクトリ `/usr/local/src/thrift-0.9.1/test/cpp' から出ます
make[2]: *** [all-recursive] エラー 1
make[2]: ディレクトリ `/usr/local/src/thrift-0.9.1/test' から出ます
make[1]: *** [all-recursive] エラー 1
make[1]: ディレクトリ `/usr/local/src/thrift-0.9.1' から出ます

make: *** [all] エラー 2


Thriftインストールが成功するパターン

configure時にオプションを追加します。
cppのライブラリのインストールをスルーしています。

# wget http://ftp.kddilabs.jp/infosystems/apache/thrift/0.9.1/thrift-0.9.1.tar.gz
# tar vzxf thrift-0.9.1.tar.gz
# ./configure --with-cpp=no
# make
# make install
# ln -s /usr/local/bin/thrift /usr/bin/thrift

GitHubにFabricスクリプトを置いておきました。
https://github.com/takeshiyako2/fabric-scripts/blob/master/centos6-thrift.py

2014年4月4日金曜日

Amazon EC2でTCPポート枯渇を防ぐために、Linuxカーネルをチューニング

http://www.flickr.com/photos/daniilr/7454436468

Linuxカーネルの"TCP_TIMEWAIT_LEN"をチューニングして、TCPポートの枯渇を防ぐ方法を紹介します。

大量トラフィックを捌くサーバにありがちなのですが、
# netstat | grep tcp | wc -l
TCPポートの接続状況が60000 とかになっていると、ポートが枯渇してTCPコネクションが詰まっている状態です。
そこで、TIME_WAIT となったセッションを早く終了させ、ポートの空きを作って、ポートの枯渇状態を解決します。
Linux kernelのTCP_TIMEWAIT_LENを60 -> 5にします。

環境は、Amazon EC2のCentOS6.6です。
AMIは、こちらです。
https://aws.amazon.com/marketplace/pp/B00NQAYLWO
AWS Marketplace - CentOS 6 (x86_64) - with Updates HVM
Linux/Unix, CentOS 6 | 64-bit Amazon Machine Image (AMI) | Updated: 9/29/14
Instance Type: c3.4xlarge
EBS: General Purpose (SSD)

カーネルのリビルド時には10Gほど使用するので、ディスクサイズは多めに設定して起動します。
あらかじめ、ディスクサイズを増加させておきます。下記参照。

EC2のCentOS6 HVMでresize2fs "Nothing to do!"と言われたとき
http://takeshiyako.blogspot.jp/2014/12/ec2centos6-hvmresize2fs-nothing-to-do.html

ライブラリをアップデート。
# yum -y update
# yum -y install gcc wget rpm-build.x86_64 redhat-rpm-config.noarch patchutils.x86_64 elfutils-libelf-devel.x86_64 binutils-devel.x86_64 hmaccalc.x86_64 rng-tools.x86_64
# yum -y install redhat-rpm-config patchutils xmlto asciidoc binutils-devel newt-devel python-devel perl-ExtUtils-Embed bison flex hmaccalc elfutils-devel audit-libs-devel  bfa-firmware
# reboot

カーネルのバージョンを確認。
# cat /proc/version
Linux version 2.6.32-431.29.2.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Tue Sep 9 21:36:05 UTC 2014

カーネルの最新バージョンを探します。
http://vault.centos.org/6.6/updates/Source/SPackages/
kernel-2.6.32-504.8.1.el6.src.rpmm
こちらが最新でした。

ダウンロードします。
# cd /usr/local/src
# curl -O http://vault.centos.org/6.6/updates/Source/SPackages/kernel-2.6.32-504.8.1.el6.src.rpm

パッチを作成。
# rpm -ivh kernel-2.6.32-504.8.1.el6.src.rpm
# cd ~/rpmbuild/SOURCES/
# cp linux-2.6.32-504.8.1.el6.tar.bz2 /tmp
# cd /tmp
# tar xjvf linux-2.6.32-504.8.1.el6.tar.bz2
# mv linux-2.6.32-504.8.1.el6 linux-2.6.32-504.8.1.namibuild.el6
# cd linux-2.6.32-504.8.1.namibuild.el6

Makefileファイルを編集。
# vim Makefile
EXTRAVERSION =
->
EXTRAVERSION = -504.8.1.namibuild.el6

tcp.hファイルを編集。
# vim include/net/tcp.h
#define TCP_TIMEWAIT_LEN (60*HZ)
->
#define TCP_TIMEWAIT_LEN (5*HZ)

圧縮してコピー。
# cd ..
# tar cjvf linux-2.6.32-504.8.1.namibuild.el6.tar.bz2 linux-2.6.32-504.8.1.namibuild.el6
# cp linux-2.6.32-504.8.1.namibuild.el6.tar.bz2 ~/rpmbuild/SOURCES/
# cd ~/rpmbuild/SPECS/

kernel.specファイルを編集。
# vim kernel.spec

%define distro_build 504.8.1
->
%define distro_build 504.8.1.namibuild

%define kversion 2.6.32-504.8.1.el6
->
%define kversion 2.6.32-504.8.1.namibuild.el6

Source0: linux-2.6.32-504.8.1.el6.tar.bz2
->
Source0: linux-2.6.32-504.8.1.namibuild.el6.tar.bz2

カーネルをビルドする。結構時間がかかります。(c3.4xlargeで30分ほど)
# rpmbuild -bb --with firmware kernel.spec

ビルドしたカネールをインストール。
# cd ../RPMS/x86_64/
# rpm -Uvh kernel-2.6.32-504.8.1.namibuild.el6.x86_64.rpm kernel-devel-2.6.32-504.8.1.namibuild.el6.x86_64.rpm kernel-headers-2.6.32-504.8.1.namibuild.el6.x86_64.rpm kernel-firmware-2.6.32-504.8.1.namibuild.el6.x86_64.rpm
# reboot

カネールを確認。
# cat /proc/version
Linux version 2.6.32-504.8.1.namibuild.el6.x86_64 (root@ip-172-31-19-117.ap-northeast-1.compute.internal) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Thu Dec 25 07:43:14 UTC 2014
ベンチマークをしたりして、ポートの空きが早くできているか確認してみましょう。

Enjoy!



参考)

TIME_WAIT状態のTCPコネクションを早く終了させるべくKernelをリビルド
http://d.hatena.ne.jp/rx7/20131204/p1
kernelをチューニングしてTIME_WAIT値を変更する - メモとかそんな感じなやつ
http://sarface2012.hatenablog.com/entry/2012/11/15/225509
TIME_WAITのチューニングとkernelリビルド for CentOS 6.0 - 逆襲のWebエンジニア
http://d.hatena.ne.jp/ono51/20111012/p1

※ See also.
革命の日々! Linuxカーネルの「TCP_TIMEWAIT_LEN」変更は無意味? の件について
http://mkosaki.blog46.fc2.com/blog-entry-1292.html
Linux - ぜんぶTIME_WAITのせいだ! - Qiita
http://qiita.com/kuni-nakaji/items/c07004c7d9e5bb683bc2
isucon3_cheatsheet/02.kernel.md at master · sonots/isucon3_cheatsheet
https://github.com/sonots/isucon3_cheatsheet/blob/master/02.kernel.md