読者です 読者をやめる 読者になる 読者になる

さくら VPS 1G の CentOS に Python と Apache と mod_wsgi をインストールしてベンチマークとってみた

はじめに

Python2.7 で開発した Web サービスをホストする予定なので、CentOS に Python2.7 をインストールする。Web サービスを動かす構成としては nginx + gunicorn が流行りだけど、まずはド定番の Apache + mod_wsgi を試してみる。

Python2.7.3をインストール

Yum リポジトリに Python2.7 のパッケージは無さそうだったので、ソースコードをビルドしてインストールすることにした。

Python のコンパイルに必要なパッケージをインストール
sudo yum groupinstall -y "Development Tools"
sudo yum install -y zlib-devel ncurses-devel readline-devel sqlite-devel tcl-devel tk-devel openssl-devel
Pythonソースコードからインストール

mod_wsgi を使うので、configure 時に --enable-shared オプションを指定している。

wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
tar zvxf Python-2.7.3.tgz
cd Python-2.7.3
./configure --enable-shared --prefix=/opt/python2.7
make
sudo make install

無事インストール完了したら .zshrc に

export PYTHONHOME=/opt/python2.7
export PYTHONPATH=/opt/python2.7/lib/python2.7/site-packages/
export PATH=/opt/python2.7/bin:$PATH

を追加。

source ~/.zshrc

で設定の変更を反映し、

python --version

でバージョンを確認してみる。すると次のエラーが発生した。

python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

う〜ん…。libpython2.7.so.1.0 が見つからないみたいだ。シンボリックリンクを作成してみる。

sudo ln -s /opt/python2.7/lib/libpython2.7.so.1.0 /lib64/

もう一度

python --version

を実行して、バージョン情報が表示されれば、ようやくインストール成功。

Python での開発に必須のパッケージをインストール

distribute、pip、virtualenv をインストールする。

curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py

easy_install pip

pip install virtualenv

これで Python のセットアップ終了。

Apache をインストール

Apache は yum で一発

mod_wsgi をビルドするから、httpd-devel も一緒にインストールしておく。

yum install -y httpd
yum install -y httpd-devel
Apache を起動
sudo /etc/init.d/httpd start
Apache の自動起動も設定
sudo /sbin/chkconfig httpd on
Apache がちゃんと動いているか確認する
curl http://<IPアドレス>/

HTTP レスポンスが表示されたら OK。

mod_wsgi をインストール

ソースコードからインストールする
wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz
tar vzxf mod_wsgi-3.3.tar.gz
cd mod_wsgi-3.3
./configure --with-apxs=/usr/sbin/apxs --with-python=/opt/python2.7/bin/python2.7
make
sudo make install
mod_wsgi で動かすスクリプトを用意
sudo vim /var/www/cgi-bin/hello.py

を実行し

def application(environ, start_response):
    status = "200 OK"
    response_headers = [("Content-type", "text/plain")]
    start_response(status, response_headers)
    return ["Hello world!"]

を記述して保存する。

Apache の設定
sudo vim /etc/httpd/conf.d/mod_wsgi.conf

を実行して

LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome /opt/python2.7
WSGIPythonPath /opt/python2.7/lib/python2.7/site-packages
WSGIScriptAlias /hello /var/www/cgi-bin/hello.py

を記述して保存。

/usr/sbin/apachectl configtest

で設定ファイルが間違っていないかチェック。エラーが表示されたら修正すること。
問題がなければ

sudo /etc/init.d/httpd restart

で Apache を再起動する。

WSGI アプリをホストできているかチェック
curl http://<IP アドレス>/hello

を実行して、Hello world が表示されれば、Apache + mod_wsgiWSGI アプリを動かせたことになる。

ベンチマークをとってみる

さくら VPS 1G + CentOS + Apache + mod_wsgi の環境を構築したのでベンチをとってみる。測定には Apache Bench を使っている。このためだけに Apache を Windows に入れる、ていうのはイヤだけど仕方ない。

マシンのスペック

Web アプリを動かしている、さくら VPS 1G のスペックは下記ページから引用。

OS CentOS 6 x86_64
CPU 仮想2コア
メモリ 1GB

ベンチをとったマシンのスペックは次の通り。

OS Windows7 Home Premium
CPU Intel Core2 Duo 1.40 GHz
メモリ 4GB
アプリやライブラリ
Apache 2.2.15
Python 2.7.3
mod_wsgi 3.3
アプリやライブラリの設定

/etc/httpd/conf/httpd.conf は初期値のまま。同時接続数などの設定は下記のようになっていた。

KeepAlive Off
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
同時接続数50固定でリクエスト数を増やしてテスト
リクエスト数 リクエスト/秒
1000 38.99
2000 41.70
4000 42.74
6000 43.24
8000 43.48
10000 43.56
リクエスト数1000固定で同時接続数を増やしてテスト
同時接続数 リクエスト/秒
10 37.05
50 39.50
100 39.58
150 37.93
200 35.01
300 37.59
400 39.55
ベンチマーク終了後のメモリ使用量をチェック

同時接続数400、1000リクエスト後に free を実行してみた。

             total       used       free     shared    buffers     cached
Mem:       1020688     779176     241512          0      35852     134876
-/+ buffers/cache:     608448     412240
Swap:      2096472        788    2095684

まとめ

さくら VPS 1G の CentOS に Python2.7.3 と Apache と mod_wsgi をインストールし、ベンチマークをとってみた。Hello world を返すだけの単純な Web アプリだったので、今回の結果はあまり参考にならないかも。Apache + mod_wsgi の評価は、gunicorn や nginx でのベンチマークと比較して下そう。