NAOのnginxでc++で作成したcgiを動かす

NAOの内蔵ウェッブサーバーのnginxでC++で作成した実行ファイルをCGIとして動かす手続きが理解できたので、メモがわりに書いておく。

(1)ヴァーチャルなNAOであるopen-naoにlibfcgiの一連のツールをインストールする。(open-naoについては、aldebaranのサイトにインストールに仕方があるので省略)私は、libfcgi-master.zipをとってきて、
./configure
make
sudo make install
で、インストールしたが、他にもfastcgi++-2.1.tar.bz2なんかでもできそうだがやっていない。
(2)spawn-fcgi-1.6.4.tar.gzを取ってきて、
./configure
make
する。私は、ubuntuの32ビット版の方でやってしまったが、open-naoの方でもできると思う。インストールしなくてもよい。
srcフォルダにspawn-fcgiができているので、そのまま、open-naoに持ってきた。open-naoで作ったら当然、そのままでいい。
このspawnは、c++で作成した実行ファイルを、nginxからのリクエストに応じて、実行させるための媒体のようなものだ。
(3)open-nao上で実行ファイルを作成する。(32ビット版だからといって、ubuntuで作ると、libcのバージョン違いで失敗してしまった)
この辺りのことは、
http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/
に決定的に依存している。このページがなかったら、nginxでfastcgiを動かすイメージが、全く湧かなかったと思う。とても優れたページだ。
そこにサンプルがあるから、open-nao上で、nanoエディタで作成してコンパイルすると良い。なにしろ、open-naoには、開発環境が一通り揃っているし、ロボットと同じ実行環境が約束されている。なお、open-naoとPCとのファイルの転送は、psftpを使う必要がある。
(4)つぎに、naoのnginxの設定ファイルをいじる。設定ファイルは、/etc/nginxの中の、nginx.confに書かれている。(万が一のため、オリジナルのnginx.confをnginx.conf.orgなどにコピーしておく)
設定ファイルのなかに、次の行を加える。
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:8000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

この意味は、cgiという拡張子がついたファイルへのアクセスは、ローカルの8000版ポートで待機している実行ファイルを起動させることにする、というものだ。
(5)ロボット内でnginxを再起動する。
/etc/init.d/nginx restart
でよい。エラーがなければ問題ない。
(6)次に、(1)で作成したライブラリの/usr/local/lib以下にある、libfcgiで始まるファイルを全部zipなどでアーカイブして、nao本体に送り込む。そして、/usr/local/lib以下に同じように解凍する。その際、シンボリックリンクが壊れているので、もとの、open-naoの/usr/local/lib以下でのシンボリックをそのまま再現する。
(7)c++で作成したcgiの実行ファイル、例えば、foobar.cgiを
spawn-fcgi -p 8000 -n foobar.cgi
と立ち上げる。
(8)ロボットの外から、アクセスすれば、foobar.cgiが実行される。たとえば、上記のサイトにあるように、curlを使えば、

> curl -d "Chris" http://localhost/foobar
<html>
  <head>
    <title>Hello, world!</title>
  </head>
  <body>
    <h1>Hello Chris from /foobar !</h1>
  </body>
</html>

という感じで出力される。