ぱそくま ろご
Linux > nginx > nginxでFastCGIを使う

nginxでFastCGIを使う

nginxでFastCGI

nginxでFastCGIを使用するには、別途FCGIWrapというものをインストールする必要があります。これはアドオンではなく、単独で動くサービスです。 nginxはCGIをリクエストが来たら、FCGIWrapに処理を依頼し、結果をもらって、クライアントに返します。

*FastCGIとは?) 通常のCGIはクライアントからのリクエストを処理すると、プロセスが終了します。 FastCGIはリクエストされた処理が終了しても、プロセスを終了しません。よって、プロセスの起動と終了のコストを抑えます。

FCGIWrapのインストール

Debian系はapt-getでインストールすればOKですが、どうもredhat系にはパッケージが用意されていないようで、ソースからインストールする必要があります。

FCGIWrapのインストール - Debian系

[paso ~]sudo apt-get install fcgiwrap


FCGIWrapのインストール - redhat系

まずはソースのビルドツールをインストールします。

追加パッケージのリポジトリをインストール。(これがないとfcgi-develがインストール不可)
[paso ~]sudo yum install epel-release
base                 | 3.6 kB  00:00:00     
extras               | 3.4 kB  00:00:00     
.
[paso ~]sudo yum groupinstall "Development Tools" 開発ツール
Loaded plugins: fastestmirror, langpacks
base                 | 3.6 kB  00:00:00     
[paso ~]sudo yum install git-core autoconf libtool automake fcgi-devel
Loaded plugins: fastestmirror, langpacks
base                 | 3.6 kB  00:00:00     
extras               | 3.4 kB  00:00:00     
.
.

次にGitHubからFCGIWrapのソースを取得します。

例:FCGIWrapのソースを取得

[paso ~]cd /usr/local/src/
[paso ~]sudo git clone git://github.com/gnosek/fcgiwrap.git
Cloning into 'fcgiwrap'...
remote: Counting objects: 270, done.
remote: Total 270 (delta 0), reused 0 (delta 0), pack-reused 270
Receiving objects: 100% (270/270), 63.35 KiB | 0 bytes/s, done.
Resolving deltas: 100% (139/139), done.

fcgiwrap.gitというディレクトリができているので、そこに移動し、ビルドします。その後はクラスパスの通っている場所に移動。 (移動ではなくシンボリックリンクにするとかでもいいかも。)

例:FCGIWrapのビルド

[paso ~]cd /usr/local/src/fcgiwrap
[paso ~]sudo autoreconf -i
[paso ~]sudo ./configure
[paso ~]sudo make
[paso ~]sudo mv fcgiwrap /usr/local/bin

FCGIWrapのsystemdの設定

fcgiwrap.serviceを作るのもいいのですが、fcgiwrap.socketを使いましょう。 Debian系はインストール時にこれもインストールされますので、何もしなくてもOK。 redhat系は自作する必要があるので以下を参考にしてください。

例:/etc/systemd/system/sockets.target.wants/fcgiwrap.socket

[Unit]
Description=fcgiwrap Socket

[Socket]
ListenStream=/run/fcgiwrap.socket

[Install]
WantedBy=sockets.target

後は「sudo systemctl start fcgiwrap.socket」で動作させて、正しく動いてるか確認はしてください。

fcgiwrap.socketの動作確認

#まずはsystemctlでsocketが動作しているか確認
[paso ~]sudo systemctl status fcgiwrap.socket
● fcgiwrap.socket - fcgiwrap Socket
   Loaded: loaded (/lib/systemd/system/fcgiwrap.socket; enabled; vendor preset: enabled)
   Active: active (listening) since 水 2016-1-1 10:59:21 JST; 1s ago #activeであるか確認。
   Listen: /run/fcgiwrap.socket (Stream)
#次にnetstatを使ってunix socketがlistenされているか確認
[paso ~]netstat -a | grep fcgiwrap
unix  2      [ ACC ]     STREAM     LISTENING     12101    /run/fcgiwrap.socket

nginxの設定

最後にnginxの設定ファイルにfastcgiの設定を書きます。書き方はserverディレクティブにcgiを追加します。 修正対象のファイルは/etc/nginx/nginx.confまたは/etc/nginx/sites-available/defaultです。 ubuntuは/etc/nginx/sites-available/defaultになります。

例:/etc/nginx/sites-available/default

server {
    listen 80 default_server;
    listen [::]:80 default_server;
.
.
.
    #cgiの設定。locationディレクティブを追加。
    location ~ \.cgi$ {
          root           /var/www/cgi;              #CGIプログラムの置き場所
          fastcgi_pass   unix:/run/fcgiwrap.socket; #fastcgiはnetstatで調べたソケットを指定。
          include        fastcgi.conf;              #パラメタが設定されているファイルをインクルード
    }

最後に動作確認

最後にcgiを作成して動作するか確認します。以下のファイルを作成してください。

例:/var/www/cgi/test.cgi

[paso ~]sudo vi /var/www/cgi/test.cgi
#!/usr/bin/python

print "Content-Type: text/html\n"
print "<html>"
print "<head>"
print "<title>cgi sample</title>"
print "</head>"
print "<body>"
print "<p>cgi exex success</p>"
print "</body>"
print "</html>"
[paso ~]sudo chown www-data:www-data test.cgi
[paso ~]sudo chmod u+x test.cgi

これで、http://xxxxxx/test.cgiを閲覧してください。正常に表示されるはずです。