2014年02月

ソフトはソースからインストールしない

はじめに

CentOS等のパッケージ管理があるLinuxのディストリビューションにおいて、ソフトをソースからインストールするのは極力やめた方がよいです。
昔はそうでもなかったのですが、現在、たいていのソフトは新しいVerがでるとすぐにパッケージがリリースされますので、ソースからインストールしなければいけない場面は、そんなにない…と思います。

ソースからインストールしない方がよい理由は以下の通りです。
  • ソースからインストールしたソフトは、何がどこに入ったか、make installのログ等を追わないと分からない
  • インストールはmake insatllでめっちゃ簡単にインストールできるが、アントンストールは手動
  • パッケージ管理されているソフトと競合する

導入

サーバーにmemcashedをインストールしたのでmuninで監視することにしました。

memcashedをmuninで監視するはとても簡単…muninがインストールされていれば、多分デフォルトでmemcashed監視用のスクリプトがついてくるので、スクリプトにシンボリックリンクをはるだけ…なのですが、何を血迷ったのか、当時の私はmuninをソースからインストールするという手順を実行していました。

その結果
  • ソースからインストールしたmunin
  • パッケージを使ってインストールしたmunin
の2つがサーバーに混在することになりました。

/etc/init.d/munin-node start
すると、ソースからインストールしたmuninが起動します。

これはまずい…ということで、ソースからインストールしたmuninを削除するべく行動し始めました。


ソースからインストールしたソフトをアンインストールする

「ソースからインストールしたソフト アンインストール」でぐぐると
make uninstall
してみろ、そんなオプションがあったらラッキー、と書いてありました。
残念ながらmuninにuninstallというオプションはありませんでした。

インストールされたファイルを削除していく

find / -name munin
で、見つかったそれっぽいディレクトリを削除していきます。

rm -rf /opt/munin
rm -rf /opt/munin/log/munin
rm -rf /etc/opt/munin
rm -rf /var/opt/munin

そして、
/sbin/service munin-node start
Starting Munin Node: ERROR: Cannot open '/etc/opt/munin/munin-node.conf':  at /usr/sbin/munin-node line 60

パッケージでインストールしたmuninの設定ファイルは
/etc/munin/munin-node.conf

一方ソースからインストールしたmuninの設定ファイル
/etc/opt/munin/munin-node.conf 

/etc/munin/munin-node.confを見に行くように変更しなければいけません。
Starting Munin Node: ERROR: Cannot open '/etc/opt/munin/munin-node.conf':  at /usr/sbin/munin-node line 60
ですので、 /usr/sbin/munin-nodeのline 60を確認します。

/usr/sbin/munin-nodeを読む

munin-nodeは先頭行に
#!/usr/bin/perl -wT
と書いてあるperlのスクリプトです。

60行目の内容は以下の通りです。
$config->parse_config_from_file($conffile);

$conffileの定義は以下の通りです。
my $conffile   = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin-node.conf";

$Munin::Common::Defaults::MUNIN_CONFDIRに/etc/opt/muninが入っているのですが、$Munin::Common::Defaults::MUNIN_CONFDIRがどこで定義されているか、さっぱり分かりませんでした。

/usr/sbin/munin-nodeにおいて、$Munin::Common::Defaults::MUNIN_CONFDIRの前に書いてある内容は以下の通りです。

use strict;
use warnings;

# Trust PERL5LIB from environment
use lib map { /(.*)/ } split(/:/, ($ENV{PERL5LIB} || ''));

use Getopt::Long;
use Munin::Node::Config;
use Munin::Common::Defaults;
use Munin::Node::OS;
use Munin::Node::Server;

my $servicedir = "$Munin::Common::Defaults::MUNIN_CONFDIR/plugins";
my $sconfdir   = "$Munin::Common::Defaults::MUNIN_CONFDIR/plugin-conf.d";
my $conffile   = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin-node.conf";

Perlをちゃんと扱っている方であれば、
  • $ENV{PERL5LIB}はperl -e 'foreach(@INC){print "$_\n";}'で確認できる
  • $Munin::Common::Defaults::MUNIN_CONFDIRは、$ENV{PERL5LIB}に格納されているディレクトリの中にあるMunin/Common/Defaults.pmのour $MUNIN_CONFDIRに書いてある
ことを知っている…と思うのですが、そんなことを知らない私は$Munin::Common::Defaults::MUNIN_CONFDIRがどこで定義されているかに悩みました。

/usr/local/share/perl5/を消す

$ find / -name Munin
したら
/usr/share/perl5/vendor_perl/Munin/Common/Defaults.pm
/usr/local/share/perl5/Munin/Common/Defaults.pm
の2つがひっかかりました。

前者には
our $MUNIN_CONFDIR    = q{/etc/munin};
後者には
our $MUNIN_CONFDIR    = q{/etc/opt/munin};
と書いてあったので、後者がいらないと分かりました。

もう一つのサーバーとディレクトリの構造を見比べたら、もう一つのサーバーには、そもそも/usr/local/share/perl5/がなかった…つまりmuninをソースからインストールしたときに作られたディレクトリでしたので、ディレクトリごと削除しました。
※ソースからインストールすると/use/localにいろいろ入るので、ここを見てみるべきでした…というか、make installしたときのログを見ればよかったのですが…


$ perl -e 'foreach(@INC){print "$_\n";}'
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5

なので、 /usr/share/perl5/vendor_perlよりも、/usr/local/share/perl5の方を先読みするということも確認できました。

この後、もう少し紆余曲折があった(muninのVerが2系になっていて、今使っている1系のrpmがなかなか見つからなかった)のですが、最終的に/sbin/service munin-node startできるようになりました。

以上で3時間かかりました。


学んだこと
  • ソースからインストールするとアンインストールが大変
  • パッケージでインストールされたソフトの設定ではなく、ソースからインストールしたソフトの設定が優先されることがある
  • Perlを知らないと困ることがある
  • 簡単な作業でも眠いときに作業しない

configure: error: libpq is not installed or libpq is old

pgpoolをソースからインストールする際に、
$ ./configure
したら
configure: error: libpq is not installed or libpq is old
と言われることがあります。

解決方法はpgpool-II チュートリアルに書いてあります。   
libpq ライブラリがインストールされていないか、インストールされていてもプロトコルのバージョンが 3.0 でない可能性があります。

また、プロトコルのバージョンが 3.0 の libpq ライブラリがインストールされているにも係わらず、上記のエラーメッセージが表示される場合、configure スクリプトを実行した際に libpq ライブラリが認識されていない可能性があります。

configure スクリプトは標準では /usr/local/pgsql ディレクトリ以下からヘッダファイルや libpq ライブラリを検索します。 PostgreSQL のインストール先が /usr/local/pgsql ディレクトリ以下でなければ、configure スクリプトを実行する際にコマンドライン引数として --with-pgsql や --with-pgsql-includedir、--with-pgsql-libdir オプションを指定してください。
具体的に、どのディレクトリを指定すればいいか?なのですが、CentOS6.4においてyumでPostgreSQLをインストールしている場合は、バージョンによって違いますが
/usr/pgsql-9.0/
/usr/pgsql-9.1/
/usr/pgsql-9.2/
/usr/pgsql-9.3/
を--with-pgsqlに指定してあげればOKです。

具体的には
$ ./configure --with-pgsql=/usr/pgsql-9.3/
な感じになります。 

mod_extract_forwardedのインストールと設定について

はじめに

Apacheの前段にリバースプロキシを設置すると、accessログのIPアドレスに リバースプロキシのアドレスが記録されてしまいます。
例えば、リバースプロキシとApacheを同じOS上にインストールすると、accessログのIPアドレスはすべて127.0.0.1と記録されてしまいます。
mod_extract_forwardedをいれることで、送信元のアドレスが記録されるようになります。


設定

Nginxでリバースプロキシを設定し、Apacheと共存させる | abeerforyou.comの文書の3. Apacheにモジュール追加の部分がよいと思います。
$ curl -O http://www.openinfo.co.uk/apache/extract_forwarded-2.0.2.tar.gz
$ tar xvfz extract_forwarded-2.0.2.tar.gz
$ cd extract_forwarded
# apxs -i -c -a mod_extract_forwarded.c
# ls -l /etc/httpd/modules/ | grep ex
# emacs /etc/httpd/conf/httpd.conf

---編集内容 ここから---
LoadModule proxy_module modules/mod_proxy.so
↑ コメントアウト。mod_extract_forwarded.soの起動に必要。

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
↑ apxs -i -c -a mod_extract_forwarded.cすると/etc/httpd/conf/httpd.confに自動で追加されてると思います

MEForder refuse,accept
MEFrefuse all
MEFaccept 127.0.0.1 192.168.0.1
---編集内容 ここまで---

LoadModule proxy_module modules/mod_proxy.so
のコメントアウトを忘れてhttpdを起動すると
# /sbin/service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: httpd: Syntax error on line 203 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_extract_forwarded.so into server: /etc/httpd/modules/mod_extract_forwarded.so: undefined symbol: proxy_hook_scheme_handler
                                                           [失敗]
と怒られます。 

MEFrefuseの書くIPアドレスはApacheの前段に設置するリバースプロキシのアドレスになります。
リバースプロキシを複数設置している場合は、上記のように半角スペースをあけてIPアドレスを書きます。
MEFrefuse all
と書くと、どこからのアクセスも許容します。
プロキシが増えていくことを考えるとallでいいんじゃないかな…という気がします。

mod_extract_forwardedのドキュメントはOpenInfo Web Siteにあります。

機器は電源をOFF/ONしたりreloadしたりすると、よく壊れる気がする

ビルには電力点検があって、1年に1回は点検のために電気がこなくなる日があります。
自宅サーバーでは電力点検以外の理由でも、サーバーをシャットダウンする必要があったりします。

私の経験でしかないのですが、サーバーやNW機器は電源をOFF/ONすると、今までちゃんと動いていたのに、壊れたりあがってこなかったりすることがよくある気がします。

ちょっと前に、自宅サーバーの大規模メンテナンスですべての機器の電源を落としたのですか
  • サーバー1台が立ち上がらない。モニタに何も映らないし最小構成(M/BとCPUだけ)にしても何も映らない。
  • L2SWが微妙に故障。ONUとのリンクが確立せず、pingは100%通るけど、スピードが全然出ない。
 という結果になりました。
L2SWもサーバーも予備機があったので、予備機と交換して復旧させました。
※予備機大事です。前にL2SWが壊れたときは予備機が無くて大変なことになりました。

さて…あがってこなかったサーバーは、多分、M/BかCPUが壊れた気がしているのですが、交換してみないとどちらが壊れたか分かりません。
そして、もう3年も前のM/BやCPUですので同じ物がありません。
※中古を頑張って探すしかないです。

新しいM/Bを買ってくると、多分、OSから再インストールになるので、面倒です。
※動いたらラッキーですが、うまく動かないのだろうなあ…と。

この問題を解決するには
  1. 買った当時にM/BとCPUは同じ物を買っておく
  2. あきらめてOSの再インストールからはじめる
  3. 自宅サーバーをやめてデータセンターに移行する
という3つの選択肢があります。

昨今のVPSや専用サーバーやクラウドの価格を考えると、負荷が年々高まっていくのであれば、3.のデータセンターに移行するというのが、簡単にスケールアップ/アウトできていいのでしょうが、ErogameScapeはもう負荷が高まる要因がないので1.でいいのかな…と思っています。

2.も…たまにOSの再インストールからやらないと、不慮の事故で全部のサーバーが駄目になったときに、何も出来なくなるので、選択肢としてはありかな…という気がしています。
 

PHPのセッションデータの保存先をmemcachedにする場合の設定について

以下の文書は各ソフトが以下のverのものです。
  • memcached-1.4.15-2.el6.remi.x86_64
  • php55w-pecl-memcache-3.0.8-2.w6.x86_64

実現したいことは以下の通りです。

192.168.0.1と192.168.0.2の両方にPHPのセッションデータを保存して、どちらかが落ちても、どちらに接続してもセッションが保たれるようにしたい。


実現したい理由は以下の通りです。

ErogameScapeのPHPのセッションの保存先は各サーバーのHDDのみでした。
セッションの保存先が各サーバーのHDDのみですと以下の問題を抱えます。
  1. ユーザーさんからのサーバーの接続先を切り替えた場合、切り替え先はユーザーさんのセッション情報を持っていないので、ユーザーさんがログインした状態だった場合にサーバーを切り替えると強制的にログアウトされた状態になる。具体的には長文感想を1時間かけて書いて登録ボタンを押したら、ログイン画面に飛ばされる等の被害がでます。
  2. 高負荷時、または定常的にロードバランスしたい場合、あるユーザーさんが最初に接続したサーバーが192.168.0.1、次に接続した場合は192.168.0.2だった場合、セッションが引き継げないためログアウトした状態になる。
    ※ロードバランスをIPアドレスベースでやればIPアドレスがかわらない限り問題ないじゃないか!と思う方もいらっしゃると思いますが、スマホ等からの接続の場合、接続のたびにIPアドレスがころころかわります。
    結果、1.で書いた具体例が起こる可能性があります。
現用系のサーバーから待機系サーバーに切り替えると各ページのキャッシュがないため2時間ほど高負荷となることが確認されました。この対策として、常にキャッシュを更新し続けるのがベストであると思いました。
常にキャッシュを更新し続けるには、定常的にロードバランスするのが手間がかからないなと思いました。

定常的にロードバランスするため、192.168.0.1と192.168.0.2の両方にPHPのセッションデータを保存することとしました。
 

memcachedのインストールと/etc/php.iniと/etc/php.d/memcache.iniの設定について

以下の文書がよいと思います。

はまったのは
;Redundancy : When enabled the client sends requests to N servers in parallel
;memcache.redundancy=1
;memcache.session_redundancy=2
memcache.session_redundancyを3と設定しないといけないことでした。
 
2のままだと、
session.save_path="tcp://192.168.0.2:11211,tcp://192.168.0.1:11211"
と書いても、192.168.0.1の方にしかセッションデータが記録されません。

ちなみに
session.save_path="tcp://192.168.0.2:11211"
と書くとちゃんと192.168.0.2にセッションデータが書き込まれます。

memcache.session_redundancyのパラメータが追加されたのはphp-pecl-memcacheのVerが3系になってからですので、3系を使う場合は気をつけましょう…

ここらへんは英語になりますが
に書いてあります。
※ぐぐっても私と同じようにはまった日本語の文書が全然なくて(やっぱり3系はbetaだから使われていないのでしょうか…)解決に3時間くらいかかりました…プログラマーに必要な言語は英語だとよく言ったものだと思います…

記事検索