Archive for 6月, 2009

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と叩くとバージョンが表示される

 

VMware ESXi 4 で追加された新機能

ちゃんと調べようとすると情報が少ないVMWare ESXi。
結局VMware ESXi 4でどんな機能が追加されたのかちゃんと調べたかったので、とりあえずVMWareのESXi公式サイトに掲載されている新機能(「NEW!」マークがついてるやつ)を書き出してみました。

原文が読みたい方はこちらをどうぞ(英文):
VMware ESXi Features

主な特徴

  • 8900トランザクション/秒
  • 200,000 I/O/秒のオペレーション
  • 1物理ホスト上に最大16,000のExchange Mailboxをサポート
  • 1物理ホストあたり64論理コア、256の仮想CPU、1TBのメモリをサポート

アーキテクチャ

  • 64-bit ハイパーバイザー・アーキテクチャ:実績のあるハイパーバイザー・テクノロジーによる、ネイティブに近いバーチャルマシンの性能を実現

新進のリソース・マネジメント

  • 向上した電源管理:Intel SpeedStepおよびAMD PowerNow!のサポートによるエネルギー効率の向上

パフォーマンス及び拡張性

  • 仮想負荷(virtulized workload)に対するパフォーマンス向上
  • iSCSIストレージに対するパフォーマンス向上
  • より強力なサーバ向けハードウェアのサポート:64物理CPU、256仮想CPU、1TBメモリ、及び数百台の仮想マシンを1物理ホストをサポート
  • より大きな仮想マシンのサポート:仮想マシンへ255GBまでメモリ割当てが可能
  • 8-way仮想SMPのサポート:1仮想マシンに最大8物理CPUを割り当てることが可能
  • ハードウェアの仮想化をサポート:AMDのRapid Virtualization Indexingや、IntelのExtended Page Tablesといった次世代のハードウェア仮想化技術をサポート
  • ネットワークパフォーマンスの向上:TCP Segmentation Offloading (TSO)、VLAN and checksum offloading、およびジャンボフレームといった機能をサポート。さらにI/O性能を向上させるNetQueueもサポート
  • 新たなハイパフォーマンスデバイス及びプロトコルのサポート:10Gbイーサーネットカード及びストレージ・アレイをサポート
  • VMDirectPath I/O:頻繁なI/Oアクセスを必要とするアプリケーションのCPU利用効率を強化。ただしこの機能を利用した場合、VMware VMotionといった他の仮想化技術やハードウェアに特化したI/Oデバイスは利用不可

相互運用性

  • OSのサポート:VMware ESXiはWindows,Linux,Solaris,Novel Netwareといった広範囲のOSをサポートしているが、今回新たに20のOSをサポートした

セキュリティ

  • VMware VMsafe:サードパーティー製のアンチウイルスソフトが仮想ホストを管理可能にするAPIを提供

管理ツール

  • VMware vSphere Command-Line Interface 4.0 (vCLI):リモート環境からVMware ESXiを管理できる。ESXi 4.0では新たなコマンドがいくつか追加された
  • VMware vSphere Power Command-Line Interface 4.0 (PowerCLI):VMware vSphere Clientで利用できる管理機能を、コマンドライン上からも利用可能にする。Microsoft PowerShell技術がベースになっている
  • VMware vSphere Management Assistant:開発者及び管理者がESXiホストを管理可能にする仮想マシン。vCLIとその他のパーケージ化されたソフトウェアで構成されている

オレオレ意訳なので間違ってたらごめん。っていうか教えて。

個人的にいいなあと思うのは仮想マシンへ割り当て可能なリソースの上限が上がったのと、iSCSIのパフォーマンス向上でしょうか。実際どれだけ向上したのかは未検証してないので何とも言えないのですが。

ただ、iSCSI上に作成できるストレージのサイズは相変わらず最大2TBという制限がかかっているみたいです。新ストレージの導入を担当していた同僚が悲しそうに教えてくれました。

 

file_get_contents()で値が取れないとき

リクエストそのものが問題なく終了しているのなら、サーバーが何らかのエラーメッセージを返している可能性が高い。とりあえずget_headers()使って様子を見よう。

$url = 'http://www.tokiwasou.com';
print_r(get_headers($url));

(結果)
Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Thu, 11 Jun 2009 15:17:09 GMT
[2] => Server: Apache
[3] => Content-Length: 717
[4] => Connection: close
[5] => Content-Type: text/html
)

問題があれば0行目にHTTPのエラーコードが格納されているのでそれを確認する。

ちなみにURLの後ろにオプションのフラグを立てれば、連想配列で結果を返してくれる。
こういう細かい心配りがPHPはうれしい。

$url = 'http://www.tokiwasou.com';
print_r(get_headers($url, 1));

(結果)
Array
(
[0] => HTTP/1.1 200 OK
[Date] => Thu, 11 Jun 2009 15:17:23 GMT
[Server] => Apache
[Content-Length] => 717
[Connection] => close
[Content-Type] => text/html
)

大抵はコンテンツがリダイレクト先にあって301とか302が返ってきているか、500(Internal Server Error)が返されているはず。レアなところだと401(Gone:イッちまった)が返される場合もある。それはもうキミのせいじゃない。男らしくすっぱりあきらめよう。

 

PHPでプロキシを使いたい(stream_context_create編)

Proxy経由でfopen()やfile_get_contents() を使う場合は、stream_context_create()を使ってプロキシ経由のストリームコンテキストを作成してやる。

そいでそいつをfopen()やらfile_get_contents()に渡してあげればOK。

(1) Proxy用オプション設定(必要最低限Ver.)

$sc_opts = array(
‘http’=>array(
‘proxy’ => ‘tcp://192.168.0.XX:8888‘,
‘request_fulluri’ => True
)

(2) ストリームコンテキスト作成

$sc= stream_context_create($sc_opts);

(3) コンテンツ取得

$contents = file_get_contents(‘http://www.tokiwasou.com‘, TRUE, $sc);

(4) 結果表示

var_dump($contents);

ただし上記設定はProxy経由で通信するために最低限必要なオプションを指定しているだけなので、例えばユーザーエージェントで表示するページを変えているサイトとかだと、期待したコンテンツを取得できない(あるいはアクセスそのものが拒否されてしまう)ことがある。

あるいはコンテンツが複数回のリダイレクトの果てにようやくたどり着けるような、若干危険な香り漂うサイトとかだと、リダイレクト指定をちゃんとしてやらないと途中で泣きながら帰ってきてしまうケースもある。というかあった。

完全な解決策とはいきませんが、とりあえずこれだけ指定してやれば大丈夫だろ的なオプション設定を作ったので、どうぞ。

お約束ですがプロキシのIP/ポート番号とか取得先URLとかは自分の環境に合わせて適宜修正して下さいな。

各設定の詳細が知りたい勉強熱心な方は、文末に載せておいた参考サイトがおすすめです。勉強になります。

# Proxy用オプション設定(暫定最強Ver.)

$sc_opts = array(
‘http’=>array(
‘method’=> ‘GET’,
‘header’=>
“Host: www.tokiwasou.com\r\n” .
“Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n”.
“Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n”.
“Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n”.
“Keep-Alive: 300\r\n”,
‘user_agent’ => ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.10)’,
‘proxy’ => ‘tcp://192.168.0.XX:8888‘,
‘request_fulluri’ => True,
‘max_refirects’ => 20
)

参考になったサイト:
PHP.net(file_get_contents)

HTTPとHTTPS (コンテキストのオプションが載ってる)

 

WordPressでカスタムパーマリンクが文字化け

SEOの観点から、WordPressのURL構造を「ホスト名/カテゴリ/タイトル」といった構造に変更したい場合があります。

通常だとダッシュボードの「設定」から「パーマリンク設定」を選択し、「カスタム構造」を選択して/%category%/%postname%/とか設定すればOKなのですが、環境によってはホスト名以下のURLが文字化けしてうまくアクセスできない場合があります。

検索したら.htaccessの先頭に以下の記述を追加すればOK、という記事がたくさん出てきました。

# php_flag mbstring.encoding_translation off
# php_value default_charset “UTF-8

が、私の環境ではそれでもダメ。

というかその設定は/etc/php.iniに既に記述済み。 orz

結論からいうと、バーチャルドメインの設定でひっかかってました。

カスタムパーマリンクは.htaccessに記載されたmod_rewriteの設定で実装されているのですが、この設定を有効にするには、WordPressがインストールされたディレクトリに対して、httpd.confにおいて「AllowOverride All」が設定されている必要があります。

もちろん私の環境でも設定されてはいたのですが、バーチャルドメインで運用している場合httpd.confのバーチャルホストの設定、もしくはバーチャルホスト設定ファイル(デフォルトだとextra/httpd-vhosts.conf)の<VirtualHost>ディレクティブ内において、改めて「AllowOverride All」を有効にしてあげる必要があるとのこと。言われてみれば確かに、、、といういつものパターン。

Apache バーチャルホスト説明書

同じ過ちを繰り返さないためにも、追記の必要な箇所を赤字で書いておきます。ディレクトリやドメインの設定は各自の環境に読みかえてください。

<VirtualHost *:80>
RewriteEngine ON
ServerName    subdomain.tokiwasou.com
DocumentRoot  /var/www/tokiwasou.com/subdomain
ErrorLog    logs/subdomain.tokiwasou.com-error_log
CustomLog    logs/subdomain.tokiwasou.com-access_log combined
<Directory “/var/www/tokiwasou.com/subdomain/”>
AllowOverride All
</Directory>

</VirtualHost>

 

文字化けしない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

 

VMware ESXi 4 リリース

ちょっと前の話題になりますが、3.5 Update 4がリリースされて間もないうちに、4がリリースされましたね。

VMware ESXi 4

4は64bitハードウェア正式対応が一番のウリのようです、というか32bitハードウェア使いたきゃ3.5使えというニュアンスなので、100%ピュア64bitハードウェア環境(ヘンな文章)の方だけ使ってね、という感じみたい。

今どきのサーバ環境なら32bitハードウェアという制限に引っかかることはまずないと思います。ただ周囲のエロい人たちから「VMwareの初モノは笑えないバグがある」と常々すり込まれているので、会社でも個人的にもとりあえず静観なのかなあと。

Update 3を導入したESXiマシンで、高負荷をかけ続けると数ヶ月でサービスコンソールが真っ白け、という現象に何度か遭遇しています。それが治るのなら4も前向きに検討すると思うのですが、、、もう少し情報を集めてみます。

 

Centos5でSSL導入+小技

Centos5使ってて、WebサーバにApache2を使ってるなら、このサイトに書いてある手順そのまんまで導入できます。

通信内容暗号化(OpenSSL & mod_SSL) ~ Webページ編 ~

もし途中で間違えたとしても最初からやり直せば無問題。

ただ、CAおよびサーバ証明書の有効期間が1年(365日)なのがちょっと短いかなと思って、何も考えず10年(365x10=3650)に変更してみました。10年て。わはは。

変更箇所は2カ所。

(1) CA用証明書の有効期限を10年に変更

変更前:
# openssl req -new -x509 -days 365 -key /etc/httpd/conf/ca.key -out /etc/httpd/conf/ca.crt
変更後:
# openssl req -new -x509 -days 3650 -key /etc/httpd/conf/ca.key -out /etc/httpd/conf/ca.crt

(2) サーバ用証明書の有効期限を10年に変更 (sign.shの修正)

# vi /root/mod_ssl-2.8.28-1.3.37/pkg.contrib/sign.sh
# default_days = 365
(修正前)
# default_days = 3650
(修正後)

mod_sslのバージョンはwgetしてきたバージョンに読みかえてね。念のため。

あと細かいことなのですが、vi(正確にはシェル)で証明書とか要求書を作成するときにタイプミスすると、バックスペース(Back Space)で戻ろうとしても「^H」が画面に追加表示されてしまい、泣く泣くCtrl + Cで強制終了&再入力という非効率的な作業を強要されてストレスを感じていたのですが、実はCtrl + Back Spaceで^Hを表示させることなく修正できるという事を上司から聞きました。偉いぞCtrl。偉くないぞ俺。

というわけでもし同じ悩みでお困りだった方、ぜひ。