Posts Tagged ‘CentOS5’

WordPress 2.9.xの自動アップデートがコケる

結論から言えば/var/php.iniのmemory_limitの上限を引き上げれば解決します:

[変更前]
memory_limit = 16M
[変更後]
memory_limit = 64M

(変更後は 「service httpd restart」 を実行してapacheを再起動すること。念のため)

ズボラな私は基本的に自動アップデートで済ませてしまうのですが、バージョン2.9.1以降、以下のメッセージが表示されたままウンともスンとも言わないという状態が続いていました

http://ja.wordpress.org/wordpress-2.9.1-ja.zip からアップデートをダウンロードしています。

その前後でサーバの移行などしていたためエラー原因が絞りきれず、とりあえず放置しておいた(笑)んですが、2.9.2がリリースされても同様の現象が確認されたので、とりあえず/var/log/httpd配下にあったapacheのエラーログを確認したらそのものズバリなエラーが。最初から見とけよ。

[Fri Feb 26 08:20:10 2010] [error] [client 192.168.XXX.XXX] PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 2804864 bytes) in /xxx/xxx/tokiwasou.com/memo/wp-includes/http.php on line 1331, referer: http://www.tokiwasou.com/memo/wp-admin/update-core.php

要はPHP実行に必要なメモリが足りんと。どうやらサーバ移行した際にPHPに割り当てるメモリサイズ(memory_limit)を、デフォルト(16M)のまま放置しておいたのが原因のようです。33MB超のメモリを割り当てようとしてコケたみたいなのでとりあえず上記のmemory_limit=64Mで回避しましたが、このあたりのさじ加減はサーバによって異なると思うので、64Mで失敗する方は128Mでも256Mでもサーバのリソースが許す限りお好きな値をどうぞ。

 

CentOSへVMware Toolsのインストール (ESXi 4.x編)

ESXi 3.x以前はRPMパッケージで提供されいていたVMware Toolsですが、vSphere 4からはソース(tar.gz)しか提供されなくなったみたいです。俺が見つけられないだけという可能性はさておき、毎回tarで解凍するときのオプションなんだっけと検索するのも面倒なのでメモっておきます。

(1) vSphere Client上で対象VMを右クリック->「ゲスト」->「VMware Tools のインストール/アップグレード」を選択。ごちゃごちゃメッセージが表示されますがとりあず「OK」を押す

(2) イメージをマウント&コピーする
# mount /mnt/cdrom /mnt
# cp /mnt/cdrom/VMwareTools-4.0.0-171294.tar.gz /root
# umount /mnt

(3) tarボールを展開してインストールプログラムを実行する
# cd /root
# tar zxf VMwareTools-4.0.0-171294.tar.gz
# cd ./vmware-tools-distrib/
# perl vmware-install.pl

(4) 全ての質問に何も考えずエンターを押し続ける

(5) おしまい

念のためvSphere Client上で対象VMの「サマリ」のタブをクリックしてVMware Toolsの項目が「OK」になっていることを確認すればなおよろし。

今気づいたですけどvSphere 4からCentOS 3.x系が「Red Hat Linux Enterprise 5」ではなく「その他の2.6x Linux」として認識されるようになってる。ソースしか提供されないのってひょっとしてこのせいアルか?

 

PHP5.3.xは鬼門か?

何も考えずPHP5.3.xに上げたら動かないモジュール続発。
どうやら寝た子を起こしてしまったらしい。(泣)

現在認識している「問題のあるモジュール」は以下の3つ
・mecab
・php_perl
・apc (Alternative PHP Cache)

とりあえずmecab以外はパッチ当てたりベータ入れたりしてその場をしのいで見たものの、開発環境が残念な感じになってしまったのも事実。

mecabもmecab本体とPHPにパッチ当てれば動くようにななるんだが、、、

とりあえず様子をみるか。

 

接続障害が発生していました

今朝ルーターが落ちていたのが原因で、ほぼ丸1日サイトにアクセスできない状態になっていました。ごめんなさい。

障害そのものは朝の段階で検知・対応していたのですが、DNS情報の更新スクリプトが24時間に1回しか回らない設定になっていた(というか俺がした)ので、ついさっきまで外部から接続できない状態に気がつかなかったのでした。ごめんなさいごめんなさい。

とりあえずcronによる更新頻度を3時間毎に上げたので再発はしないはず。
話をそらす目的も含め、cronを書くときにいつも参考にしているサイトを紹介させていただきます。
(お世話になってます!)

crontabの書き方

 

VMWare ESXi上 のVMで完全な時刻同期を目指す(Centos5)

調べれば調べるほど奥が深いESXi上の仮想マシン(VM)の時刻同期。
どうやら現状ではNTPを使うのが最善策のようです。

まずお手軽な解決策として考えられるのは、
(1) VMware Toolsの時刻同期設定オプションを設定する
(2) NTPを利用する

のどちらか。

さらに「時刻がずれる」という現象そのものにも2パターンあって、
(A) 時刻が進んでしまう
(B) 時刻が遅れてしまう

という、それぞれのケースについて考えなければなりません。
以前は(1)が鉄板だと思われていた(というか俺が思っていた)のですが、この方法は(B)のケースでしか有効でない事が判明しました。

なぜなら(A)の時刻が進んでしまうのはLinux2.6系で設定されている毎秒1000回(わお)というタイマー割り込みをVM上ではエミュレートできないためで、エミュレートしきれない→タイマー取りこぼし発生→遅延が発生したと思い込んだカーネルが補正しようと時刻を進めてしまう、という堂々巡りの果てに引き起こされる問題であり、VMWare Toolsの設定で何とかなる範疇を超えてしまっているからです。

Time in a Linux 2.6 guest operating system runs faster than real time due to lost tick overcompensation

Time in virtual machine drifts due to hardware timer drift

この(A)の問題については、カーネルパラメータを変更する事でタイマー割り込み頻度をVM上での適正な値に抑えることができます。必要なパラメータについては、VMWare社がKBとして公式に発表しているので、こちらをご参照下さい。

Timekeeping best practices for Linux

ちなみにこのKBによれば、「全ての場合においてVMware Toolsの時刻同期設定(Periodic Time Synchronization)よりも、NTPを(優先して)使え」と明言します。生み親にまで否定されてしまった時刻同期設定オプションの立場ったら。

上記パラメータを設定をすることで時刻のずれをかなり小さくする事ができますが、カーネルパラメーターをいじるのが不安だとか、完璧な時刻同期が必要なんだ!という方はやはりNTPを使うのが良いでしょう。ただしNTPを利用する場合は別途UDP123番のポートを開く必要があるので、ネットワーク運用規定上NGな場合などは別途ネットワーク上にNTPサーバを立てて下さい。最近のルーターはNTPサーバ機能がついているものも多いので、外向きルータ(デフォルトゲートウェイとか)への追加設定とVMマシンへのNTPインストール&設定だけで済むんじゃないでしょうか。

ちなみにNTPを利用する場合はVMware Toolsの時刻同期設定(Periodic Time Synchronization)を無効にする必要があります。つまり(1)と(2)の組み合わせは不可ということですね。完全に居場所を失ってますね時刻同期設定オプション。
よくわかんないけどがんばってください。

 

ps aux で表示結果が途切れてしまう

psコマンドにauxオプションセットというのは半ばお約束だが、これだとコンソール(端末)の画面右端で折り返されずにカットされてしまう。
驚いたことに出力先にファイルを指定した場合でも、環境によっては出力文字列がやはりカットされてしまう事実が判明。

具体的にはCentos3.2の環境下では80文字でぶった切られる。Centos5.xでは問題なさそう。

解決策としてはwオプション(ワイド出力)を追加して、

# ps auxw

として実行してやればよい。

引っ張った割にはあっけない解決策でごめん。

 

cpan2rpmでインストールに失敗するとき

AwstatsでGeoIPfreeプラグインを使おうと思い、cpan2rpmでインストールしようとしたらこんな感じで怒られた。

# cpan2rpm --install Geo::IPfree
(中略)
Signing package (pass phrase required)
エラー: マクロファイル内で "%_gpg_name" を設定しなければなりません。
パスフレーズのチェックに失敗しました。

本来ならGnuPGを指定してあげるべきなんだろうけど、こだわりのない自分は–no-signオプションを付けてお茶をにごす事にした。

cpan2rpm --no-sign --install Geo::IPfree

以前も別のモジュールを入れようとしたときに同じように怒られたのをすっかり忘れていたので、戒めの意味も込めてさらし者にする。

 

PHPで重複起動を防ぐ

cronで定期的に回すバッチなど、複数同時に呼び出したくない処理は、起動時に自分以外の誰かが既に突っ走ってないかチェックしてやる

$self = basename($_SERVER['SCRIPT_NAME']); //自身のファイル名取得
exec("ps aux | awk '{print $12}' | grep $self", $retVal); //プロセスを調べる
if(count($retVal) > 2) { //3つ以上の場合は誰か突っ走ってる
	echo "プロセスが既に起動中しています。処理を中止します。\n";
	exit(0);
}

$selfにチェックしたいファイル名を入れてやれば、自分自身以外のプログラムの起動チェックも可能。

 

LinuxでOSのバージョンを確認する

/proc/versionに格納されているのでこいつを表示させる

# cat /proc/version
Linux version 2.6.18-92.1.18.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)) #1 SMP Wed Nov 12 09:30:27 EST 2008

ちなみにWindowsだとコマンドラインからwinverと叩くとバージョンが表示される

 

文字化けしないmy.cnf設定 (MySQL5.0.x)

とりあえずウチのmy.cnfそのまま貼り付けてみます。手抜きとか言わない。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
default-character-set=utf8
skip-character-set-client-handshake

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set=utf8

デフォルトの文字コードはUTF-8に統一。skip-character-set-client-handshakeを宣言してクライアントにも暗黙的にUTF-8を使わせる仕様。Centos5あたりで新しくMySQLサーバ立てるならこの設定で鉄板です。

ちなみにMySQL3.xから4.xにバージョンアップさせた場合、old_passwordsがデフォルトで0に設定されているので注意が必要です。Centos3.xのサーバにWordpress入れた時ここで見事にハマりました。 orz