CentOS5.2 + nginx0.6.x + WSGI + Python2.5.x環境の構築方法



Debianでnginx+wsgiの環境構築は行ったのですが、
今回DB2をインストールした環境にwebサーバも
相乗りしたかったので、CentOS上にnginxを
インストールしてみます。

nginxの最新版は
http://sysoev.ru/nginx/download.html

Текущие версии:
(現在のバージョン)

Стабильные версии:
(安定バージョン)

Устаревшие стабильные версии:
(旧版のリリース)

※初めてGoogleのロシア語の翻訳を使いました。

ということで、安定バージョンの0.6.34を使用することにします。


また、後日記載しますがわけあってPython2.5.xで
環境を構築する必用があります。
CentOS5.2に標準インストールされているPythonは2.4系
なので、ソースをダウンロードしコンパイルします。


■Python2.5.4のインストール


#gccを入れていない場合は、インストールしておく
#yum install gcc

#Python2.5.4のソースを取得
#cd /usr/local/src/
#wget http://python.org/ftp/python/2.5.4/Python-2.5.4.tgz
#tar zxvf Python-2.5.4.tgz
#cd Python-2.5.4

#--enable-sharedオプションをつけてconfigure
#こうしないと、ライブラリが作成されず、mod_wsgiの
#ビルドが行えません。
#./configure --enable-shared

#後はお決まりのmake,make install
#make
#make install


pythonを起動しようとすると、


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


というエラーが表示されます。

これに対処するため、


#vi /etc/ld.so.conf.d/python-2.5.4.conf
/usr/local/lib

#設定を反映
#ldconfig


こうしてやると、libpython2.5をロードできるようになり、
ちゃんと実行できます。

ここを参考にさせていただきました。
http://dogyear2nd.blog10.fc2.com/blog-entry-27.html

注意点として、Pythonのzlibオプションはこの時点では
有効にしないでください。

この後行うmod_wsgiのビルドが


checking for wsgi ... not found
./configure: error: the WSGI addon requires Python library.


というエラーと共に失敗します。

エラーの内容は


/usr/local/lib/libpython2.5.so: undefined reference to `inflateEnd'


と出力されるので、ビルド時zlibモジュールの参照が上手く
行えないのだと思うのですが・・・解決できませんでした。

どなたか、解決方法をご存知の方いらっしゃいましたら教えてください。。



■nginxとmod_wsgiのインストール

まずは、必用なライブラリのインストール


#yum install pcre-devel
#yum install openssl-devel
#yum install zlib-devel



ソースコードのダウンロード

#cd /usr/local/src
#wget http://sysoev.ru/nginx/nginx-0.6.34.tar.gz
#wget http://hg.mperillo.ath.cx/nginx/mod_wsgi/archive/tip.tar.gz

#tar zxvf nginx-0.6.34.tar.gz
#tar zxvf mod_wsgi-8994b058d2db.tar.gz

リネーム
#mv mod_wsgi-8994b058d2db mod_wsgi


このままだとビルドエラーになるので、ソースを修正します


#vi mod_wsgi/src/ngx_http_wsgi_handler.c

/* 74行目付近 */
if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_HEAD) {
  /* XXX not sure */
  rc = ngx_http_discard_body(r);


これを


if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_HEAD) {
  /* XXX not sure */
  /* rc = ngx_http_discard_body(r); */
  rc = ngx_http_discard_request_body(r);



nginxのビルドを実行します。


#cd nginx-0.6.34
#./configure --add-module=/usr/local/src/mod_wsgi/ --sbin-path=/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module --with-md5=auto/lib/md5 --with-sha1=auto/lib/sha1




■Pylonsのインストール

mod_wsgiはPython2.5.4のzlibを有効にしているとビルドに
失敗しますが、easy_installはeggを解凍するときzlibが必須です。

本当は、mod_wsgiをビルドする方法を見直す方が有効だと
わかってはいるのですが・・・力尽きました。

ジレンマを解消するため、

・nginx+mod_wsgiインストールまではzlibを有効にしない。
・インストールが完了したら、zlibを有効にして再インストール
という力技を行うことにします。


makeの設定を変更
#cd /usr/local/src/Python-2.5.4
#vi Modules/Setup
この行のコメントをはずす
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

#make
#make install


次にeasy_install、Pylonsを入れます。


#wget http://peak.telecommunity.com/dist/ez_setup.py
#python ez_setup.py
#easy_install Pylons==0.9.6.2


後はDebianで試したときと同様の手順で動作を
確認しました。

次回は、PythonからDB2への接続にチャレンジです。



もどる