はじめに
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
を実行して、バージョン情報が表示されれば、ようやくインストール成功。
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
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_wsgi で WSGI アプリを動かせたことになる。
ベンチマークをとってみる
さくら 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 |
アプリやライブラリの設定
/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 でのベンチマークと比較して下そう。