LAMPのバージョンを確認するコマンド
Linuxカーネル
Linuxディストリビューション
$ uname -a
Linux serverx 2.6.27-7-server #1 SMP Fri Oct 24 07:37:55 UTC 2008 i686 GNU/Linux
Apache
// 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
// 未確認
PHP
// apachectl または apache2ctl
$ apache2ctl -v
Server version: Apache/2.2.9 (Ubuntu)
Server built: Sep 19 2008 13:43:21
Perl
$ 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
Python
$ perl -v
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
Ruby
$ python -V
Python 2.5.2
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Linuxでの32ビットと64ビットマシンの見分け方。
Linuxでの32ビットと64ビットマシンの見分け方を紹介します。
32ビットか64ビットかを見分けるにはCPUの情報とカーネルの情報が必要です。
まずはCPU。
flagsの値にlmがあれば、64ビットCPUです。
//マシンに搭載されているCPUの情報が表示されます。(マルチコアの場合はそれぞれのCPUの情報が表示されます)
$ cat /proc/cpuinfo
次にカーネル。
X86_64とかamd64とかが表示されたら、64ビット版のカーネルです。
// 稼働中のカーネルについての名前と情報が表示されます。
$ uname -a
64ビットCPU上で、64ビット版カーネルが稼働している時が64ビットマシンです。
リバースプロキシでサーバ移行。
あるWEBアプリケーションのサーバ移行を行うことになったので、長時間サーバを停止せずに移行を行う方法を考えていました。
通常サーバ移行を行う場合は、ネームサーバのZoneのAレコードを書きかえることになるのですが、
この設定が世界中に存在するDNSサーバ全てに浸透するまでには、結構な時間がかかります。(Zoneで設定しているTTLによります。)
example.com A 111.111.111.111(移行前のサーバAのIPアドレス)
↓
example.com A 222.222.222.222(移行後のサーバBのIPアドレス)
つまり浸透するまでの間は、サーバAとサーバBのどちらに飛ぶかはクライアントが参照しているDNSサーバ次第で、データベースの同期やメールの受信が上手く行かない場合があるということです。
そこで何とかならないか考えた結果、データベースの同期については以下の3つを思いつきました。
1.データベースのリモート接続
あるタイミングで一瞬旧サーバデータベースを止めて、新サーバのデータベースと同期させます。
その後、旧サーバからデータベース接続する時は新サーバのデータベースへ接続するようにして、DNSを変更します。
条件
・両方のデータベースサーバアプリケーションがSSL通信に対応している事。
・WEBアプリケーション部分の改変は無く、ただ丸丸移行する場合に有効。
・データベース以外で同期を図らなければならないものが無い場合。(ローカルファイルをカウンタに使用している場合等)
2.www付き、www無しのURIのどちらか普段使用していない方を新サーバへ向ける。
WEBサイトでは(普通?)www付き、www無しどちらかを正式なURIとしていて、どちらかはあまり使われていません。
そこでexample.comをサーバA、www.example.comをサーバBとします。
こうしてwwwのDNSが浸透するのを待ちます。
example.com A 111.111.111.111
www A 222.222.222.222(もともとはwww CNAME example.comとなっていると思います)
そして移行時に一瞬旧サーバのデータベースを停止し、新サーバのデータベースと同期をさせて、
旧サーバに来たアクセスをすべて新サーバ(www付きのURI)へリダイレクトさせます。
後はwww無しのDNSが完全に浸透したのを見計らって、旧サーバを閉鎖し、新サーバにwww付きで来たアクセスをwww無しにリライトするよう設定しましょう。
旧サーバの.htaccess等:
RewriteEngine On
Redirect / []http://www.example.com[]
条件
新サーバの.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です)
これで、旧サーバにexample.comでアクセスが来た時は、新サーバへと受け流す事が可能です。
// 内部的に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
一つ注意したいのが、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スタックを導入してもPHPのCLI環境や開発環境は入っていないので、インストールします。
そして/usr/lib/php5以下にPEAR,ZendFramework,Smarty,SimpleTestを設置します。
$ apt-get install php5-cli php5-dev
PEARの導入については以前の記事で書いたので特に書きません。
その他はどれもwgetで取得して展開するのみです。
PHPのinclude_pathには/usr/lib/php5と/usr/lib/php5/PEAR/PEARを指定しておきます。
$ 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
次にZendOptimizerとeAcceleratorをインストールします。
$ vim /etc/php5/apache2/php.ini(と /etc/php5/cli/php.ini)
// 487行目付近
include_path = ".:/usr/lib/php5:/usr/lib/php5/PEAR/PEAR"$
次にせっかくPHPの関数名が長いということもありvimに関数の補完を行うよう設定します。
これでPHPの関数がctrl + Pで補完されるようなりました。
// 関数辞書の生成
$ 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
※追記
VIMは
どうやら/usr/share/vim/vimXX/autoload(XXはバージョン)以下にあるファイルを元に補完されるようです。
開発サーバの環境ではPHP、Ruby、HTML、CSS、JavaScriptとかです。
C言語やPythonは文法のみ補完されて、関数が補完されないと思っていたら、
そのautoload/以下のファイルでC言語やPython用のものを見ても関数定義が書かれていませんでした。
ここら辺はプラグインとかで拡張できるんだと思います。今度また調べます。
Ruby、Ruby on Rails、Passenger(mod_rails)
今回はRuby周りのセットアップについて書きます。
Rubyとはオブジェクト指向スクリプト言語の一種です。
文法がシンプルで平易な反面、強力なテキスト処理など便利さも兼ね備えた言語です。
Ruby on Rails(以降 rails)とはそのRubyで書かれたWEBアプリケーションフレームワークで、
圧倒的な開発効率を実現する、現在最も注目されているOSS開発プロジェクトの一つです。
そしてPassengerとは別名mod_rails、つまりrailsをApache上で動かすApacheモジュールです。
railsは通常WEBrickと呼ばれるRubyで書かれたWEBサーバフレームワークを使用して起動します。
しかしRubyで書かれていることからも分かるように、
パフォーマンス面で問題があったり安定性に欠けていたりするのが実情です。
そこでこのPassengerを使ってrailsをApacheでハンドリングする訳です。
まずRuby(と開発環境)、rails、gem(Ruby製のモジュール管理ツール)をインストールします。
次にRuby製のビルドツールrake(makeみたいのもの)をインストールします。
$ sudo apt-get install ruby ruby-dev rubygems rails
でこのままPassengerもインストール・・と思ったら
$ sudo gem install rake
とエラーが出ました。。。
$ sudo gem install passengerERROR: 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のビルドに失敗しているみたいです。
そこで一度手動でビルドして、詳しいエラーを見てみようと。。
どうやらechoeのバージョンが問題っぽい。なので、
$ cd /var/lib/gems/1.8/gems/fastthread-1.0.7
$ sudo rakerake aborted!
Could not find RubyGem echoe (>= 2.7.11)
これで再び
$ sudo gem install echoe
またエラーが出ました。
$ cd /var/lib/gems/1.8/gems/fastthread-1.0.7
$ sudo rakerake 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
これで後は依存関係にあるモジュールで怒られるくらいなのでaptなりyumなりでちゃちゃっと解消すれば
$ sudo /var/lib/gems/1.8/bin/passenger-install-apache2-module
インストール完了!
Apache設定ファイルのVirtualHostディレクティブに、
インストール時に最後に出てくる記述例を参考に追記するとApache上でrailsが動くようになります。
久々に手間取ったインストールでしたが、なんとか無事終了しました。