LAMPのバージョンを確認するコマンド


Linuxカーネル

$ uname -a
Linux serverx 2.6.27-7-server #1 SMP Fri Oct 24 07:37:55 UTC 2008 i686 GNU/Linux
Linuxディストリビューション

// Ubuntu
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 8.1
Release: 8.10
Codename: intrepid

// Debian
$ cat /etc/debian_version
4.0

// Redhat, CentOS, FedoraCore
$ cat /etc/redhat-release
CentOS release 5.2 (Final)

// Vine
$ cat /etc/vine-release
// 未確認

// TurboLinux
$ cat /etc/turbolinux-release
// 未確認

Apache

// apachectl または apache2ctl
$ apache2ctl -v
Server version: Apache/2.2.9 (Ubuntu)
Server built: Sep 19 2008 13:43:21
PHP

$ php -v
PHP 5.2.6-2ubuntu4.2 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 17 2009 14:44:11)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
Perl

$ perl -v
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
Python

$ python -V
Python 2.5.2
Ruby

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

Linuxでの32ビットと64ビットマシンの見分け方。


Linuxでの32ビットと64ビットマシンの見分け方を紹介します。
32ビットか64ビットかを見分けるにはCPUの情報とカーネルの情報が必要です。


まずはCPU。

//マシンに搭載されているCPUの情報が表示されます。(マルチコアの場合はそれぞれのCPUの情報が表示されます)
$ cat /proc/cpuinfo
flagsの値にlmがあれば、64ビットCPUです。


次にカーネル

// 稼働中のカーネルについての名前と情報が表示されます。
$ uname -a
X86_64とかamd64とかが表示されたら、64ビット版のカーネルです。


64ビットCPU上で、64ビット版カーネルが稼働している時が64ビットマシンです。

vim のファイル文字コード指定


色々なサーバでVIMを使っていると、一々.vimrcに文字コードの自動認識用の設定を書くのも面倒くさくなってきます。


そこで文字コードを指定してVIMを開く方法を紹介します。

// SJISで開く
$ vim "+e ++enc=sjis ファイル名"
// または
$ vim "+e ++enc=cp932 ファイル名"

// EUC-JPで開く
$ vim "+e ++enc=euc-jp ファイル名"

// UTF-8で開く
$ vim "+e ++enc=utf-8 ファイル名"

リバースプロキシでサーバ移行。


あるWEBアプリケーションのサーバ移行を行うことになったので、長時間サーバを停止せずに移行を行う方法を考えていました。


通常サーバ移行を行う場合は、ネームサーバのZoneのAレコードを書きかえることになるのですが、

example.com A 111.111.111.111(移行前のサーバAのIPアドレス

example.com A 222.222.222.222(移行後のサーバBのIPアドレス
この設定が世界中に存在するDNSサーバ全てに浸透するまでには、結構な時間がかかります。(Zoneで設定しているTTLによります。)
つまり浸透するまでの間は、サーバAとサーバBのどちらに飛ぶかはクライアントが参照しているDNSサーバ次第で、データベースの同期やメールの受信が上手く行かない場合があるということです。


そこで何とかならないか考えた結果、データベースの同期については以下の3つを思いつきました。


1.データベースのリモート接続
あるタイミングで一瞬旧サーバデータベースを止めて、新サーバのデータベースと同期させます。
その後、旧サーバからデータベース接続する時は新サーバのデータベースへ接続するようにして、DNSを変更します。
条件
・両方のデータベースサーバアプリケーションがSSL通信に対応している事。
・WEBアプリケーション部分の改変は無く、ただ丸丸移行する場合に有効。
・データベース以外で同期を図らなければならないものが無い場合。(ローカルファイルをカウンタに使用している場合等)


2.www付き、www無しのURIのどちらか普段使用していない方を新サーバへ向ける。
WEBサイトでは(普通?)www付き、www無しどちらかを正式なURIとしていて、どちらかはあまり使われていません。
そこでexample.comをサーバA、www.example.comをサーバBとします。

example.com A 111.111.111.111
www A 222.222.222.222(もともとはwww CNAME example.comとなっていると思います)
こうしてwwwのDNSが浸透するのを待ちます。
そして移行時に一瞬旧サーバのデータベースを停止し、新サーバのデータベースと同期をさせて、
旧サーバに来たアクセスをすべて新サーバ(www付きのURI)へリダイレクトさせます。

旧サーバの.htaccess等:
RewriteEngine On
Redirect / []http://www.example.com[]
後はwww無しのDNSが完全に浸透したのを見計らって、旧サーバを閉鎖し、新サーバにwww付きで来たアクセスをwww無しにリライトするよう設定しましょう。

新サーバの.htaccess等:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule (.*) []http://example.com/$1[] [R=301,L]
条件
・www付き、www無しどちらかのURIが使用されていないこと。
SSLを使用していないこと。⇒どちらか一方のURIしか有効で無いから。


3.Apacheのリバースプロキシを使用


リバースプロキシは通常プロキシサーバへのアクセスをバックエンドの内部サーバに受け流す用途に使われるApacheなどのWEBサーバアプリケーションの拡張機能です。
今回はこれを使用して、旧サーバへのアクセスを新サーバに受け流すことでサーバ移行を実現したいと思います。


まず2と同じように移行時に一瞬旧サーバのデータベースを停止し、新サーバのデータベースと同期をさせます。
次に旧サーバにリバースプロキシの設定を行います。(ディストリビューションUbuntuです)

// 内部的にDNSを新サーバに向ける
$ sudo vim /etc/hosts
222.222.222.222 example.com

// リバースプロキシの設定
$ sudo vim /etc/apache2/sites-available/example

ServerName example.com
ServerAlias www.example.com
ProxyPass / []http://example.com/[]
ProxyPassReverse / []http://example.com/[]


ServerName example.com:443
ServerAlias www.example.com:443
SSLProxyEngine on
ProxyPass / []https://example.com/[]
ProxyPassReverse / []https://example.com/[]

(以下SSL設定のディレクティブ)

// プロキシサーバへのアクセス元ホスト制限を解除
$ sudo vim /etc/apache2/mods-available/proxy.conf

#AddDefaultCharset off
#Order deny,allow
Deny from all
#Allow from .example.com
↓のように変更
Allow from all

// mod_proxyを有効にする
$ sudo a2enmod proxy proxy_http

// example設定情報を有効にする
$ sudo a2ensite example

// Apache再起動
$ sudo apache2ctl graceful

これで、旧サーバにexample.comでアクセスが来た時は、新サーバへと受け流す事が可能です。
一つ注意したいのが、ProxyPass, ProxyPassReverseディレクティブに記述するURIの末尾にスラッシュ(/)を必ずつけることです。これを行わないと画像などコンテンツファイルで502 Proxy Errorが発生します。
また、移行前のサーバと移行先のサーバとの間にファイアーウォールがある場合はProxyPassディレクティブにkeepaliveオプションを付けて、

ProxyPass / []https://example.com/[] keepalive=On
としなければならない場合があります。
条件もmod_proxyさえ使用できればOKで他の方法に比べ縛りが無いので、最初に書いたサーバ移行についてはこの方法を使用する事にしました。


そしてPOP/SMTPの移行方法ですが、2通り考えました。
一つ目は新サーバに旧サーバと同じアカウントを用意し、使用者に移行完了までは両方ともメールクライアントに登録してもらうという(ごく一般的な?)方法。
二つ目は以下のような流れになります。

                                                                                                        • -

旧サーバ   新サーバ

                                                                                                        • -


xx@example.com → xx@example2.com
転送
↓転送

xx@example.com

                                                                                                        • -

つまり新サーバ内ではhosts等で設定した結果、間違いなくexample.comは自サーバを向いているという性質を利用したものです。
移行が完了した時点で、使用者にサーバ名(IPアドレス)・パスワードを送信します。


ただexample.comで使用していたアドレスが多くなればなるほど設定が大変になりますので、前者の方法の方がシンプルで良いと思います。
この方法はメール受信駆動で動くスクリプト用のアカウントなどに使用すると良いかもしれません。


他にもサーバ移行について良い方法があれば是非教えて下さい。


○参考
http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html

phpMyAdmin3のインストール


PHPで書かれたオープンソースMySQLサーバ管理ツール「phpMyAdmin」のバージョン3系をインストールします。


まずはダウンロードして設置します。

// インストールを行うディレクトリに移動
$ cd /var/www/default/public/

// ダウンロード
$ wget []http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-3.1.3.2-all-languages.tar.gz[]

// 展開
$ tar zxvf phpMyAdmin-3.1.3.2-all-languages.tar.gz

$ mv phpMyAdmin-3.1.3.2-all-languages/* ./phpMyAdmin

$ rm -rf phpMyAdmin-3.1.3.2-all-languages phpMyAdmin-3.1.3.2-all-languages.tar.gz

// 設定ファイルの設置
$ cp libraries/config.default.php config.inc.php

設定ファイルですが、
デフォルトのままだとCookie認証(MySQLユーザの名称とパスワードでログイン)です。
いちいちユーザ名とパスワードを入れるのが面倒くさい人は以下のように設定して下さい。

$ vim config.inc.php
// 168行目付近
$cfg['Servers'][$i]['auth_type'] = 'cookie';

$cfg['Servers'][$i]['auth_type'] = 'config';

$cfg['Servers'][$i]['user'] = '自動ログインを行うユーザ名'; // MySQLユーザ

$cfg['Servers'][$i]['password'] = '自動ログインを行うユーザのパスワード';

以上で設置完了です。
http://example.com/phpMyAdminにアクセスすればログイン画面(自動ログインを設定した場合はTOPページ)が表示されます。

PHPまわり


開発用のサーバでPHPまわりの設定をしました。


まず
LAMPスタックを導入してもPHPCLI環境や開発環境は入っていないので、インストールします。

$ apt-get install php5-cli php5-dev
そして/usr/lib/php5以下にPEAR,ZendFramework,Smarty,SimpleTestを設置します。
PEARの導入については以前の記事で書いたので特に書きません。
その他はどれもwgetで取得して展開するのみです。

$ cd /usr/lib/php5
// ZendFramework
$ sudo wget []http://framework.zend.com/releases/ZendFramework-1.7.8/ZendFramework-1.7.8-minimal.tar.gz[]
$ sudo tar zxvf ZendFramework-1.7.8-minimal.tar.gz
$ sudo mv ZendFramework-1.7.8-minimal/library/Zend ./
$ sudo rm -rf ZendFramework-1.7.8-minimal ZendFramework-1.7.8-minimal.tar.gz

// Smarty
$ sudo wget []http://www.smarty.net/do_download.php?download_file=Smarty-2.6.19.tar.gz[]
$ sudo tar zxvf Smarty-2.6.19.tar.gz
$ sudo mv Smarty-2.6.19/libs/ ./Smarty
$ sudo rm -rf Smarty-2.6.19 Smarty-2.6.19.tar.gz

// SimpleTest
$ sudo wget []http://nchc.dl.sourceforge.net/sourceforge/simpletest/simpletest_1.0.1.tar.gz[]
$ sudo tar zxvf simpletest_1.0.1.tar.gz
$ sudo rm -f simpletest_1.0.1.tar.gz

PHPのinclude_pathには/usr/lib/php5と/usr/lib/php5/PEAR/PEARを指定しておきます。

$ vim /etc/php5/apache2/php.ini(と /etc/php5/cli/php.ini)
// 487行目付近
include_path = ".:/usr/lib/php5:/usr/lib/php5/PEAR/PEAR"$
次にZendOptimizereAcceleratorをインストールします。


次にせっかくPHPの関数名が長いということもありvimに関数の補完を行うよう設定します。

// 関数辞書の生成
$ mkdir ~/.vim/dict
$ php -r '$f=get_defined_functions();echo join("\n",$f["internal"]);' \ | sudo sort > ~/.vim/dict/php_functions.dic

// vimへの登録
$ vim ~/.vimrc
// if has("autocmd")構文があればその前に記述する
autocmd FileType php :set dictionary+=~/.vim/dict/php_functions.dict
set complete+=k

これでPHPの関数がctrl + Pで補完されるようなりました。


※追記
VIMでオムニ補完という入力補完が行われるそうです。
どうやら/usr/share/vim/vimXX/autoload(XXはバージョン)以下にあるファイルを元に補完されるようです。
開発サーバの環境ではPHPRuby、HTML、CSSJavaScriptとかです。
C言語Pythonは文法のみ補完されて、関数が補完されないと思っていたら、
そのautoload/以下のファイルでC言語Python用のものを見ても関数定義が書かれていませんでした。
ここら辺はプラグインとかで拡張できるんだと思います。今度また調べます。

Ruby、Ruby on Rails、Passenger(mod_rails)


今回はRuby周りのセットアップについて書きます。


Rubyとはオブジェクト指向スクリプト言語の一種です。
文法がシンプルで平易な反面、強力なテキスト処理など便利さも兼ね備えた言語です。


Ruby on Rails(以降 rails)とはそのRubyで書かれたWEBアプリケーションフレームワークで、
圧倒的な開発効率を実現する、現在最も注目されているOSS開発プロジェクトの一つです。


そしてPassengerとは別名mod_rails、つまりrailsApache上で動かすApacheモジュールです。
railsは通常WEBrickと呼ばれるRubyで書かれたWEBサーバフレームワークを使用して起動します。
しかしRubyで書かれていることからも分かるように、
パフォーマンス面で問題があったり安定性に欠けていたりするのが実情です。
そこでこのPassengerを使ってrailsApacheでハンドリングする訳です。


まずRuby(と開発環境)、rails、gem(Ruby製のモジュール管理ツール)をインストールします。

$ sudo apt-get install ruby ruby-dev rubygems rails
次にRuby製のビルドツールrake(makeみたいのもの)をインストールします。

$ sudo gem install rake
でこのままPassengerもインストール・・と思ったら

$ sudo gem install passenger

ERROR: Error installing passenger:
ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb install passenger
creating Makefile
make
sh: make: not found
Gem files will remain installed in /var/lib/gems/1.8/gems/fastthread-1.0.7 for inspection

とエラーが出ました。。。
エラーを見る限りPassengerのインストール時に同時にインストールされるfastthreadのビルドに失敗しているみたいです。
そこで一度手動でビルドして、詳しいエラーを見てみようと。。

$ cd /var/lib/gems/1.8/gems/fastthread-1.0.7
$ sudo rake

rake aborted!
Could not find RubyGem echoe (>= 2.7.11)

どうやらechoeのバージョンが問題っぽい。なので、

$ sudo gem install echoe
これで再び

$ cd /var/lib/gems/1.8/gems/fastthread-1.0.7
$ sudo rake

rake aborted!
Command failed with status (1): [/usr/bin/ruby1.8 -Ilib:ext:bin:test "/usr/...]

またエラーが出ました。
トレースとかしてみて調べましたが、結局分からずでfastthreadによるエラーを色々ググってみたら
build-essentialとやらが無いとエラーが出るとかなんとかっていう一文を発見。早速

$ sudo apt-get install build-essential
そして

$ sudo rake
!成功 そして再び

$ sudo gem install passenger
無事インストール完了しました。
次にpassengerのApacheモジュールを組み込む部分をインストールします。

$ which passenger-install-apache2-module
で見つからなかったので探してみました。

$ sudo find / -name passenger-install-apache2-module
  /var/lib/gems/1.8/bin/passenger-install-apache2-module
パスが通っていなかっただけみたいなので

$ sudo /var/lib/gems/1.8/bin/passenger-install-apache2-module
これで後は依存関係にあるモジュールで怒られるくらいなのでaptなりyumなりでちゃちゃっと解消すれば
インストール完了!
Apache設定ファイルのVirtualHostディレクティブに、
インストール時に最後に出てくる記述例を参考に追記するとApache上でrailsが動くようになります。


久々に手間取ったインストールでしたが、なんとか無事終了しました。