spawn-fcgiを使って、nginx + Tokyo Promenade (FastCGI動作)のテストを試みる

Tokyo Promenadeが0.9.16でFastCGI動作に対応したので、やっぱりnginxで、と思って再度挑戦です。

方式としては、nginxの他に、Lighttpdから個別のプロジェクトに分割されたspawn-fcgiを使ってみることにします。つまり、イメージとしては、nginxがフロントでTokyo Promenadeだけはspawn-fcgiで動いていて、promenade.fcgiへのアクセスはnginxがそっちにパスするような構成ですね。

さて、まとめ記事にある通りに、Tokyo CabinetとTokyo Promenadeはビルドを済ませてから、その他をビルドしていきます。

spawn-fcgiのredmineのプロジェクトページによると、最新版は、1.6.3のようなので、以下のようにします。
% cd /home/ユーザ名/適当な作業用ディレクトリ
% wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
% tar zxvf spawn-fcgi-1.6.3.tar.gz
% cd spawn-fcgi-1.6.3/
% ./configure
% make
% sudo paco -D make install

今回はエラーが出なかったが、この前に一度lighttpdをSynpaticから入れていたためかも知れません。不足するパッケージがある場合は、適宜落として来る必要があるでしょう。

そして、nginxもインストールする。ビルド類はこれで一旦終わりのはずです。
まず、libpcreが必要なので、Synapticからlibpcre3-dev(と、依存しているlibpcrecpp0)及び、libssl-devを導入しておくこと。今回は導入済だったりしますが。

% cd /home/ユーザ名/適当な作業用ディレクトリ
% wget http://sysoev.ru/nginx/nginx-0.7.63.tar.gz
% tar zxvf nginx-0.7.63.tar.gz
% cd nginx-0.7.63.tar.gz/
% ./configure

これで、以下のような結果になるはずです。
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ md5: using system crypto library
+ sha1 library is not used
+ using system zlib library

この際、これでmakeは通りそうなのでよしとします(多分、テスト環境なのでSSL使わないと思いますし)。続いて、
% make
% sudo paco -D make install

を実施して、paco -aでnginx, spawn-fcgi, tokyopromenade, tokyocabinetがmake installされていることを確認します。これからが、どうも自信のない設定作業になります。

まず、nginxのサービス(daemon)起動用のアカウント(正確にはワーカープロセス用アカウント)を以下のような形で作成します(shellなし、ホームディレクトリなし)。
% sudo groupadd www
% sudo useradd -r -g www -s /bin/false -d /nonexistent www

コンテンツを置くフォルダと、ついでにアクセス・エラーログ用のフォルダも作っておきます。
% mkdir /home/testuser/www
% mkdir /home/testuser/www_log

ここで、作成したディレクトリにTokyo Promenadeを持ってきます。
まず、カレントディレクトリを移動します。
% cd /home/testuser/www/

そこに持ってきます。
% cp /usr/local/libexec/promenade.fcgi .
% cp /usr/local/share/tokyopromenade/promenade.* .
% cp /usr/local/share/tokyopromenade/passwd.txt .

記事格納のためのデータベースを作成します。
% prommgr create promenade.tct

そして、ヘルプの文書をインポートします。
% prommgr import promenade.tct /usr/local/share/tokyopromenade/misc/help-*.tpw

ファイルアップロード用のディレクトリを作ります。
% mkdir upload

ログフォルダと、CGI置き場のファイルとフォルダのユーザを変えておきます。
% sudo chown -R www:www /home/testuser/www_log
% sudo chown -R www:www /home/testuser/www

続いて、/usr/local/nginx/conf/nginx.confを編集します。sudo viしたり、sudo nanoだったり……まあなんでもいいですが、とにかく権限がないのでsudoで編集するのを忘れないようにしたいところです。

先頭の方では3カ所変えました。
user www www;
worker_processes 2; #これは自分の環境ではこんなところかなーという数値です。別にテスト環境なので1でもかまいませんが。
error_log /home/testuser/www_log/nginx-error.log;

server{}ブロック……これはディレクティブと呼ぶのかなあ……では、以下を変更しています。
access_log /home/testuser/www_log/nginx-access.log

location / {}のところで、以下の通り。
root /home/testuser/www;
index promenade.fcgi;

“redirect server error pages to the static page /50x.html”のところはlocation{}も併せて#で全てコメントアウト。

逆に”pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000″のところはlocation{}を以下のように編集。
location ~ promenade\.fcgi$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index promenade.fcgi;
fastcgi_param SCRIPT_FILENAME /home/testuser/www$fastcgi_script_name;
include fastcgi_params;
}

編集ミスがないか、構文チェック。
% sudo /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

とりあえずの動作確認ということで、次のようにします。複数タブを使うか、bashなら末尾の&やbg/fgでのバックグラウンドジョブを活用してください。(-nを付けずに起動して後でプロセスをkillしてもいいですが、逆に少し面倒かと)
% sudo /usr/local/bin/spawn-fcgi -d /home/testuser/www -u www -g www -f /home/testuser/www/promenade.fcgi -p 9000 -n
% netstat -antp
:9000で受付中のプロセスが、promenade.fcgiであればOKです。ターミナルの横幅が狭いと表示されませんが。

続いて、nginxを起動します。
% sudo /usr/local/nginx/sbin/nginx
% ps aux | grep nginx
mainとworkerのプロセスがそれぞれ立ち上がっていればOKです。(netstat -antpすると:80が空いているのも確認できるはずです)

さて。ブラウザでhttp://localhost/にアクセスしてみましょう。
ううーん。一見うまく行っているのですが、HelpやLoginのリンクを押しても、うまく……というかちゃんと動かないですねえ。(しょんぼり)

(続く……といいな)




4 Comments

Sadayuki2009-11-03 at 15:12

家で実験中の環境も同じ状態です。?から後ろが渡ってない感じです。

typocoder2009-11-03 at 20:49

試しにnginxに変えて、lighttpd + spawn-fcgiで、lighttpdのconfにfastcgi.serverを書いて繋げてみたところ、あっさり動きました。
nginxの使い方の問題っぽいんですけど、よく分からないですね……。

kwj2009-11-20 at 17:20

Ubuntu 9.10/amd64 の nginx + spawn-fcgi で同様の症状に遭遇しました。挙動と Tokyo Promenade 0.9.17(以下 TP)のソースと nginx のログをにらめっこし、悪いのは nginx でしたが TP にパッチを当てて逃げました。
具体的には、nginx は “fastcgi_param CONTENT_LENGTH $content_length;” があると HTTP GET でも CONTENT_LENGTH を FastCGI 側に渡しているようで、さらに TP は CONTENT_LENGTH が存在すると GET の ? から後ろの部分(QUERY_STRING)を解釈しないロジックになっていました。nginx の設定で何とかなるか?、とドキュメントを読んでみたものの見つけられなかったので、下記パッチで逃げた次第です。

— promenade.c.orig Mon Nov 2 01:48:57 2009
+++ promenade.c Thu Nov 19 00:05:29 2009
@@ -331,7 +331,7 @@
// read query parameters
rp = getenv(“CONTENT_LENGTH”);
bool post = false;
- if(rp){
+ if(rp && *rp != ”){
int clen = tcatoi(rp);
if(clen > g_recvmax){
showerror(413, “The entity body was too long.”);

nginx は初めて触ったので実はまともな設定が存在するのかもしれませんが、ご参考まで。

kwj2009-11-20 at 17:28

失礼、肝心の文字がエスケープで消えてしまったようです。
if の条件部は rp && *rp != ‘¥0’ です<半角に修正してください。

コメントを記入する

コメント

Additional comments powered by BackType