さくら VPS 1G の CentOS に Nginx + Gunicorn 環境を構築してベンチマークとってみた

はじめに

前々回、前回と、Apache + mod_wsgiApache + Gunicorn のベンチマークをとってみた。

ここまでは前哨戦。次がメイン。最近多く採用されている、 Nginx + Gunicorn の構成でベンチマークをとってみたいと思う。

nginx をインストール

Yum リポジトリにパッケージがあったので、それを利用する。バージョンは 1.0.14。

sudo yum install -y nginx

nginx の設定

Vim で /etc/nginx/nginx.conf を編集する。

worker_processes  5;

...

http {
    ...

    keepalive_timeout 0;

    ...
}

Worker プロセス数を 5 に増やした。あと、Apache でベンチとったとき無効にしてたので、Nginx でも KeepAlive を無効にした。

次に Vim で /etc/nginx/conf/default.conf を編集する。

server {
    ...

    location /gunicorn {
        proxy_pass http://127.0.0.1:8000;
    }
}

Gunicorn で動かしている Web アプリにリクエストを渡すようにしている。

Gunicorn をデーモンで実行

Apache + Gunicorn のとき使った hello.py を今回も使うことにする。

sudo gunicorn -w 60 -D hello:application

Worker 数を 60 にしている。

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

同時接続数50固定でリクエスト数を増やしてテスト
リクエスト数 リクエスト/秒
1000 38.70
2000 41.46
4000 41.59
6000 42.25
8000 42.56
10000 42.69
リクエスト数1000固定で同時接続数を増やしてテスト
同時接続数 リクエスト/秒
10 37.98
50 40.51
100 38.07
150 37.25
200 37.42
300 36.93
400 37.65
メモリ使用量をチェック
             total       used       free     shared    buffers     cached
Mem:       1020688     625440     395248          0      49140     298396
-/+ buffers/cache:     277904     742784
Swap:      2096472          0    2096472
[nakamura@www8238ue]/etc/nginx/conf.d%

まとめ

Apache + Gunicorn と比べて、ベンチマークの結果は…たいして変わってないな。メモリ使用量は 200MB ほど少なかった。200MBって結構差が出たな。Nginx の方が Apache よりメモリ使用量が少ない、というのを実感した。Web サービスは、Nginx + Gunicorn の構成で行こうと思う。

あと、ベンチマークは今回で一区切りにしておく。Nginx にも mod_wsgi はあるけど、リポジトリを見た感じだと、だいぶ更新されていないみたいだった。1.0.14 では動かなさそう。Nginx をコンパイルし直す必要もあるのでやめておく。

さくら VPS 1G の CentOS で Apache + gunicorn のベンチマークをとってみた

はじめに

前回、さくら VPS 1G の CentOSApache と mod_wsgi をインストールしてベンチマークをとってみた。

いろいろな構成でベンチマークをとらないと、インフラ経験ゼロな自分にはどの構成が一番いいのか判断つかないので、次は Apache と gunicorn を組み合わせてみることにした。

gunicorn をインストール

sudo pip install gunicorn

WSGI アプリの作成

gunicorn で動かす Web アプリは、mod_wsgi のとき使ったものを流用する。ただ、gunicorn で動かすには Python パッケージじゃないとダメなので、/var/www に hello ディレクトリを作成し、そこに配置しておく。

sudo mkdir /var/www/hello
cd /var/www/hello
sudo vim hello.py

hello.py は前回と同じ。Hello world を表示するだけ。

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

gunicorn の起動

ワーカー数を 60 に指定。デーモンとして実行する。

cd /var/www/hello
sudo gunnicorn -w 60 -D hello:application

ちなみに、デーモンとして実行している gunicorn を終了したいときは

kill <gunicornの親プロセスID>

を実行すればいい。

Apache の設定

/etc/httpd/conf/httpd.conf は前回のものをベースに*1、mod_proxy で gunicorn にリクエストを流すように設定する。

ProxyPass /gunicorn http://localhost:8000

あと、mod_wsgi を読み込まないようにしておく。
設定ファイルを保存したら Apache を再起動。

sudo /etc/init.d/httpd restart

curl で gunicorn にリクエストを流せているか確認する。

curl http://<IP アドレス>/gunicorn

Hello world! が表示されたので、上手くいったみたいだ。

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

Apache Bench を使って、Apache + gunicorn でもベンチマークをとってみる。gunicorn のバージョンは 0.14.2。

同時接続数50固定でリクエスト数を増やしてテスト
リクエスト数 リクエスト/秒
1000 39.51
2000 41.34
4000 42.54
6000 42.77
8000 43.14
10000 43.08
リクエスト数1000固定で同時接続数を増やしてテスト
同時接続数 リクエスト/秒
10 38.59
50 39.53
100 39.08
150 38.92
200 36.67
300 34.66
400 38.30
ベンチマーク後のメモリ使用量
             total       used       free     shared    buffers     cached
Mem:       1020688     816212     204476          0      35504     132152
-/+ buffers/cache:     648556     372132
Swap:      2096472        788    2095684

まとめ

Apache + gunicorn でベンチマークをとってみたけど、mod_wsgi のときと比べて、結果はほとんど変わらなかった。Apache と gunicorn を同じマシン上で動かしているからで、別マシンだと違ってくるんだろう。

Apache + mod_wsgi はアプリケーションサーバーで、Apache + gunicorn はリバースプロキシ+アプリケーションサーバーなので、比較対象としてはふさわしくない気もするけど。

メモリ使用量は、mod_wsgi に比べて 30MB ほど増えている。ということは、メモリの大部分は Apache が喰っていることになる。Apache + mod_wsgi で 700MB ほど使っていたことを考えると、アプリケーションサーバーは gunicorn の方がメモリがはるかに少なく済みそうだな。

*1:つまり初期設定のまま

さくら 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 でのベンチマークと比較して下そう。

さくら VPS 1G の CentOS で行った設定手順メモ

はじめに

これからのエンジニアは、プログラミングだけでなくインフラのスキルも必要だと思っているけど、インフラの経験は皆無。このままではマズイ。ということで、インフラの勉強を決意。
サーバーを調達して、MySQLApache などのミドルウェアをインストールし、実際に Web アプリケーションを運用してみようと思う。

さくらの VPS(1GB) を申し込む

ルート権限が欲しいけど、サーバー用のマシンを調達するお金はない。そこでさくらの VPS に申し込むことにした。

1GB のプランで月980円。これなら自分の小遣いから十分払える。支払いはクレジットカードで。

さっそくセットアップ開始

OS は CentOS のままにしておく。カスタムインストールで他の OS に変更できるから、CentOS をいじり倒したら Ubuntu に変更するかもしれない。

作業は さくら VPS コントロールパネルのリモートコンソールで行う。

root のパスワードを変更

さくら VPS にサインアップしたら送られてくる仮登録メールに、root のパスワードが載っているので、まず root でログインする。

passwd

で root のパスワードを変更。

作業用アカウントを作成

useradd <username>

で作業用アカウントを作成。 は適当なものにしておく。

作成したアカウントは

passwd <username>

でパスワードを設定する。

作業用アカウントで sudo を使いたいので

usermod -G wheel <username>

を実行して wheel グループに追加する。

visudo

を実行し、

%wheel ALL=(ALL) ALL

コメントアウトを解除すれば、作業用アカウントで sudo が使えるようになる。

保存したら、作業用アカウントでログインし直す。

SSH でアクセスできるようにする

さくら VPS のコントロールパネルで作業するのは面倒なので、SSH クライアントを使って作業できるようにしたい。そこで SSH でログインできるように設定する。

クライアントマシンに PuTTY をインストール

クライアントマシンは Windows なので、SSH クライアントは定番の PuTTY を使う。

クライアントマシンで公開鍵を生成

PuTTY 付属の puttygen を使って RSA の秘密鍵と公開鍵を生成する。
画面に表示された鍵をコピーし、authorized_keys という名前で保存。

公開鍵をアップロード

生成した公開鍵を、PuTTY 付属の pscp を使ってサーバーにアップロードする。

pscp.exe -P 22 -pw <password> authorized_keys <username>@<host>:. 

作業用アカウントのホームディレクトリにアップロードされているから

mkdir .ssh
chmod 700 .ssh

mv authorized_keys .ssh/

cd .ssh
chmod 600 authorized_keys

を実行。

SSH の設定を変更
sudo vim /etc/ssh/sshd_config

で SSH の設定を開き、下記の部分を変更する。

Port 10022

PermitRootLogin without-password
PasswordAuthentication no

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

sshd を再起動。

sudo /etc/init.d/sshd restart

PuTTY でログインできるか確認。無事ログインできたら、以降の作業は PuTTY で行う。

CentOS のチューンアップ

メモリ使用量チェック
[<username>@<host> ~]$ free
             total       used       free     shared    buffers     cached
Mem:       1020688     419616     601072          0      42900     285768
-/+ buffers/cache:      90948     929740
Swap:      2096472          0    2096472

既に 400MB 使っている。これだと Apache や MySQL を動かすには心もとない気がする。不要なデーモンを止めて、使用メモリを減らしたほうがよさそうだ。

不要なデーモンを止める

を参考に

sudo chkconfig auditd off
sudo chkconfig haldaemon off
sudo chkconfig lvm2-monitor off
sudo chkconfig mdmonitor off
sudo chkconfig netfs off
sudo chkconfig restorecond off
sudo chkconfig smartd off

を実行。

selinux を無効にする
sudo vim /etc/sysconfig/selinux

で設定ファイルを開いて、

SELINUX=disabled

に書き変え…ようと思ったら、さくら VPS では最初から無効になっていた。

再びメモリ使用量チェック

サーバーを再起動し、チューンアップ後のメモリ使用量を見てみる。

[<username>@<host> ~]$ free
             total       used       free     shared    buffers     cached
Mem:       1020688     110800     909888          0      27360      27152
-/+ buffers/cache:      56288     964400
Swap:      2096472          0    2096472

300MB ほど削減されていた。さくら VPS の CentOS では最初から selinux が無効だったので、デーモンが結構メモリを食っていたみたいだ。

アプリケーションをインストール

vim はプリインストールされていたから、あと zsh と screen をインストールする。

sudo yum install -y screen
sudo yum install -y zsh
chsh -s /bin/zsh <username>

ひとまず CentOS のセットアップは完了

疲れた…。これだけで何時間かかったことか。特に SSH まわりは嵌った。
一区切りついたので、今回はここまでにしておく。MySQL や Apache や Python は後でインストールしよう。